#   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
    }
}
