# Test Framework Driver for GDB driving an external simulator
#   Copyright 1999, 2001, 2007-2012 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/>.

load_lib gdb.exp

proc sid_start {} {
    global verbose

    set port [lindex [split [target_info netport] ":"] 1]

    # Set a default endianness
    case [target_info multilib_flags] in {
	{ *big-endian* *-EB* *-meb* } { set sidendian "-EB" }
	{ *little-endian* *-EL* *-mel* } { set sidendian "-EL" }
	default { 
	    if {[target_info exists sim,defaultendian]} then {
		set sidendian [target_info sim,defaultendian] 
	    } else { 
                # rely on endianness settings in sid configuration defaults
                set sidendian ""
	    }
	}
    }
    case $sidendian in {
	{ -EB } { set sidendian2 {-e "set cpu endian big"} }
	{ -EL } { set sidendian2 {-e "set cpu endian little"} }
	default { set sidendian2 {} }
    }

    # test to see whether to use use sid in build or install tree
    set use_build_tree [file exists ../../sid]

    if {$use_build_tree} then {
	set pre_spawn {
	    global env
	    set env(SID_LIBRARY_PATH) [join [glob "../../sid/component/*"] ":"]
	    set env(SID) "../../sid/main/dynamic/sid"
	    if {! [file exists $env(SID)]} then { error "Cannot find sid in build tree" }
	}
	if { [board_info target sim,protocol] == "sid" } {
	    set spawncmd "[target_info sim] [target_info sim,options] $sidendian2 -e \"set cpu-gdb-socket sockaddr-local 0.0.0.0:$port\""
	} elseif { [board_info target sim,protocol] == "rawsid" } {
	    set spawncmd "[target_info sim] [target_info sim,options] -$sidendian --gdb=$port"
	} else {
	    set spawncmd "../../sid/bsp/[target_info sim] $sidendian --gdb=$port [target_info sim,options]"
	}
	set post_spawn {
	    global env
	    unset env(SID_LIBRARY_PATH)
	    unset env(SID)
	}
    } else {
	set pre_spawn {}
	if { [board_info target sim,protocol] == "sid" } {
	    # FIXME: sim,options may be from the build tree, should find
	    # it in the install tree.
	    set spawncmd "sid [target_info sim,options] $sidendian2 -e \"set cpu-gdb-socket sockaddr-local 0.0.0.0:$port\""
	} elseif { [board_info target sim,protocol] == "rawsid" } {
	    set spawncmd "[target_info sim] [target_info sim,options] -$sidendian --gdb=$port"
	} else {
	    set spawncmd "[target_info sim] $sidendian --gdb=$port [target_info sim,options]"
	}
	set post_spawn {}
    }

    eval $pre_spawn
    if {[catch [list remote_spawn host $spawncmd] msg]} {
	perror $msg
	exit 1
    }
    eval $post_spawn

    # Don't do the following any more; it breaks with "runtest ... < /dev/null"
#    expect_background {
#	-re \[^\n\]*\n { 
#	    regsub "\n" $expect_out(buffer) {} msg
#	    verbose "SID: $msg" 2
#	}
#    }

    # There should be no need to sleep to give SID time to start;
    # GDB would wait for a fair while for the stub to respond.
    sleep 4

    if ![target_info exists gdb,no_push_conn] {
        remote_push_conn host;
    }
}

#
# Handle GDB talking to SID
#

proc gdb_start {} {
    sid_start
    return [default_gdb_start]
}

proc sid_exit {} {
    if ![target_info exists gdb,no_push_conn] {
	remote_close host;
	remote_pop_conn host;
    }
}

proc gdb_exit {} {
    set result [default_gdb_exit]
    sid_exit
    return $result
}

#
# gdb_target_sid
# Set gdb to target the simulator
#
proc send_target_sid { } {
    # wait a little while, giving sid time to shut down & restart its
    # gdb socket
    sleep 4
    send_gdb "target [target_info gdb_protocol] [target_info netport]\n"
}

proc gdb_target_sid { } {
    global gdb_prompt
    global exit_status

    send_target_sid

    global timeout
    set prev_timeout $timeout
    set timeout 60
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	-re ".*\[Ee\]rror.*$gdb_prompt $" {
	    perror "Couldn't set target for remote simulator."
	    cleanup
	    gdb_exit
	}
	-re "Remote debugging using.*$gdb_prompt"	{
	    verbose "Set target to sid"
	}
	timeout { 
	    perror "Couldn't set target for remote simulator."
	    cleanup
	    gdb_exit
	}
    }
    set timeout $prev_timeout
    verbose "Timeout is now $timeout seconds" 2
}

#
# gdb_load -- load a file into the debugger.
#             return a -1 if anything goes wrong.
#
proc gdb_load { arg } {
    global verbose
    global loadpath
    global loadfile
    global GDB
    global gdb_prompt
    global retval

    if { $arg != "" } {
	if [gdb_file_cmd $arg] then { return -1 }
    }

    gdb_target_sid

    send_gdb "load\n"
    global timeout
    set prev_timeout $timeout
    set timeout 2400
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	-re ".*\[Ee\]rror.*$gdb_prompt $" {
	    if $verbose>1 then {
		perror "Error during download."
	    }
	    set retval -1;
	}
	-re ".*$gdb_prompt $" {
	    if $verbose>1 then {
		send_user "Loaded $arg into $GDB\n"
	    }
	    set retval 0;
	}
	-re "$gdb_prompt $"     {
	    if $verbose>1 then {
		perror "GDB couldn't load."
	    }
	    set retval -1;
	}
	timeout {
	    if $verbose>1 then {
		perror "Timed out trying to load $arg."
	    }
	    set retval -1;
	}
    }
    set timeout $prev_timeout
    verbose "Timeout is now $timeout seconds" 2
    return $retval;
}
