# Test Framework Driver for GDB driving Universal Debug Interface on 29K
#   Copyright 1988, 1990, 1991, 1992, 1993, 1994, 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.  

# Please email any bugs, comments, and/or additions to this file to:
# DejaGnu@cygnus.com

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

load_lib gdb.exp

#
# gdb_target_udi
# Set gdb to the desired UDI target
#
proc gdb_target_udi { } {
    global gdb_prompt
    global verbose
    global exit_status

    set targetname [target_info mondfe,name];
    # set targets hostname
    send_gdb "target udi $targetname\n"
    set timeout 60
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	-re "target udi $targetname\[\r\n\]+" {
	    exp_continue
	}
	-re "TIP UDI 1.2 Conformant.*$gdb_prompt $"	{
	    verbose "Set target to $targetname"
	}
	-re "TIP-ipc WARNING,.*failed:" {
	    warning "$expect_out(buffer)"
	}
	-re "TIP-ipc ERROR,.*failed:" {
	    perror "$expect_out(buffer)"
	}
	-re "A program is being debugged already.  Kill it\? \(y or n\)" {
	    send "y\n"
	    exp_continue
	}
	timeout { 
	    perror "Couldn't set target for UDI."
	    cleanup
	    exit $exit_status
	}
    }
    set timeout 10
    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

    if [gdb_file_cmd $arg] {
	return -1 
    }

    gdb_target_udi
}

#
# gdb_start -- start GDB running. This assumes that there the
#              UDICONF enviroment variable is set.
#
proc gdb_start { } {
    global env;

    set env(UDICONF) [target_info mondfe,udi_soc];
    default_gdb_start
    verbose "Setting up target, Please wait..."
    gdb_target_udi
}

#
# gdb_exit -- exit gdb
#
proc gdb_exit { } {
    catch default_gdb_exit
    set in [open [concat "|ls -F"] r]
    while {[gets $in line]>-1} {
	if [regexp "=$" $line] then {
	    set line [string trimright $line "="]
	    verbose "Removing the $line named socket"
	    exec rm -f $line
	}
    }
    close $in
}
