mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-26 13:30:30 +00:00
219 lines
4.8 KiB
Plaintext
219 lines
4.8 KiB
Plaintext
# Copyright (C) 1988, 1990, 1991, 1992, 1994, 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.
|
|
|
|
# Please email any bugs, comments, and/or additions to this file to:
|
|
# bug-gdb@prep.ai.mit.edu
|
|
|
|
# This file was written by J.T. Conklin. (jtc@cygnus.com)
|
|
|
|
load_lib gdb.exp
|
|
load_lib remote.exp
|
|
|
|
global shell_id
|
|
|
|
global LD
|
|
if ![info exists LD] then {
|
|
set LD [findfile "$base_dir/../../ld/ld.new"]
|
|
}
|
|
|
|
global NLMCONV
|
|
if ![info exists NLMCONV] then {
|
|
set NLMCONV [findfile "$base_dir/../../binutils/nlmconv"]
|
|
}
|
|
|
|
#
|
|
# gdb_version -- extract and print the version number of gcc
|
|
#
|
|
proc gdb_version {} {
|
|
default_gdb_version
|
|
}
|
|
|
|
#
|
|
# gdb_unload -- unload a file if one is loaded
|
|
#
|
|
|
|
#
|
|
# gdb_load -- load a file into the debugger.
|
|
# return a -1 if anything goes wrong.
|
|
#
|
|
proc gdb_load { arg } {
|
|
global gdb_prompt
|
|
global LD
|
|
global NLMCONV
|
|
global errorCode
|
|
global shell_id
|
|
|
|
# FIXME: this is wrong.
|
|
set targetname [target_info name];
|
|
|
|
set obj [file tail $arg]
|
|
set nlm "$obj.nlm"
|
|
set lnk "$obj.lnk"
|
|
|
|
# build *.lnk file
|
|
set fd [open $lnk w]
|
|
puts $fd "description \"[file tail $nlm]\""
|
|
puts $fd "screenname \"System Console\""
|
|
puts $fd "module clib.nlm"
|
|
puts $fd "module mathlib.nlm"
|
|
puts $fd "stack 32768"
|
|
# puts $fd "stack 64512"
|
|
puts $fd "debug"
|
|
# FIXME: don't hardcode location of prelude.o
|
|
puts $fd "input /s1/cygnus/dejagnu/i386-netware/lib/prelude.o"
|
|
puts $fd "input $arg"
|
|
puts $fd "output $nlm"
|
|
close $fd
|
|
|
|
# run nlmconv
|
|
verbose "Executing: $NLMCONV -l$LD -T$lnk" 1
|
|
catch "exec $NLMCONV -l$LD -T$lnk" output
|
|
if ![string match "" $output] then {
|
|
verbose $output 1
|
|
}
|
|
if ![string match "NONE" $errorCode] {
|
|
warning "Can't link $arg"
|
|
|
|
return -1
|
|
}
|
|
catch "exec rm -f $lnk"
|
|
|
|
# download
|
|
verbose "Downloading $nlm" 1
|
|
catch "exec cp $nlm /.NetWare/$targetname.nws/sys.nwv/tmp/x.nlm" output
|
|
if ![string match "" $output] then {
|
|
verbose $output 1
|
|
return -1
|
|
}
|
|
|
|
gdb_file_cmd $nlm
|
|
}
|
|
|
|
proc gdb_run_cmd { } {
|
|
global shell_id
|
|
global gdb_prompt
|
|
global timeout
|
|
|
|
set connhost [target_info name];
|
|
if [board_info $connhost exists serial] {
|
|
set serialport [board_info $connhost serial];
|
|
} else {
|
|
set serialport [board_info $connhost netport];
|
|
}
|
|
|
|
if [board_info $connhost exists baud] {
|
|
set baud [board_info $connhost baud];
|
|
} else {
|
|
set baud 9600;
|
|
}
|
|
# FIXME: This is wrong.
|
|
send "kill\n"
|
|
gdb_expect {
|
|
-re ".*Kill the program being debugged.*y or n. $" {
|
|
send "y\n"
|
|
exp_continue
|
|
}
|
|
-re ".*$gdb_prompt $" {}
|
|
}
|
|
|
|
verbose "Starting GDB stub on [target_info name]" 1
|
|
send -i $shell_id "load nlmstub BAUD=$baud x.nlm\r\n"
|
|
|
|
send "set remotebaud $baud\n"
|
|
gdb_expect {
|
|
-re "$gdb_prompt" {}
|
|
timeout {
|
|
perror "Couldn't set remote baud rate"
|
|
return
|
|
}
|
|
}
|
|
|
|
set otimeout $timeout
|
|
set timeout 60
|
|
verbose "Timeout is now $timeout seconds" 2
|
|
send "target remote $serialport\n"
|
|
gdb_expect {
|
|
-re "Couldn't establish connection to remote target" {
|
|
send "target remote $serialport\n"
|
|
exp_continue
|
|
}
|
|
-re "$gdb_prompt" {}
|
|
timeout {
|
|
set timeout $otimeout
|
|
verbose "Timeout restored to $timeout seconds" 2
|
|
perror "Couldn't set remote target"
|
|
return
|
|
}
|
|
}
|
|
set timeout $otimeout
|
|
verbose "Timeout restored to $timeout seconds" 2
|
|
|
|
send "continue\n"
|
|
gdb_expect {
|
|
"Continuing.$" {}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
|
|
|
|
#
|
|
# start the remote shell
|
|
#
|
|
|
|
set shell_prompt "Password:"
|
|
set shell_id [remote_open target]
|
|
|
|
if $shell_id<0 then {
|
|
warning "Couldn't connect to target"
|
|
return -1
|
|
}
|
|
|
|
if [string match "" $passwd] then {
|
|
stty -echo
|
|
send_user "Password: "
|
|
expect_user -re "(.*)\n"
|
|
send_user "\n"
|
|
set passwd "$expect_out(1,string)"
|
|
stty echo
|
|
}
|
|
|
|
send -i $shell_id "$passwd\n"
|
|
gdb_expect {
|
|
-i $shell_id ":" {
|
|
verbose "Got termtype prompt" 0
|
|
}
|
|
|
|
-i $shell_id timeout {
|
|
warning "Connection timed out"
|
|
return -1
|
|
}
|
|
}
|
|
|
|
|
|
# FIXME: this is wrong.
|
|
set shell_prompt "[string toupper [target_info name]]:"
|
|
send -i $shell_id "1\n"
|
|
|
|
gdb_expect {
|
|
-i $shell_id -re "$shell_prompt" {}
|
|
-i $shell_id timeout {
|
|
warning "Connection timed out"
|
|
return -1
|
|
}
|
|
}
|