| OLD | NEW |
| 1 # Test Framework Driver for GDB driving a ROM monitor (via monitor.c). | 1 # Test Framework Driver for GDB driving a ROM monitor (via monitor.c). |
| 2 # Copyright 1995-2000, 2007-2012 Free Software Foundation, Inc. | 2 # Copyright 1995-2013 Free Software Foundation, Inc. |
| 3 # | 3 # |
| 4 # This program is free software; you can redistribute it and/or modify | 4 # This program is free software; you can redistribute it and/or modify |
| 5 # it under the terms of the GNU General Public License as published by | 5 # it under the terms of the GNU General Public License as published by |
| 6 # the Free Software Foundation; either version 3 of the License, or | 6 # the Free Software Foundation; either version 3 of the License, or |
| 7 # (at your option) any later version. | 7 # (at your option) any later version. |
| 8 # | 8 # |
| 9 # This program is distributed in the hope that it will be useful, | 9 # This program is distributed in the hope that it will be useful, |
| 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 # GNU General Public License for more details. | 12 # GNU General Public License for more details. |
| 13 # | 13 # |
| 14 # You should have received a copy of the GNU General Public License | 14 # You should have received a copy of the GNU General Public License |
| 15 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 15 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 16 | 16 |
| 17 load_lib gdb.exp | 17 load_lib gdb.exp |
| 18 # puts "***** DID USE MONITOR ******" | 18 # puts "***** DID USE MONITOR ******" |
| 19 | 19 |
| 20 # | 20 # |
| 21 # gdb_target_cmd | 21 # gdb_target_cmd |
| 22 # Send gdb the "target" command | 22 # Send gdb the "target" command |
| 23 # | 23 # |
| 24 proc gdb_target_cmd { targetname serialport } { | 24 proc gdb_target_cmd { targetname serialport } { |
| 25 global gdb_prompt | 25 global gdb_prompt |
| 26 | 26 |
| 27 for {set i 1} {$i <= 3} {incr i} { | 27 for {set i 1} {$i <= 3} {incr i} { |
| 28 send_gdb "target $targetname $serialport\n" | 28 send_gdb "target $targetname $serialport\n" |
| 29 gdb_expect 60 { | 29 gdb_expect 60 { |
| 30 -re "A program is being debugged already.*ill it.*y or n. $" { | 30 -re "A program is being debugged already.*ill it.*y or n. $" { |
| 31 » » send_gdb "y\n"; | 31 » » send_gdb "y\n" |
| 32 » » exp_continue; | 32 » » exp_continue |
| 33 } | 33 } |
| 34 -re "Couldn't establish connection to remote.*$gdb_prompt" { | 34 -re "Couldn't establish connection to remote.*$gdb_prompt" { |
| 35 » » verbose "Connection failed"; | 35 » » verbose "Connection failed" |
| 36 } | 36 } |
| 37 -re "Remote MIPS debugging.*$gdb_prompt" { | 37 -re "Remote MIPS debugging.*$gdb_prompt" { |
| 38 » » verbose "Set target to $targetname"; | 38 » » verbose "Set target to $targetname" |
| 39 » » return 0; | 39 » » return 0 |
| 40 } | 40 } |
| 41 -re "Remote debugging using .*$serialport.*$gdb_prompt" { | 41 -re "Remote debugging using .*$serialport.*$gdb_prompt" { |
| 42 » » verbose "Set target to $targetname"; | 42 » » verbose "Set target to $targetname" |
| 43 » » return 0; | 43 » » return 0 |
| 44 } | 44 } |
| 45 -re "Remote target $targetname connected to.*$gdb_prompt" { | 45 -re "Remote target $targetname connected to.*$gdb_prompt" { |
| 46 » » verbose "Set target to $targetname"; | 46 » » verbose "Set target to $targetname" |
| 47 » » return 0; | 47 » » return 0 |
| 48 } | 48 } |
| 49 -re "Connected to.*$gdb_prompt" { | 49 -re "Connected to.*$gdb_prompt" { |
| 50 » » verbose "Set target to $targetname"; | 50 » » verbose "Set target to $targetname" |
| 51 » » return 0; | 51 » » return 0 |
| 52 } | 52 } |
| 53 -re "Ending remote.*$gdb_prompt" { } | 53 -re "Ending remote.*$gdb_prompt" { } |
| 54 -re "Connection refused.*$gdb_prompt" { | 54 -re "Connection refused.*$gdb_prompt" { |
| 55 verbose "Connection refused by remote target. Pausing, and tryi
ng again." | 55 verbose "Connection refused by remote target. Pausing, and tryi
ng again." |
| 56 sleep 30 | 56 sleep 30 |
| 57 continue | 57 continue |
| 58 } | 58 } |
| 59 -re "Timeout reading from remote system.*$gdb_prompt" { | 59 -re "Timeout reading from remote system.*$gdb_prompt" { |
| 60 » » verbose "Got timeout error from gdb."; | 60 » » verbose "Got timeout error from gdb." |
| 61 } | 61 } |
| 62 timeout { | 62 timeout { |
| 63 » » send_gdb ""; | 63 » » send_gdb "" |
| 64 break | 64 break |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 } | 67 } |
| 68 return 1 | 68 return 1 |
| 69 } | 69 } |
| 70 | 70 |
| 71 | 71 |
| 72 | 72 |
| 73 # | 73 # |
| 74 # gdb_target_monitor | 74 # gdb_target_monitor |
| 75 # Set gdb to target the monitor | 75 # Set gdb to target the monitor |
| 76 # | 76 # |
| 77 proc gdb_target_monitor { exec_file } { | 77 proc gdb_target_monitor { exec_file } { |
| 78 global gdb_prompt | 78 global gdb_prompt |
| 79 global exit_status | 79 global exit_status |
| 80 global timeout | 80 global timeout |
| 81 | 81 |
| 82 if [target_info exists gdb_protocol] { | 82 if [target_info exists gdb_protocol] { |
| 83 set targetname "[target_info gdb_protocol]" | 83 set targetname "[target_info gdb_protocol]" |
| 84 } else { | 84 } else { |
| 85 » perror "No protocol specified for [target_info name]."; | 85 » perror "No protocol specified for [target_info name]." |
| 86 » return -1; | 86 » return -1 |
| 87 } | 87 } |
| 88 if [target_info exists baud] { | 88 if [target_info exists baud] { |
| 89 gdb_test "set remotebaud [target_info baud]" "" "" | 89 gdb_test "set remotebaud [target_info baud]" "" "" |
| 90 } | 90 } |
| 91 if [target_info exists binarydownload] { | 91 if [target_info exists binarydownload] { |
| 92 gdb_test "set remotebinarydownload [target_info binarydownload]" "" "" | 92 gdb_test "set remotebinarydownload [target_info binarydownload]" "" "" |
| 93 } | 93 } |
| 94 if { [ target_info exists disable_x_packet ] } { | 94 if { [ target_info exists disable_x_packet ] } { |
| 95 gdb_test "set remote X-packet disable" "" | 95 gdb_test "set remote X-packet disable" "" |
| 96 } | 96 } |
| 97 if { [ target_info exists disable_z_packet ] } { | 97 if { [ target_info exists disable_z_packet ] } { |
| 98 gdb_test "set remote Z-packet disable" "" | 98 gdb_test "set remote Z-packet disable" "" |
| 99 } | 99 } |
| 100 if [target_info exists gdb_serial] { | 100 if [target_info exists gdb_serial] { |
| 101 set serialport "[target_info gdb_serial]"; | 101 set serialport "[target_info gdb_serial]" |
| 102 } elseif [target_info exists netport] { | 102 } elseif [target_info exists netport] { |
| 103 set serialport "[target_info netport]" | 103 set serialport "[target_info netport]" |
| 104 } else { | 104 } else { |
| 105 set serialport "[target_info serial]" | 105 set serialport "[target_info serial]" |
| 106 } | 106 } |
| 107 | 107 |
| 108 for {set j 1} {$j <= 2} {incr j} { | 108 for {set j 1} {$j <= 2} {incr j} { |
| 109 » if [gdb_file_cmd $exec_file] { return -1; } | 109 » if [gdb_file_cmd $exec_file] { return -1 } |
| 110 | 110 |
| 111 » if ![gdb_target_cmd $targetname $serialport] { return 0; } | 111 » if ![gdb_target_cmd $targetname $serialport] { return 0 } |
| 112 | 112 |
| 113 » gdb_target_exec; | 113 » gdb_target_exec |
| 114 | 114 |
| 115 if { $j == 1 && ![reboot_target] } { | 115 if { $j == 1 && ![reboot_target] } { |
| 116 » break; | 116 » break |
| 117 } | 117 } |
| 118 } | 118 } |
| 119 | 119 |
| 120 perror "Couldn't set target for $targetname, port is $serialport."; | 120 perror "Couldn't set target for $targetname, port is $serialport." |
| 121 return -1; | 121 return -1 |
| 122 } | 122 } |
| 123 | 123 |
| 124 proc gdb_target_exec { } { | 124 proc gdb_target_exec { } { |
| 125 gdb_test "target exec" "No executable file now." "" ".*Kill it.*y or n.*" "y
" | 125 gdb_test "target exec" "No executable file now." "" ".*Kill it.*y or n.*" "y
" |
| 126 | 126 |
| 127 } | 127 } |
| 128 # | 128 # |
| 129 # gdb_load -- load a file into the debugger. | 129 # gdb_load -- load a file into the debugger. |
| 130 # return a -1 if anything goes wrong. | 130 # return a -1 if anything goes wrong. |
| 131 # | 131 # |
| 132 proc gdb_load { arg } { | 132 proc gdb_load { arg } { |
| 133 global verbose | 133 global verbose |
| 134 global loadpath | 134 global loadpath |
| 135 global loadfile | 135 global loadfile |
| 136 global GDB | 136 global GDB |
| 137 global gdb_prompt | 137 global gdb_prompt |
| 138 global timeout | 138 global timeout |
| 139 global last_gdb_file; | 139 global last_gdb_file |
| 140 | 140 |
| 141 if { $arg == "" } { | 141 if { $arg == "" } { |
| 142 if [info exists last_gdb_file] { | 142 if [info exists last_gdb_file] { |
| 143 » set arg $last_gdb_file; | 143 » set arg $last_gdb_file |
| 144 } else { | 144 } else { |
| 145 » send_gdb "info files\n"; | 145 » send_gdb "info files\n" |
| 146 gdb_expect 30 { | 146 gdb_expect 30 { |
| 147 -re "Symbols from \"(\[^\"\]+)\"" { | 147 -re "Symbols from \"(\[^\"\]+)\"" { |
| 148 » » set arg $expect_out(1,string); | 148 » » set arg $expect_out(1,string) |
| 149 » » exp_continue; | 149 » » exp_continue |
| 150 } | 150 } |
| 151 -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { | 151 -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { |
| 152 » » set arg $expect_out(1,string); | 152 » » set arg $expect_out(1,string) |
| 153 » » exp_continue; | 153 » » exp_continue |
| 154 } | 154 } |
| 155 -re "$gdb_prompt $" { } | 155 -re "$gdb_prompt $" { } |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 } | 158 } |
| 159 | 159 |
| 160 set last_gdb_file $arg; | 160 set last_gdb_file $arg |
| 161 | 161 |
| 162 for { set j 1; } { $j <= 2 } {incr j; } { | 162 for { set j 1 } { $j <= 2 } {incr j } { |
| 163 if [target_info exists gdb,use_standard_load] { | 163 if [target_info exists gdb,use_standard_load] { |
| 164 » gdb_target_exec; | 164 » gdb_target_exec |
| 165 if ![target_info exists gdb,no_push_conn] { | 165 if ![target_info exists gdb,no_push_conn] { |
| 166 » » remote_push_conn host; | 166 » » remote_push_conn host |
| 167 } | 167 } |
| 168 » set state [remote_ld target $arg]; | 168 » set state [remote_ld target $arg] |
| 169 if ![target_info exists gdb,no_push_conn] { | 169 if ![target_info exists gdb,no_push_conn] { |
| 170 » » remote_close target; | 170 » » remote_close target |
| 171 » » remote_pop_conn host; | 171 » » remote_pop_conn host |
| 172 } | 172 } |
| 173 if { $state == "pass" } { | 173 if { $state == "pass" } { |
| 174 » » if [gdb_target_monitor $arg] { return -1; } | 174 » » if [gdb_target_monitor $arg] { return -1 } |
| 175 gdb_test "list main" ".*" "" | 175 gdb_test "list main" ".*" "" |
| 176 » » verbose "Loaded $arg into $GDB\n"; | 176 » » verbose "Loaded $arg into $GDB\n" |
| 177 » » return 0; | 177 » » return 0 |
| 178 } | 178 } |
| 179 } else { | 179 } else { |
| 180 | 180 |
| 181 if [gdb_target_monitor $arg] { return -1 } | 181 if [gdb_target_monitor $arg] { return -1 } |
| 182 | 182 |
| 183 if [is_remote host] { | 183 if [is_remote host] { |
| 184 # FIXME: Multiple downloads. bleah. | 184 # FIXME: Multiple downloads. bleah. |
| 185 » » set farg [remote_download host $arg]; | 185 » » set farg [remote_download host $arg] |
| 186 } else { | 186 } else { |
| 187 » » set farg $arg; | 187 » » set farg $arg |
| 188 } | 188 } |
| 189 | 189 |
| 190 if { $arg != "" && [target_info exists gdb_sect_offset] } { | 190 if { $arg != "" && [target_info exists gdb_sect_offset] } { |
| 191 » » set textoff [target_info gdb_sect_offset]; | 191 » » set textoff [target_info gdb_sect_offset] |
| 192 » » send_gdb "sect .text $textoff\n"; | 192 » » send_gdb "sect .text $textoff\n" |
| 193 gdb_expect 30 { | 193 gdb_expect 30 { |
| 194 -re "(0x\[0-9a-z]+) - 0x\[0-9a-z\]+ is \\.data" { | 194 -re "(0x\[0-9a-z]+) - 0x\[0-9a-z\]+ is \\.data" { |
| 195 » » » set dataoff $expect_out(1,string); | 195 » » » set dataoff $expect_out(1,string) |
| 196 » » » exp_continue; | 196 » » » exp_continue |
| 197 } | 197 } |
| 198 -re "(0x\[0-9a-z\]+) - 0x\[0-9a-z\]+ is \\.bss" { | 198 -re "(0x\[0-9a-z\]+) - 0x\[0-9a-z\]+ is \\.bss" { |
| 199 » » » set bssoff $expect_out(1,string); | 199 » » » set bssoff $expect_out(1,string) |
| 200 » » » exp_continue; | 200 » » » exp_continue |
| 201 } | 201 } |
| 202 -re "$gdb_prompt" { } | 202 -re "$gdb_prompt" { } |
| 203 } | 203 } |
| 204 » » set dataoff [format 0x%x [expr $dataoff + $textoff]]; | 204 » » set dataoff [format 0x%x [expr $dataoff + $textoff]] |
| 205 » » set bssoff [format 0x%x [expr $bssoff + $textoff]]; | 205 » » set bssoff [format 0x%x [expr $bssoff + $textoff]] |
| 206 » » send_gdb "sect .data $dataoff\n"; | 206 » » send_gdb "sect .data $dataoff\n" |
| 207 gdb_expect 30 { | 207 gdb_expect 30 { |
| 208 -re "$gdb_prompt" { } | 208 -re "$gdb_prompt" { } |
| 209 } | 209 } |
| 210 » » send_gdb "sect .bss $bssoff\n"; | 210 » » send_gdb "sect .bss $bssoff\n" |
| 211 gdb_expect 30 { | 211 gdb_expect 30 { |
| 212 -re "$gdb_prompt" { } | 212 -re "$gdb_prompt" { } |
| 213 } | 213 } |
| 214 } | 214 } |
| 215 | 215 |
| 216 verbose "Loading $farg" | 216 verbose "Loading $farg" |
| 217 if [target_info exists gdb_load_offset] { | 217 if [target_info exists gdb_load_offset] { |
| 218 » » set command "load $farg [target_info gdb_load_offset]\n"; | 218 » » set command "load $farg [target_info gdb_load_offset]\n" |
| 219 } else { | 219 } else { |
| 220 » » set command "load $farg\n"; | 220 » » set command "load $farg\n" |
| 221 } | 221 } |
| 222 if [target_info exists gdb_load_timeout] { | 222 if [target_info exists gdb_load_timeout] { |
| 223 set loadtimeout [target_info gdb_load_timeout] | 223 set loadtimeout [target_info gdb_load_timeout] |
| 224 } else { | 224 } else { |
| 225 set loadtimeout 1600 | 225 set loadtimeout 1600 |
| 226 } | 226 } |
| 227 | 227 |
| 228 if [is_remote target] { | 228 if [is_remote target] { |
| 229 set oldremotetimeout [get_remotetimeout] | 229 set oldremotetimeout [get_remotetimeout] |
| 230 set_remotetimeout $loadtimeout | 230 set_remotetimeout $loadtimeout |
| 231 } | 231 } |
| 232 | 232 |
| 233 set load_ok 0 | 233 set load_ok 0 |
| 234 » send_gdb $command; | 234 » send_gdb $command |
| 235 gdb_expect $loadtimeout { | 235 gdb_expect $loadtimeout { |
| 236 -re "\[Ff\]ailed.*$gdb_prompt $" { | 236 -re "\[Ff\]ailed.*$gdb_prompt $" { |
| 237 » » verbose "load failed"; | 237 » » verbose "load failed" |
| 238 } | 238 } |
| 239 -re "Timeout reading from remote.*$gdb_prompt" { | 239 -re "Timeout reading from remote.*$gdb_prompt" { |
| 240 } | 240 } |
| 241 -re "$gdb_prompt $" { | 241 -re "$gdb_prompt $" { |
| 242 verbose "Loaded $farg into $GDB\n" | 242 verbose "Loaded $farg into $GDB\n" |
| 243 set load_ok 1 | 243 set load_ok 1 |
| 244 } | 244 } |
| 245 timeout { | 245 timeout { |
| 246 if { $verbose > 1 } { | 246 if { $verbose > 1 } { |
| 247 perror "Timed out trying to load $farg." | 247 perror "Timed out trying to load $farg." |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 if [is_remote target] { | 252 if [is_remote target] { |
| 253 set_remotetimeout $oldremotetimeout | 253 set_remotetimeout $oldremotetimeout |
| 254 } | 254 } |
| 255 | 255 |
| 256 if { $load_ok == 1 } { | 256 if { $load_ok == 1 } { |
| 257 » » return 0; | 257 » » return 0 |
| 258 } | 258 } |
| 259 } | 259 } |
| 260 | 260 |
| 261 # Make sure we don't have an open connection to the target. | 261 # Make sure we don't have an open connection to the target. |
| 262 » gdb_target_exec; | 262 » gdb_target_exec |
| 263 | 263 |
| 264 if { $j == 1 } { | 264 if { $j == 1 } { |
| 265 if { ![reboot_target] } { | 265 if { ![reboot_target] } { |
| 266 » » break; | 266 » » break |
| 267 } | 267 } |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 perror "Couldn't load file into GDB."; | 270 perror "Couldn't load file into GDB." |
| 271 return -1; | 271 return -1 |
| 272 } | 272 } |
| OLD | NEW |