| # Test Framework Driver for GDB driving an external simulator |
| # Copyright 1999, 2001 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 |
| |
| proc sid_start {} { |
| global sid_spawn_id |
| global verbose |
| |
| set port [lindex [split [target_info netport] ":"] 1] |
| |
| # Set a default endianness |
| case [target_info multilib_flags] in { |
| { *big-endian* *-EB* *-meb* } { set sidendian "-EB" } |
| { *little-endian* *-EL* *-mel* } { set sidendian "-EL" } |
| default { |
| if {[target_info exists sim,defaultendian]} then { |
| set sidendian [target_info sim,defaultendian] |
| } else { |
| warning "Unknown target endianness - assuming -EB" |
| set sidendian "-EB" |
| } |
| } |
| } |
| # set verbosity conditionally |
| if {$verbose > 0} then { set sidverbose "--verbose" } else { set sidverbose "" } |
| |
| # test to see whether to use use sid in build or install tree |
| set use_build_tree [file exists ../../sid] |
| |
| if {$use_build_tree} then { |
| set pre_spawn { |
| global env |
| set env(SID_LIBRARY_PATH) [join [glob "../../sid/component/*"] ":"] |
| set env(SID) "../../sid/main/dynamic/sid" |
| set env(MKSID) "../../sid/main/static/mksid" |
| if {! [file exists $env(SID)]} then { error "Cannot find sid in build tree" } |
| } |
| set spawncmd "../../sid/bsp/[target_info sim] $sidverbose $sidendian --persistent --gdb=$port [target_info sim,options]" |
| set post_spawn { |
| global env |
| unset env(SID_LIBRARY_PATH) |
| unset env(MKSID) |
| unset env(SID) |
| } |
| } else { |
| set pre_spawn {} |
| set spawncmd "[target_info sim] $sidverbose $sidendian --persistent --gdb=$port [target_info sim,options]" |
| set post_spawn {} |
| } |
| |
| eval $pre_spawn |
| if {[catch "spawn $spawncmd" msg]} { |
| perror $msg |
| exit 1 |
| } |
| eval $post_spawn |
| |
| expect_background { |
| -re \[^\n\]*\n { |
| regsub "\n" $expect_out(buffer) {} msg |
| verbose "SID: $msg" 2 |
| } |
| } |
| |
| # There should be no need to sleep to give SID time to start; |
| # GDB would wait for a fair while for the stub to respond. |
| sleep 4 |
| |
| set sid_spawn_id $spawn_id |
| } |
| |
| # |
| # Handle GDB talking to SID |
| # |
| |
| proc gdb_start {} { |
| sid_start |
| return [default_gdb_start] |
| } |
| |
| proc sid_exit {} { |
| global sid_spawn_id |
| if {[info exists sid_spawn_id]} { |
| catch {exec kill [exp_pid -i $sid_spawn_id]} |
| catch {wait -i $sid_spawn_id} |
| unset sid_spawn_id |
| sleep 4 |
| } |
| } |
| |
| proc gdb_exit {} { |
| set result [default_gdb_exit] |
| sid_exit |
| return $result |
| } |
| |
| # |
| # gdb_target_sid |
| # Set gdb to target the simulator |
| # |
| proc send_target_sid { } { |
| # wait a little while, giving sid time to shut down & restart its |
| # gdb socket |
| sleep 4 |
| send_gdb "target [target_info gdb_protocol] [target_info netport]\n" |
| } |
| |
| proc gdb_target_sid { } { |
| global gdb_prompt |
| global exit_status |
| |
| send_target_sid |
| |
| global timeout |
| set prev_timeout $timeout |
| set timeout 60 |
| verbose "Timeout is now $timeout seconds" 2 |
| gdb_expect { |
| -re "Remote debugging using.*$gdb_prompt" { |
| verbose "Set target to sid" |
| } |
| timeout { |
| perror "Couldn't set target for remote simulator." |
| cleanup |
| exit $exit_status |
| } |
| } |
| set timeout $prev_timeout |
| verbose "Timeout is now $timeout seconds" 2 |
| } |
| |
| # |
| # 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 |
| |
| gdb_unload |
| if [gdb_file_cmd $arg] then { return -1 } |
| gdb_target_sid |
| |
| send_gdb "load\n" |
| global timeout |
| set prev_timeout $timeout |
| set timeout 2400 |
| verbose "Timeout is now $timeout seconds" 2 |
| gdb_expect { |
| -re ".*$gdb_prompt $" { |
| if $verbose>1 then { |
| send_user "Loaded $arg into $GDB\n" |
| } |
| set timeout 30 |
| verbose "Timeout is now $timeout seconds" 2 |
| return 1 |
| } |
| -re "$gdb_prompt $" { |
| if $verbose>1 then { |
| perror "GDB couldn't load." |
| } |
| } |
| timeout { |
| if $verbose>1 then { |
| perror "Timed out trying to load $arg." |
| } |
| } |
| } |
| set timeout $prev_timeout |
| } |