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