diff options
Diffstat (limited to 'gdb/testsuite/config/monitor.exp')
-rw-r--r-- | gdb/testsuite/config/monitor.exp | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/gdb/testsuite/config/monitor.exp b/gdb/testsuite/config/monitor.exp new file mode 100644 index 00000000000..0d381a22cfa --- /dev/null +++ b/gdb/testsuite/config/monitor.exp @@ -0,0 +1,230 @@ +# Test Framework Driver for GDB driving a ROM monitor (via monitor.c). +# Copyright 1995, 1997 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +load_lib gdb.exp + +# +# gdb_target_monitor +# Set gdb to target the monitor +# +proc gdb_target_monitor { exec_file } { + global gdb_prompt + global exit_status + global timeout + + if [target_info exists gdb_protocol] { + set targetname "[target_info gdb_protocol]" + } else { + perror "No protocol specified for [target_info name]."; + return -1; + } + if [target_info exists baud] { + gdb_test "set remotebaud [target_info baud]" "" "" + } + if [target_info exists gdb_serial] { + set serialport "[target_info gdb_serial]"; + } elseif [target_info exists netport] { + set serialport "[target_info netport]" + } else { + set serialport "[target_info serial]" + } + + for {set j 1} {$j <= 2} {incr j} { + if [gdb_file_cmd $exec_file] { return -1; } + + for {set i 1} {$i <= 3} {incr i} { + send_gdb "target $targetname $serialport\n" + gdb_expect 60 { + -re "A program is being debugged already.*ill it.*y or n. $" { + send_gdb "y\n"; + exp_continue; + } + -re "Couldn't establish connection to remote.*$gdb_prompt" { + verbose "Connection failed"; + } + -re "Remote MIPS debugging.*$gdb_prompt" { + verbose "Set target to $targetname"; + return 0; + } + -re "Remote debugging using .*$serialport.*$gdb_prompt" { + verbose "Set target to $targetname"; + return 0; + } + -re "Remote target $targetname connected to.*$gdb_prompt" { + verbose "Set target to $targetname"; + return 0; + } + -re "Connected to.*$gdb_prompt" { + verbose "Set target to $targetname"; + return 0; + } + -re "Ending remote.*$gdb_prompt" { } + -re "Connection refused.*$gdb_prompt" { + verbose "Connection refused by remote target. Pausing, and trying again." + sleep 30 + continue + } + -re "Timeout reading from remote system.*$gdb_prompt" { + verbose "Got timeout error from gdb."; + } + timeout { + send_gdb ""; + break + } + } + } + + gdb_target_exec; + + if { $j == 1 && ![reboot_target] } { + break; + } + } + + perror "Couldn't set target for $targetname, port is $serialport."; + return -1; +} + +proc gdb_target_exec { } { + gdb_test "target exec" "No executable file now." "" ".*Kill it.*y or n.*" "y" + +} +# +# gdb_load -- load a file into the debugger. +# return a -1 if anything goes wrong. +# +proc gdb_load { arg } { + global verbose + global loadpath + global loadfile + global GDB + global gdb_prompt + global timeout + global last_gdb_file; + + if { $arg == "" } { + if [info exists last_gdb_file] { + set arg $last_gdb_file; + } else { + send_gdb "info files\n"; + gdb_expect 30 { + -re "Symbols from \"(\[^\"\]+)\"" { + set arg $expect_out(1,string); + exp_continue; + } + -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { + set arg $expect_out(1,string); + exp_continue; + } + -re "$gdb_prompt $" { } + } + } + } + + set last_gdb_file $arg; + + for { set j 1; } { $j <= 2 } {incr j; } { + if [target_info exists gdb,use_standard_load] { + gdb_target_exec; + if ![target_info exists gdb,no_push_conn] { + remote_push_conn host; + } + set state [remote_ld target $arg]; + if ![target_info exists gdb,no_push_conn] { + remote_close target; + remote_pop_conn host; + } + if { $state == "pass" } { + if [gdb_target_monitor $arg] { return -1; } + gdb_test "list main" ".*" "" + verbose "Loaded $arg into $GDB\n"; + return 0; + } + } else { + + if [gdb_target_monitor $arg] { return -1 } + + if [is_remote host] { + # FIXME: Multiple downloads. bleah. + set farg [remote_download host $arg]; + } else { + set farg $arg; + } + + if { $arg != "" && [target_info exists gdb_sect_offset] } { + set textoff [target_info gdb_sect_offset]; + send_gdb "sect .text $textoff\n"; + gdb_expect 30 { + -re "(0x\[0-9a-z]+) - 0x\[0-9a-z\]+ is \\.data" { + set dataoff $expect_out(1,string); + exp_continue; + } + -re "(0x\[0-9a-z\]+) - 0x\[0-9a-z\]+ is \\.bss" { + set bssoff $expect_out(1,string); + exp_continue; + } + -re "$gdb_prompt" { } + } + set dataoff [format 0x%x [expr $dataoff + $textoff]]; + set bssoff [format 0x%x [expr $bssoff + $textoff]]; + send_gdb "sect .data $dataoff\n"; + gdb_expect 30 { + -re "$gdb_prompt" { } + } + send_gdb "sect .bss $bssoff\n"; + gdb_expect 30 { + -re "$gdb_prompt" { } + } + } + + verbose "Loading $farg" + if [target_info exists gdb_load_offset] { + set command "load $farg [target_info gdb_load_offset]\n"; + } else { + set command "load $farg\n"; + } + send_gdb $command; + gdb_expect 1600 { + -re "\[Ff\]ailed.*$gdb_prompt $" { + verbose "load failed"; + } + -re "Timeout reading from remote.*$gdb_prompt" { + } + -re "$gdb_prompt $" { + verbose "Loaded $farg into $GDB\n" + return 0; + } + timeout { + if { $verbose > 1 } { + perror "Timed out trying to load $farg." + } + } + } + } + + # Make sure we don't have an open connection to the target. + gdb_target_exec; + + if { $j == 1 } { + if { ![reboot_target] } { + break; + } + } + } + perror "Couldn't load file into GDB."; + return -1; +} |