Blame config/gdb_stub.exp

Packit 62fe53
# Copyright (C) 1992-2016 Free Software Foundation, Inc.
Packit 62fe53
#
Packit 62fe53
# This file is part of DejaGnu.
Packit 62fe53
#
Packit 62fe53
# DejaGnu is free software; you can redistribute it and/or modify it
Packit 62fe53
# under the terms of the GNU General Public License as published by
Packit 62fe53
# the Free Software Foundation; either version 3 of the License, or
Packit 62fe53
# (at your option) any later version.
Packit 62fe53
#
Packit 62fe53
# DejaGnu is distributed in the hope that it will be useful, but
Packit 62fe53
# WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 62fe53
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 62fe53
# General Public License for more details.
Packit 62fe53
#
Packit 62fe53
# You should have received a copy of the GNU General Public License
Packit 62fe53
# along with DejaGnu; if not, write to the Free Software Foundation,
Packit 62fe53
# Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Packit 62fe53
Packit 62fe53
# This file was written by Michael Snyder <msnyder@cygnus.com>.
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Stub remote run command.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc gdb_stub_init { dest args } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
    global GDB
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![info exists GDB]} then {
Packit 62fe53
	set GDB "[lookfor_file ${tool_root_dir} gdb/gdb]"
Packit 62fe53
	if { $GDB == "" } {
Packit 62fe53
	    set GDB [transform gdb]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists gdb_prompt]} {
Packit 62fe53
	set gdb_prompt [board_info $dest gdb_prompt]
Packit 62fe53
    } else {
Packit 62fe53
	set gdb_prompt "\\(gdb\\)"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    return 1
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_restart { dest } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
    global GDB
Packit 62fe53
Packit 62fe53
    gdb_stub_init $dest
Packit 62fe53
Packit 62fe53
    for { set x 1 } { $x < 4 } {incr x} {
Packit 62fe53
	remote_close $dest
Packit 62fe53
	sleep 2
Packit 62fe53
	set command "$GDB -nw -nx"
Packit 62fe53
	if {[host_info exists gdb_opts]} {
Packit 62fe53
	    append command " [host_info gdb_opts]"
Packit 62fe53
	}
Packit 62fe53
	set spawn_id [remote_spawn host $command]
Packit 62fe53
	remote_expect host 30 {
Packit 62fe53
	    -re "$gdb_prompt" { }
Packit 62fe53
	}
Packit 62fe53
	if { $spawn_id >= 0 } {
Packit 62fe53
	    if {[board_info $dest exists baud]} {
Packit 62fe53
		remote_send host "set remotebaud [board_info $dest baud]\n"
Packit 62fe53
		remote_expect host 5 {
Packit 62fe53
		    -re "$gdb_prompt" { }
Packit 62fe53
		    default {
Packit 62fe53
			warning "Error setting baud rate."
Packit 62fe53
			return -1
Packit 62fe53
		    }
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
Packit 62fe53
Packit 62fe53
	    set value [gdb_stub_startup $dest]
Packit 62fe53
	    if { $value > 0 } {
Packit 62fe53
		break
Packit 62fe53
	    }
Packit 62fe53
	    verbose "got $value from gdb_stub_startup"
Packit 62fe53
	    remote_send host "quit\n"
Packit 62fe53
	}
Packit 62fe53
	remote_reboot $dest
Packit 62fe53
    }
Packit 62fe53
    if { ${x} < 4 } {
Packit 62fe53
	global board_info
Packit 62fe53
	set name [board_info $dest name]
Packit 62fe53
Packit 62fe53
	set board_info($name,gdb_is_running) 1
Packit 62fe53
	return 1
Packit 62fe53
    } else {
Packit 62fe53
	return 0
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_remote_check { dest } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists gdb_serial]} {
Packit 62fe53
	set serial [board_info $dest gdb_serial]
Packit 62fe53
    } elseif {[board_info $dest exists serial]} {
Packit 62fe53
	set serial [board_info $dest serial]
Packit 62fe53
    } else {
Packit 62fe53
	set serial [board_info $dest netport]
Packit 62fe53
    }
Packit 62fe53
    remote_send host "target remote $serial\n"
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "Couldn't establish connection.*$gdb_prompt" {
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
	-re "Remote debugging.*$gdb_prompt" {
Packit 62fe53
	    verbose "stub is already running"
Packit 62fe53
	    return 1
Packit 62fe53
	}
Packit 62fe53
	-re "$gdb_prompt" {
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
	timeout {
Packit 62fe53
	    remote_send host "\003"
Packit 62fe53
	    remote_expect host 10 {
Packit 62fe53
		-re "$gdb_prompt" { }
Packit 62fe53
	    }
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
	default {
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_startup { dest } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
    global GDB
Packit 62fe53
Packit 62fe53
    set is_running_stub 0
Packit 62fe53
Packit 62fe53
    if {[gdb_stub_remote_check $dest]} {
Packit 62fe53
	set is_running_stub 1
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists serial]} {
Packit 62fe53
        set serial [board_info $dest serial]
Packit 62fe53
    } else {
Packit 62fe53
	set serial [board_info $dest netport]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { ! $is_running_stub } {
Packit 62fe53
	set command "target [board_info $dest gdb_protocol] $serial\n"
Packit 62fe53
	remote_send host $command
Packit 62fe53
	remote_expect host 5 {
Packit 62fe53
	    -re "already.*y or n." {
Packit 62fe53
		remote_send host "y\n"
Packit 62fe53
		exp_continue
Packit 62fe53
	    }
Packit 62fe53
	    -re "appears to be alive.*$gdb_prompt" { }
Packit 62fe53
	    -re "Remote target.*connected to.*$gdb_prompt" { }
Packit 62fe53
	    default {
Packit 62fe53
		return -1
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if { $is_running_stub == 0 } {
Packit 62fe53
	global libdir
Packit 62fe53
Packit 62fe53
	verbose "building loader"
Packit 62fe53
	set loader "loader"
Packit 62fe53
	if {![file exists $loader]} {
Packit 62fe53
	    if {[board_info $dest exists gdb_stub_offset]} {
Packit 62fe53
		set result [target_compile "${libdir}/stub-loader.c" $loader executable "libs=-Wl,-Ttext,[board_info $dest gdb_stub_offset]"]
Packit 62fe53
	    } else {
Packit 62fe53
		set result [target_compile "${libdir}/stub-loader.c" $loader executable "ldscript=[board_info $dest gdb_stub_ldscript]"]
Packit 62fe53
	    }
Packit 62fe53
	    verbose "result is $result"
Packit 62fe53
	    if {[is_remote host]} {
Packit 62fe53
		set loader [remote_download host $loader]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	remote_send host "file $loader\n"
Packit 62fe53
	remote_expect host 20 {
Packit 62fe53
	    -re "A program is being debug.*Kill it.*y or n. $" {
Packit 62fe53
		remote_send host "y\n"
Packit 62fe53
		exp_continue
Packit 62fe53
	    }
Packit 62fe53
	    -re "Load new symbol table.*y or n. $" {
Packit 62fe53
		remote_send host "y\n"
Packit 62fe53
		exp_continue
Packit 62fe53
	    }
Packit 62fe53
	    -re "Reading symbols from.*done..*$gdb_prompt $" {}
Packit 62fe53
	    -re "$gdb_prompt $" { warning "GDB couldn't find loader" }
Packit 62fe53
	    timeout {
Packit 62fe53
		warning "(timeout) read symbol file"
Packit 62fe53
		return -1
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if {[board_info $dest exists serial]} {
Packit 62fe53
	    set serial [board_info $dest serial]
Packit 62fe53
	} else {
Packit 62fe53
	    set serial [board_info $dest netport]
Packit 62fe53
	}
Packit 62fe53
	remote_send host "target [board_info $dest gdb_protocol] $serial\n"
Packit 62fe53
	remote_expect host 60 {
Packit 62fe53
	    -re "appears to be alive.*$gdb_prompt" { }
Packit 62fe53
	    -re "Remote target.*connected to.*$gdb_prompt" { }
Packit 62fe53
	    -re "$gdb_prompt" {
Packit 62fe53
		warning "Error reconnecting to stub."
Packit 62fe53
		return -1
Packit 62fe53
	    }
Packit 62fe53
	    default {
Packit 62fe53
		warning "Error reconnecting to stub."
Packit 62fe53
		return -1
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	# We only send the offset if gdb_load_offset is set. Otherwise, we
Packit 62fe53
	# assume that sending the offset isn't needed.
Packit 62fe53
	if {[board_info $dest exists gdb_load_offset]} {
Packit 62fe53
	    remote_send host "load $loader [board_info $dest gdb_stub_offset]\n"
Packit 62fe53
	} else {
Packit 62fe53
	    remote_send host "load $loader\n"
Packit 62fe53
	}
Packit 62fe53
	verbose "Loading $loader into $GDB" 2
Packit 62fe53
	global verbose
Packit 62fe53
	set no_run_command 0
Packit 62fe53
	# FIXME: The value 1200 below should be a parameter.
Packit 62fe53
	remote_expect host 1200 {
Packit 62fe53
	    -re "Transfer rate:.*Switching to remote protocol.*Remote debugging" {
Packit 62fe53
		set no_run_command 1
Packit 62fe53
		remote_send host "?"
Packit 62fe53
		sleep 2
Packit 62fe53
		remote_send host "?"
Packit 62fe53
		sleep 1
Packit 62fe53
	    }
Packit 62fe53
	    -re "Loading.*Starting.*at.*$gdb_prompt $" {
Packit 62fe53
		verbose "Loaded $loader into $GDB" 1
Packit 62fe53
		set no_run_command 1
Packit 62fe53
	    }
Packit 62fe53
	    -re "Loading.*$gdb_prompt $" {
Packit 62fe53
		verbose "Loaded $loader into $GDB" 1
Packit 62fe53
	    }
Packit 62fe53
	    -re "$gdb_prompt $"     {
Packit 62fe53
		if $verbose>1 then {
Packit 62fe53
		    warning "GDB couldn't load."
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	    timeout {
Packit 62fe53
		if $verbose>1 then {
Packit 62fe53
		    warning "Timed out trying to load $arg."
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { ! $no_run_command } {
Packit 62fe53
	    remote_send host "run\n"
Packit 62fe53
	    remote_expect host 60 {
Packit 62fe53
		-re "A program is being debug.*Kill it.*y or n. $" {
Packit 62fe53
		    remote_send host "y\n"
Packit 62fe53
		    exp_continue
Packit 62fe53
		}
Packit 62fe53
		-re "The program being debugged .*y or n. $" {
Packit 62fe53
		    remote_send host "y\n"
Packit 62fe53
		    exp_continue
Packit 62fe53
		}
Packit 62fe53
		-re "Starting program:.*loader.*$" {
Packit 62fe53
		    verbose "Starting loader succeeded"
Packit 62fe53
		}
Packit 62fe53
		timeout {
Packit 62fe53
		    warning "(timeout) starting the loader"
Packit 62fe53
		    return -1
Packit 62fe53
		}
Packit 62fe53
		default {
Packit 62fe53
		    warning "error starting the loader"
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	    sleep 2
Packit 62fe53
	    remote_send host "?"
Packit 62fe53
	    sleep 1
Packit 62fe53
	    remote_send host "?"
Packit 62fe53
	    verbose "Sent ^C^C"
Packit 62fe53
	    remote_expect host 30 {
Packit 62fe53
		-re "Give up .and stop debugging it.*$" {
Packit 62fe53
		    remote_send host "y\n"
Packit 62fe53
		    exp_continue
Packit 62fe53
		}
Packit 62fe53
		-re "$gdb_prompt $" {
Packit 62fe53
		    verbose "Running loader succeeded"
Packit 62fe53
		}
Packit 62fe53
		timeout {
Packit 62fe53
		    warning "(timeout) interrupting the loader"
Packit 62fe53
		    return -1
Packit 62fe53
		}
Packit 62fe53
		default {
Packit 62fe53
		    warning "error interrupting the loader"
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	remote_send host "quit\n"
Packit 62fe53
	return [gdb_stub_restart $dest]
Packit 62fe53
    }
Packit 62fe53
    return 1
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Delete all breakpoints and verify that they were deleted.  If anything
Packit 62fe53
# goes wrong we just exit.
Packit 62fe53
#
Packit 62fe53
proc gdb_stub_delete_breakpoints {} {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
Packit 62fe53
    remote_send host "delete breakpoints\n"
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "Delete all breakpoints.*y or n. $" {
Packit 62fe53
	    remote_send host "y\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
	-re "$gdb_prompt $" { }
Packit 62fe53
	timeout { warning "Delete all breakpoints (timeout)" ; return -1}
Packit 62fe53
    }
Packit 62fe53
    remote_send host "info breakpoints\n"
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "No breakpoints or watchpoints..*$gdb_prompt $" {}
Packit 62fe53
	-re "$gdb_prompt $" { warning "breakpoints not deleted" ; return -1}
Packit 62fe53
	timeout { warning "info breakpoints (timeout)" ; return -1}
Packit 62fe53
    }
Packit 62fe53
    return 0
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_go_idle { dest } {
Packit 62fe53
    gdb_stub_delete_breakpoints
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_add_breakpoint { function args } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
Packit 62fe53
    remote_send host "break $function\n"
Packit 62fe53
    remote_expect host 60 {
Packit 62fe53
	-re "Breakpoint (\[0-9\]+).*$gdb_prompt $" { return $expect_out(1,string) }
Packit 62fe53
	-re "Function.*not defined.*$gdb_prompt $" { return "undef" }
Packit 62fe53
	-re "No symbol table.*$gdb_prompt $" { return "undef" }
Packit 62fe53
	default {
Packit 62fe53
	    return "undef"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_start { dest } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
Packit 62fe53
    set exit_brnum [gdb_stub_add_breakpoint _exit]
Packit 62fe53
    if { $exit_brnum == "undef" || [board_info $dest exists always_break_exit] } {
Packit 62fe53
	set exit_brnum [gdb_stub_add_breakpoint exit]
Packit 62fe53
    }
Packit 62fe53
    set abort_brnum [gdb_stub_add_breakpoint abort]
Packit 62fe53
Packit 62fe53
    upvar #0 gdb_stub_info I
Packit 62fe53
    set I($dest,exit_brnum) $exit_brnum
Packit 62fe53
    set I($dest,abort_brnum) $abort_brnum
Packit 62fe53
Packit 62fe53
    remote_send host "set \$fp=0\n"
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "$gdb_prompt" { }
Packit 62fe53
    }
Packit 62fe53
    # This is needed for the SparcLite. Whee.
Packit 62fe53
    if {[board_info $dest exists gdb,start_symbol]} {
Packit 62fe53
	set start_comm "jump *[board_info $dest gdb,start_symbol]\n"
Packit 62fe53
    } else {
Packit 62fe53
	set start_comm "jump *start\n"
Packit 62fe53
    }
Packit 62fe53
    remote_send host "break copyloop\n"
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "Breakpoint.*$gdb_prompt $" {
Packit 62fe53
	    set start_comm "continue\n"
Packit 62fe53
	}
Packit 62fe53
	-re "Function.*not defined.*$gdb_prompt $" { }
Packit 62fe53
	default { }
Packit 62fe53
    }
Packit 62fe53
    remote_send host $start_comm
Packit 62fe53
    remote_expect host 10 {
Packit 62fe53
	-re "y or n. $" {
Packit 62fe53
	    remote_send host "y\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint.*in copyloop.*$gdb_prompt $" {
Packit 62fe53
	    remote_send host "jump relocd\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
	-re "Continuing at.*\[\r\n\]" { }
Packit 62fe53
	default {
Packit 62fe53
	    return { "fail" "" }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return { "pass" "" }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_spawn { dest prog args } {
Packit 62fe53
    for { set x 0 } { $x < 3 } { incr x } {
Packit 62fe53
	if { [remote_ld $dest $prog] != 1 } {
Packit 62fe53
	    return [list "fail" "remote_ld failed"]
Packit 62fe53
	}
Packit 62fe53
	
Packit 62fe53
	set result [gdb_stub_start $dest]
Packit 62fe53
	if { [lindex $result 0] != "pass" } {
Packit 62fe53
	    remote_reboot target
Packit 62fe53
	} else {
Packit 62fe53
	    return 666;		# does anyone use this value?
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return -1
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_wait { dest timeout } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
Packit 62fe53
Packit 62fe53
    upvar #0 gdb_stub_info I
Packit 62fe53
    set exit_brnum $I($dest,exit_brnum)
Packit 62fe53
    set abort_brnum $I($dest,abort_brnum)
Packit 62fe53
Packit 62fe53
    remote_expect host $timeout {
Packit 62fe53
	-re "Breakpoint.*exit.*=0.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 0 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint.*exit.*=\[1-9\]\[0-9\]*.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 0 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint.*exit.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 0 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint.*abort.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 1 ""]
Packit 62fe53
	}
Packit 62fe53
        -re " EXIT code 0.*$gdb_prompt $" {
Packit 62fe53
            gdb_stub_go_idle $dest
Packit 62fe53
            return [list 0 ""]
Packit 62fe53
        }
Packit 62fe53
        -re " EXIT code \[1-9]\[0-9]*.*$gdb_prompt $" {
Packit 62fe53
            gdb_stub_go_idle $dest
Packit 62fe53
            return [list 0 ""]
Packit 62fe53
        }
Packit 62fe53
        -re " EXIT code 4242.*$gdb_prompt $" {
Packit 62fe53
            gdb_stub_go_idle $dest
Packit 62fe53
            return [list 1 ""]
Packit 62fe53
        }
Packit 62fe53
 	-re "Program received.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 1 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Program exited.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 1 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint $exit_brnum.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 0 ""]
Packit 62fe53
	}
Packit 62fe53
	-re "Breakpoint $abort_brnum.*$gdb_prompt $" {
Packit 62fe53
	    gdb_stub_go_idle $dest
Packit 62fe53
	    return [list 1 ""]
Packit 62fe53
	}
Packit 62fe53
	default {
Packit 62fe53
	    remote_close $dest
Packit 62fe53
	    remote_reboot $dest
Packit 62fe53
	    return [list -1 ""]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return [list -1 ""]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_load { dest prog args } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
    set argnames { "command-line arguments" "input file" "output file" }
Packit 62fe53
Packit 62fe53
    for { set x 0 } { $x < [llength $args] } { incr x } {
Packit 62fe53
	if { [lindex $args $x] != "" } {
Packit 62fe53
	    return [list "unsupported" "no support for [lindex $argnames $x] on this target"]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set result [remote_spawn $dest $prog]
Packit 62fe53
Packit 62fe53
    if { $result < 0 } {
Packit 62fe53
	return [list "fail" "remote_spawn failed"]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # FIXME: The value 120 should be a parameter.
Packit 62fe53
    set result [remote_wait $dest 120]
Packit 62fe53
    set status [lindex $result 0]
Packit 62fe53
    set output [lindex $result 1]
Packit 62fe53
Packit 62fe53
    if { $status == 0 } {
Packit 62fe53
	return [list "pass" $output]
Packit 62fe53
    } elseif { $status > 0 } {
Packit 62fe53
	return [list "fail" $output]
Packit 62fe53
    } else {
Packit 62fe53
	global gdb_stub_retry
Packit 62fe53
Packit 62fe53
	if {![info exists gdb_stub_retry]} {
Packit 62fe53
	    set gdb_stub_retry 1
Packit 62fe53
Packit 62fe53
	    set result [eval gdb_stub_load \{$dest\} \{$prog\} $args]
Packit 62fe53
	    unset gdb_stub_retry
Packit 62fe53
	    return $result
Packit 62fe53
	} else {
Packit 62fe53
	    return [list "fail" $output]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# gdb_stub_ld -- load PROG into the board
Packit 62fe53
#             Returns a 0 if there was an error,
Packit 62fe53
#                       1 if it loaded successfully.
Packit 62fe53
#
Packit 62fe53
proc gdb_stub_ld { dest prog } {
Packit 62fe53
    global gdb_prompt
Packit 62fe53
    global GDB
Packit 62fe53
Packit 62fe53
    if {![board_info $dest exists gdb_is_running]} {
Packit 62fe53
	if {![gdb_stub_restart $dest]} {
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set loadfile [file tail $prog]
Packit 62fe53
    set loadpath [file dirname $prog]
Packit 62fe53
Packit 62fe53
    remote_send host "file $prog\n"
Packit 62fe53
    remote_expect host 30 {
Packit 62fe53
	-re "A program is being debug.*Kill it.*y or n. $" {
Packit 62fe53
	    remote_send host "y\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
        -re "Load new symbol table.*y or n. $" {
Packit 62fe53
	    remote_send host "y\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
	-re "Reading symbols from.*done..*$gdb_prompt $" {}
Packit 62fe53
	-re "$gdb_prompt $" {
Packit 62fe53
	    # Hmmm...is retrying going to help? I kinda doubt it.
Packit 62fe53
	    warning "GDB couldn't read file"
Packit 62fe53
	    return [gdb_stub_retry_ld "$dest" "$prog"]
Packit 62fe53
	}
Packit 62fe53
	timeout {
Packit 62fe53
	    warning "(timeout) read symbol file"
Packit 62fe53
	    return [gdb_stub_retry_ld "$dest" "$prog"]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # just in case there are old breakpoints lying around.
Packit 62fe53
    gdb_stub_delete_breakpoints
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists gdb_serial]} {
Packit 62fe53
	set serial [board_info $dest gdb_serial]
Packit 62fe53
    } elseif {[board_info $dest exists serial]} {
Packit 62fe53
	set serial [board_info $dest serial]
Packit 62fe53
    } else {
Packit 62fe53
	set serial [board_info $dest netport]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    remote_send host "target remote $serial\n"
Packit 62fe53
    remote_expect host 60 {
Packit 62fe53
	-re "Kill it?.*y or n.*" {
Packit 62fe53
	    remote_send host "y\n"
Packit 62fe53
	    exp_continue
Packit 62fe53
	}
Packit 62fe53
	-re "$gdb_prompt $"	{
Packit 62fe53
	    verbose "Set remote target to $serial" 2
Packit 62fe53
	}
Packit 62fe53
	timeout {
Packit 62fe53
	    warning "Couldn't set remote target."
Packit 62fe53
	    return 0
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists gdb_load_offset]} {
Packit 62fe53
	set offset "[board_info $dest gdb_load_offset]"
Packit 62fe53
    } else {
Packit 62fe53
	set offset ""
Packit 62fe53
    }
Packit 62fe53
    remote_send host "load $prog $offset\n"
Packit 62fe53
    verbose "Loading $prog into $GDB" 2
Packit 62fe53
    global verbose
Packit 62fe53
    remote_expect host 1200 {
Packit 62fe53
	-re "Loading.*$gdb_prompt $" {
Packit 62fe53
	    verbose "Loaded $prog into $GDB" 1
Packit 62fe53
	}
Packit 62fe53
	-re "$gdb_prompt $"     {
Packit 62fe53
	    if $verbose>1 then {
Packit 62fe53
		warning "GDB couldn't load."
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	timeout {
Packit 62fe53
	    if $verbose>1 then {
Packit 62fe53
		perror "Timed out trying to load $prog."
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return 1
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Retry the ld operation, but only once.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc gdb_stub_retry_ld { dest prog } {
Packit 62fe53
    global gdb_stub_retry_ld
Packit 62fe53
Packit 62fe53
    remote_reboot $dest
Packit 62fe53
    if {[info exists gdb_stub_retry_ld]} {
Packit 62fe53
	unset gdb_stub_retry_ld
Packit 62fe53
	return 0
Packit 62fe53
    } else {
Packit 62fe53
	set gdb_stub_retry_ld 1
Packit 62fe53
    }
Packit 62fe53
    gdb_stub_restart $dest
Packit 62fe53
    set status [gdb_stub_ld $dest $prog]
Packit 62fe53
    if {[info exists gdb_stub_retry_ld]} {
Packit 62fe53
	unset gdb_stub_retry_ld
Packit 62fe53
    }
Packit 62fe53
    return $status
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc gdb_stub_close { dest } {
Packit 62fe53
    global board_info
Packit 62fe53
    set name [board_info $dest name]
Packit 62fe53
    if {[info exists board_info($name,gdb_is_running)]} {
Packit 62fe53
	unset board_info($name,gdb_is_running)
Packit 62fe53
    }
Packit 62fe53
    return [remote_close host]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
set_board_info protocol  "gdb_stub"