#   Copyright 1993-2013 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/>.

# This file was written by Ian Lance Taylor <ian@cygnus.com>.

# GDB support routines for a board using the MIPS remote debugging
# protocol.  These are actually pretty generic.

# DejaGnu currently assumes that debugging is being done over the main
# console port.  It would probably be more convenient for people using
# IDT boards to permit the debugging port and the connected port to be
# different, since an IDT board has two ports.  This would require
# extending some of the tests in a fashion similar to that done for
# VxWorks, because the test output would appear on the other port,
# rather than being displayed by gdb.

load_lib remote.exp
load_lib gdb.exp
set gdb_prompt "\\(gdb\\)"

#
# gdb_load -- load a file into the GDB. 
#             Returns a 0 if there was an error,
#                       1 if it load successfully.
#
proc gdb_load { arg } {
    global verbose
    global loadpath
    global loadfile
    global gdb_prompt
    global GDB
    global expect_out

    set loadfile [file tail $arg]
    set loadpath [file dirname $arg]

    gdb_file_cmd $arg

    if [target_info exists gdb_protocol] {
	set protocol [target_info gdb_protocol]
    } else {
	set protocol "sparclite"
    }

    if [target_info exists serial] {
	set targetname [target_info serial]
	set command "target $protocol [target_info serial]\n"
    } else {
	if ![target_info exists netport] {
	    perror "Need either netport or gdb_serial entry for [target_info name]."
	    return -1
	}
	set targetname [target_info netport]
	set command "target $protocol udp [target_info netport]\n"
    }
    set timeout 60
    verbose "Timeout is now $timeout seconds" 2
    set try_count 0
    send_gdb $command
    gdb_expect {
	 -re "Unknown response.*resetting the board.|remote timeout" {
	    incr try_count
	    if { $try_count > 3 } {
		set try_count 0
		reboot_target
		sleep 5
	    }
	    sleep 1
	    send_gdb $command
	    exp_continue
	}
	 -re "Remote target.*$gdb_prompt $" { }
	 -re ".*SPARClite appears to be alive.*$gdb_prompt $"	{
	    if $verbose>1 then {
		send_user "Set target to $targetname\n"
	    }
	}
	 timeout { 
	    perror "Couldn't set SLITE target."
	    set timeout 10
	    verbose "Timeout is now $timeout seconds" 2
	    return -1
	}
    }
    
    if [target_info exists gdb_load_offset] {
	set offset "[target_info gdb_load_offset]"
    } else {
	set offset ""
    }
    if { 1 } {
	if [is_remote host] {
	    set arg [remote_download host $arg]
	    if { $arg == "" } {
		error "download failed"
		return -1
	    }
	}
	send_gdb "load $arg $offset\n"
	verbose "Loading $arg into $GDB" 2
	set timeout 2400
	verbose "Timeout is now $timeout seconds" 2
	gdb_expect {
	     -re "Loading.*$gdb_prompt $" {
		verbose "Loaded $arg into $GDB" 1
		set timeout 30
		verbose "Timeout is now $timeout seconds" 2
	    }
	     -re "$gdb_prompt $"     {
		if $verbose>1 then {
		    perror "GDB couldn't load."
		}
	    }
	     timeout {
		if $verbose>1 then {
		    perror "Timed out trying to load $arg."
		}
	    }
	}
    }
    # Some SPARClite boards automagically do a run after the program is
    # loaded.
    if [target_info exists need_monitor_run] {
	set timeout 10
	verbose "Timeout is now $timeout seconds, doing monitor run" 2
	send_gdb "monitor run\n"
	sleep 2
	send_gdb ""
	gdb_expect {
	     -re ".*$gdb_prompt $" { verbose "Run command succeded" }
	     default {
		perror "error sending monitor run command"
	    }
	}
    } else {
	sleep 2
    }

    if [target_info exists gdb_serial] {
	set serial [target_info gdb_serial]
    } else {
	set serial [target_info serial]
    }
    send_gdb "target remote $serial\n"
    set timeout 60
    verbose "Timeout is now $timeout seconds" 2
    gdb_expect {
	 -re ".*Kill it?.*y or n.*" {
	    send_gdb "y\n"
	    exp_continue
	}
	 -re ".*$gdb_prompt $"	{
	    verbose "Set remote target to [target_info serial]" 2
	}
	 timeout {
	    perror "Couldn't set remote target."
	    set timeout 10
	    verbose "Timeout is now $timeout seconds" 2
	    return -1
	}
    }

    if [info exists expect_out(buffer)] then {
	send_log $expect_out(buffer)
    }
    return 0
}
