# Test framework for GDB (remote protocol) using a "gdbserver",
# ie. a debug agent running as a native process on the same or
# a different host.

#   Copyright 2000, 2002, 2003, 2004 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 Michael Snyder. (msnyder@redhat.com)

#
# This module to be used for testing gdb with a "gdbserver" 
# built either from libremote or from gdb/gdbserver.  
#

# Load the basic testing library, and the remote stuff.
load_lib ../config/monitor.exp

#
# To be addressed or set in your baseboard config file:
#
#   set_board_info gdb_protocol "remote"
#	Unles you have a gdbserver that uses a different protocol...
#
#   set_board_info use_gdb_stub 1
#	This tells the rest of the test suite not to do things
#	like "run" which don't work well on remote targets.
#
#   set_board_info gdb,do_reload_on_run 1
#	Unles you have a gdbserver that can handle multiple sessions.
#
#   set_board_info noargs 1
#	At present there is no provision in the remote protocol
#	for passing arguments.  This test framework does not
#	address the issue, so it's best to set this variable
#	in your baseboard configuration file.  
#	FIXME: there's no reason why the test harness couldn't
#	pass commandline args when it spawns gdbserver.
#
#   set_board_info gdb,noinferiorio 1
#	Neither the traditional gdbserver nor the one in libremote
#	can presently capture stdout and relay it to GDB via the
#	'O' packet.  This means that tests involving printf will
#	fail unles you set this varibale in your baseboard
#	configuration file.
#   
#   set_board_info gdb,no_hardware_watchpoints 1
#	Unles you have a gdbserver that supports hardware watchpoints.
#	FIXME: gdb should detect if the target doesn't support them,
#	and fall back to using software watchpoints.
#
#   set_board_info gdb_server_prog
#	This will be the path to the gdbserver program you want to test.
#	Defaults to "gdbserver".
#
#   set_board_info sockethost
#	The name of the host computer whose socket is being used.
#	Defaults to "localhost".  Note: old gdbserver requires 
#	that you define this, but libremote/gdbserver does not.
#
#   set_board_info socketport
#	Port id to use for socket connection.  If not set explicitly,
#	it will start at "2345" and increment for each use.
#



#
# gdb_load -- load a file into the debugger.
#             return a -1 if anything goes wrong.
#

global server_exec;
global portnum;
set portnum "2345";

proc gdbserver_gdb_load { server_exec } {
    global portnum

    # Port id -- either specified in baseboard file, or managed here.
    if [target_info exists gdb,socketport] {
	set portnum [target_info gdb,socketport];
    } else {
	# Bump the port number to avoid conflicts with hung ports.
	incr portnum;
    }

    # Extract the local and remote host ids from the target board struct.

    if [target_info exists sockethost] {
	set debughost  [target_info sockethost];
    } else {
	set debughost "localhost:";
    }
    # Extract the protocol
    if [target_info exists gdb_protocol] {
	set protocol [target_info gdb_protocol];
    } else {
	set protocol "remote";
    }

    # Extract the name of the gdbserver, if known (default 'gdbserver').
    if [target_info exists gdb_server_prog] {
	set gdbserver [target_info gdb_server_prog];
    } else {
	set gdbserver "gdbserver";
    }
    # Extract the socket hostname
    if [target_info exists sockethost] {
	set sockethost [target_info sockethost];
    } else {
	set sockethost ""
    }

    # Export the host:port pair.
    set gdbport $debughost$portnum;

    # Fire off the debug agent
    if [target_info exists gdb_server_args] {
        # This flavour of gdbserver takes as arguments those specified
        # in the board configuration file
        set custom_args [target_info gdb_server_args];
	set server_spawn_id [remote_spawn target \
               "$gdbserver $custom_args"]
    } else {
        # This flavour of gdbserver takes as arguments the port information
        # and the name of the executable file to be debugged.
	set server_spawn_id [remote_spawn target \
	    "$gdbserver $sockethost$portnum $server_exec"]
    }

    # Wait for the server to produce at least one line and an additional
    # character of output.  This will wait until any TCP socket has been
    # created, so that GDB can connect.
    expect {
	-i $server_spawn_id
	-notransfer
	-re ".*\n." { }
    }

    # We can't just call close, because if gdbserver is local then that means
    # that it will get a SIGHUP.  Doing it this way could also allow us to
    # get at the inferior's input or output if necessary, and means that we
    # don't need to redirect output.
    expect_background {
	-i $server_spawn_id
	-re "." { }
	eof {
	    # The spawn ID is already closed now (but not yet waited for).
	    wait -i $expect_out(spawn_id)
	}
    }

    return [list $protocol $gdbport];
}

proc infer_host_exec { } {
    set host_exec ""

    send_gdb "info files\n";
    gdb_expect 30 {
	-re "Symbols from \"(\[^\"\]+)\"" {
	    set host_exec $expect_out(1,string);
	    exp_continue;
	}
	-re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," {
	    set host_exec $expect_out(1,string);
	    exp_continue;
	}
	-re "$gdb_prompt $" { }
    }

    return $host_exec
}

proc gdb_load { arg } {
    global host_exec
    global server_exec

    if { $arg == "" && $host_exec == "" } {
	set host_exec [infer_host_exec]
    } elseif { $arg != "" } {
	set host_exec $arg
	if [info exists server_exec] { unset server_exec }
    }

    if { ! [info exists server_exec] } {
	if [is_remote target] {
	    set server_exec [remote_download target $host_exec]
	} else {
	    set server_exec $host_exec
	}
    }

    set res [gdbserver_gdb_load $host_exec]
    set protocol [lindex $res 0]
    set gdbport [lindex $res 1]

    if { $arg != "" } {
	if [gdb_file_cmd $arg] {
	    return -1
	}
    }
    gdb_target_cmd $protocol $gdbport
}
