# Copyright 2011-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 is a dejagnu "board file" and is used to run the testsuite
# natively with gdbserver using stdio for comms.
#
# To use this file:
# bash$ cd ${build_dir}/gdb
# bash$ make check RUNTESTFLAGS="--target_board=native-stdio-gdbserver"

load_generic_config "gdbserver"
load_board_description "gdbserver-base"

# This gdbserver can only run a process once per session.
set_board_info gdb,do_reload_on_run 1

# There's no support for argument-passing (yet).
set_board_info noargs 1

# Hack into sockethost to pass our peculiar remote connection string.
set_board_info sockethost "stdio"
set_board_info gdb,socketport ""
set_board_info gdb,get_remote_address ${board}_get_remote_address
set_board_info use_gdb_stub 1

# We will be using the standard GDB remote protocol.
set_board_info gdb_protocol "remote"

# The argument to pass to "target remote".
# We build this once we know how the testsuite will start gdbserver.
set stdio_gdbserver_template "| @GDBSERVER_PROG@ @ARGS@ stdio @PROG_AND_ARGS@"

# Used to pass a value between ${board}_spawn and ${board}_get_remote_address.
set stdio_gdbserver_command "--unset--"

proc ${board}_get_remote_address { host port } {
    global stdio_gdbserver_command
    return $stdio_gdbserver_command
}

proc ${board}_build_remote_cmd { cmd } {
    global stdio_gdbserver_template

    # First parse $cmd, picking out the various pieces.
    set gdbserver_prog [lindex $cmd 0]
    set args ""
    set len [llength $cmd]

    for { set i 1 } { $i < $len } { incr i } {
	set elm [lindex $cmd $i]
	switch $elm {
	    --multi {
		set args "$args $elm"
	    }
	    --once {
		set args "$args $elm"
	    }
	    default {
		break
	    }
	}
    }

    set prog_and_args [lrange $cmd $i end]

    set buf $stdio_gdbserver_template

    regsub {@GDBSERVER_PROG@} $buf $gdbserver_prog buf
    regsub {@ARGS@} $buf $args buf
    regsub {@PROG_AND_ARGS@} $buf $prog_and_args buf

    return $buf
}

proc ${board}_spawn { board cmd } {
    global board_info

    verbose -log "${board}_spawn: $board $cmd"

    # Convert the command to start gdbserver to something to pass to
    # "target remote | ..." and save it for later retrieval by
    # ${board}_get_remote_address.
    global stdio_gdbserver_command
    set stdio_gdbserver_command [${board}_build_remote_cmd $cmd]
    verbose -log "gdbserver_command: $stdio_gdbserver_command"

    set baseboard [lindex [split $board "/"] 0]

    # We don't spawn gdbserver here, that is done by the subsequent
    # "target remote | ..." command.
    set board_info($baseboard,isremote) 0
    # Pretend as if we've started gdbserver, provide the test harness
    # with what it's waiting for.
    set result [remote_spawn $board "echo Listening on stdio"]
    set board_info($baseboard,isremote) 1

    return $result
}

proc ${board}_exec { hostname program args } {
    global board_info

    set baseboard [lindex [split $hostname "/"] 0]

    set board_info($baseboard,isremote) 0
    set result [remote_exec $hostname $program $args]
    set board_info($baseboard,isremote) 1

    return $result
}
