#   Copyright 1988, 1990, 1991, 1992, 1995, 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.  

# This file was written by Rob Savoye. (rob@cygnus.com)

#
# load support libraries
#
load_lib remote.exp
load_lib gdb.exp

set shell_prompt "->"
set gdb_prompt "\\(vxgdb\\)"

#
# gdb_version -- extract and print the version number of gcc
#
proc gdb_version {} {
    default_gdb_version
}

#
# gdb_load -- load a file into the debugger.
# We have to stop and start gdb each time we do this, because when
# vxgdb loads two files in a row, the symbols in the first file loaded
# take precedence. Returns -1 on error, else 0.
#
proc gdb_load { arg } {
    set result 0

    if { [remote_ld target $arg] != 0 } {
	perror "Couldn't load $arg"
	return -1
    }

    return [gdb_file_cmd $arg]
}

#
# gdb_start -- start gdb running
#
proc gdb_start { } {
    global gdb_prompt
    global verbose
    global connectmode
    global reboot

    # get a connection to the board
    for { set x 0; } { $x < 3 } { incr x } {
	set shell_id [remote_open target]
	if { $shell_id > 0 } {
	    verbose "Spawn id for remote shell is $shell_id"

	    set timeout 10
	    verbose "Timeout is now $timeout seconds" 2

	    set state [spawn_vxgdb];
	    if { $state == "pass" } {
		return 0;
	    }
	    if { $state == "fail" } {
		return -1;
	    }
	}
	remote_reboot target;
    }
}

proc spawn_vxgdb { } {
    global gdb_prompt

    default_gdb_start

    # set the default arguments to "main", so that "run" with no
    # arguments will work correctly.
    send_gdb "set args main\n"
    gdb_expect -re ".*$gdb_prompt $" {}

    verbose "Setting up target, Please wait..."
    # set targets hostname
    send_gdb "target vxworks [target_info hostname]\n"
    set timeout 60
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	-re "Done\..*$gdb_prompt $"	{
	    verbose "Set target to [target_info hostname]" 1
	    set timeout 10;
	    return "pass";
	}
	-re "net_connect: RPC: (Program not registered|.*Timed out).*$" {
	    warning "Couldn't set GDB to target [target_info netport]."
	}
	timeout {
	    warning "Couldn't set target for vxworks."
	}
    }
    return "retry";
}

proc gdb_exit { } {
    remote_close target;
    catch default_gdb_exit
}

#expect_after {
#    "<return>"		   { send "\n"; perror "Window too small." }
#    -re "\(y or n\) " 	   { send "n\n"; perror "Got interactive prompt." }
#    buffer_full		   { perror "internal buffer is full." }
#    eof			   { perror "eof -- pty is hosed." }
#    timeout			   { perror "timeout." }
#    "virtual memory exhausted" { perror "virtual memory exhausted." }
#    "Undefined command"	   { perror "send string probably wrong." }
#}

