--- /dev/null
+# Test Framework Driver for GDB driving an external simulator
+# Copyright 1999 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
+}