# Copyright 2011-2021 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 has common bits shared between other dejagnu "board files"
# that are used to run the testsuite with gdbserver connected via
# stdio.  Boards that source this must reimplement the
# get_target_remote_pipe_address procedure.

load_board_description "gdbserver-base"

# Note this is loaded for gdb_target_cmd, not for making this board
# use the generic "gdbserver" config.
load_lib gdbserver-support.exp

# 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

set_board_info use_gdb_stub 1
set_board_info exit_is_reliable 1

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

# Return the CMD string in "target remote | CMD".
proc get_target_remote_pipe_cmd {} {
    error "must reimplement this procedure"
}

proc make_gdbserver_stdio_port {} {
    return "| [get_target_remote_pipe_cmd]"
}

proc gdb_reload { {inferior_args {}} } {
    return [gdb_target_cmd "remote" [make_gdbserver_stdio_port]]
}

proc mi_gdb_target_load { } {
    return [mi_gdb_target_cmd "remote" [make_gdbserver_stdio_port]]
}
