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 |