# Test Framework Driver for GDB using the arcjtag target.

#   Copyright 2005 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.  

load_lib gdb.exp

#
# gdb_target_arcjtag
# Set gdb to target arcjtag.
#
proc gdb_target_arcjtag { } {
    global gdb_prompt
    global exit_status

    # our arcjtag target doesn't take any options (yet)
    #set target_arcjtag_options "[board_info target gdb,target_sim_options]";

    send_gdb "target arcjtag\n"

    gdb_expect 60 {
        -re "A program is being debugged already.*Kill it.*y or n. $" {
            send_gdb "y\n"
	    verbose "\t\tKilling previous program being debugged"
            exp_continue
        }
	-re "Connected to the arcjtag target.*$gdb_prompt $"	{
	    verbose "Set target to arcjtag"
	}
	-re "$gdb_prompt $" {
	    verbose "Retrying target arcjtag..."
	    send_gdb "arc-reset-board\n"
	    send_gdb "target arcjtag\n"

	    gdb_expect 60 {
		-re "A program is being debugged already.*Kill it.*y or n. $" {
		    send_gdb "y\n"
		    verbose "\t\tKilling previous program being debugged"
		    exp_continue
		}
		-re "Connected to the arcjtag target.*$gdb_prompt $"	{
		    verbose "Set target to arcjtag"
		}
		timeout { 
		    perror "Couldn't set target to arcjtag (timeout)."
		    return 1
		}
	    }
	}
	timeout { 
	    perror "Couldn't set target to arcjtag (timeout)."
	    return 1
	}
    }

    return 0
}

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

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

    # gotta do something about the timeout....
    send_gdb "load\n"

    gdb_expect 180 {
	-re ".*$gdb_prompt $" {
	    if $verbose>1 then {
		send_user "Loaded $arg into $GDB\n"
	    }
	    return 0
	}
	-re "$gdb_prompt $" {
	    if $verbose>1 then {
		perror "GDB couldn't load."
	    }
	}
	timeout {
	    perror "Timed out trying to load $arg."
	}
    }

    return 1
}
