# Copyright (C) 2011-2021 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Specialized subroutines for launching gdb and testing the very first prompt.


#
# start gdb -- start gdb running, prompt procedure
# this procedure differs from the default in that you must pass 'set height 0',
# and 'set width 0', yourself in GDBFLAGS, and it has a gdb_prompt_fail variable,
#
# uses pass if it sees $gdb_prompt, and fail if it sees $gdb_prompt_fail.
#
proc default_prompt_gdb_start { } {
    global GDB
    global INTERNAL_GDBFLAGS GDBFLAGS
    global gdb_prompt
    global gdb_prompt_fail
    global timeout
    global gdb_spawn_id

    verbose "Spawning $GDB $INTERNAL_GDBFLAGS $GDBFLAGS"

    if [info exists gdb_spawn_id] {
	return 0
    }

    if ![is_remote host] {
	if { [which $GDB] == 0 } then {
	    perror "$GDB does not exist."
	    exit 1
	}
    }
    set res [remote_spawn host "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS [host_info gdb_opts]"]
    if { $res < 0 || $res == "" } {
	perror "Spawning $GDB failed."
	return 1
    }
    gdb_expect 360 {
	-re ".*$gdb_prompt_fail.*$gdb_prompt_fail.*" {
	    fail "double prompted fail prompt"
	}
	-re ".*$gdb_prompt.*$gdb_prompt.*" {
	    fail "double prompted"
	}
	-re "\[\r\n\]$gdb_prompt_fail $" {
	    fail "GDB initializing first prompt"
	}
	-re "\[\r\n\]$gdb_prompt $" {
	    pass "GDB initializing first prompt"
	}
	-re "$gdb_prompt $"	{
	    perror "GDB never initialized."
	    return -1
	}
	-re "$gdb_prompt_fail $"	{
	    perror "GDB never initialized."
	    return -1
	}
	timeout	{
	    perror "(timeout) GDB never initialized after 10 seconds."
	    remote_close host
	    return -1
	}
    }
    set gdb_spawn_id $res
    return 0
}

#
# Overridable function. You can override this function in your
# baseboard file.
#
proc prompt_gdb_start { } {
    default_prompt_gdb_start
}

