#   Copyright 1988-2013 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 3 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, see <http://www.gnu.org/licenses/>.

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

