/* Target operations for the remote server for GDB.
   Copyright (C) 2002-2022 Free Software Foundation, Inc.

   Contributed by MontaVista Software.

   This file is part of GDB.

   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/>.  */

#ifndef GDBSERVER_TARGET_H
#define GDBSERVER_TARGET_H

#include <sys/types.h> /* for mode_t */
#include "target/target.h"
#include "target/resume.h"
#include "target/wait.h"
#include "target/waitstatus.h"
#include "mem-break.h"
#include "gdbsupport/array-view.h"
#include "gdbsupport/btrace-common.h"
#include <vector>
#include "gdbsupport/byte-vector.h"

struct emit_ops;
struct buffer;
struct process_info;

/* This structure describes how to resume a particular thread (or all
   threads) based on the client's request.  If thread is -1, then this
   entry applies to all threads.  These are passed around as an
   array.  */

struct thread_resume
{
  ptid_t thread;

  /* How to "resume".  */
  enum resume_kind kind;

  /* If non-zero, send this signal when we resume, or to stop the
     thread.  If stopping a thread, and this is 0, the target should
     stop the thread however it best decides to (e.g., SIGSTOP on
     linux; SuspendThread on win32).  This is a host signal value (not
     enum gdb_signal).  */
  int sig;

  /* Range to single step within.  Valid only iff KIND is resume_step.

     Single-step once, and then continuing stepping as long as the
     thread stops in this range.  (If the range is empty
     [STEP_RANGE_START == STEP_RANGE_END], then this is a single-step
     request.)  */
  CORE_ADDR step_range_start;	/* Inclusive */
  CORE_ADDR step_range_end;	/* Exclusive */
};

/* GDBserver doesn't have a concept of strata like GDB, but we call
   its target vector "process_stratum" anyway for the benefit of
   shared code.  */

class process_stratum_target
{
public:

  virtual ~process_stratum_target () = default;

  /* Start a new process.

     PROGRAM is a path to the program to execute.
     PROGRAM_ARGS is a standard NULL-terminated array of arguments,
     to be passed to the inferior as ``argv'' (along with PROGRAM).

     Returns the new PID on success, -1 on failure.  Registers the new
     process with the process list.  */
  virtual int create_inferior (const char *program,
			       const std::vector<char *> &program_args) = 0;

  /* Do additional setup after a new process is created, including
     exec-wrapper completion.  */
  virtual void post_create_inferior ();

  /* Attach to a running process.

     PID is the process ID to attach to, specified by the user
     or a higher layer.

     Returns -1 if attaching is unsupported, 0 on success, and calls
     error() otherwise.  */
  virtual int attach (unsigned long pid) = 0;

  /* Kill process PROC.  Return -1 on failure, and 0 on success.  */
  virtual int kill (process_info *proc) = 0;

  /* Detach from process PROC.  Return -1 on failure, and 0 on
     success.  */
  virtual int detach (process_info *proc) = 0;

  /* The inferior process has died.  Do what is right.  */
  virtual void mourn (process_info *proc) = 0;

  /* Wait for process PID to exit.  */
  virtual void join (int pid) = 0;

  /* Return true iff the thread with process ID PID is alive.  */
  virtual bool thread_alive (ptid_t pid) = 0;

  /* Resume the inferior process.  */
  virtual void resume (thread_resume *resume_info, size_t n) = 0;

  /* Wait for the inferior process or thread to change state.  Store
     status through argument pointer STATUS.

     PTID = -1 to wait for any pid to do something, PTID(pid,0,0) to
     wait for any thread of process pid to do something.  Return ptid
     of child, or -1 in case of error; store status through argument
     pointer STATUS.  OPTIONS is a bit set of options defined as
     TARGET_W* above.  If options contains TARGET_WNOHANG and there's
     no child stop to report, return is
     null_ptid/TARGET_WAITKIND_IGNORE.  */
  virtual ptid_t wait (ptid_t ptid, target_waitstatus *status,
		       target_wait_flags options) = 0;

  /* Fetch registers from the inferior process.

     If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
  virtual void fetch_registers (regcache *regcache, int regno) = 0;

  /* Store registers to the inferior process.

     If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
  virtual void store_registers (regcache *regcache, int regno) = 0;

  /* Read memory from the inferior process.  This should generally be
     called through read_inferior_memory, which handles breakpoint shadowing.

     Read LEN bytes at MEMADDR into a buffer at MYADDR.

     Returns 0 on success and errno on failure.  */
  virtual int read_memory (CORE_ADDR memaddr, unsigned char *myaddr,
			   int len) = 0;

  /* Write memory to the inferior process.  This should generally be
     called through target_write_memory, which handles breakpoint shadowing.

     Write LEN bytes from the buffer at MYADDR to MEMADDR.

     Returns 0 on success and errno on failure.  */
  virtual int write_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
			    int len) = 0;

  /* Query GDB for the values of any symbols we're interested in.
     This function is called whenever we receive a "qSymbols::"
     query, which corresponds to every time more symbols (might)
     become available.  */
  virtual void look_up_symbols ();

  /* Send an interrupt request to the inferior process,
     however is appropriate.  */
  virtual void request_interrupt () = 0;

  /* Return true if the read_auxv target op is supported.  */
  virtual bool supports_read_auxv ();

  /* Read auxiliary vector data from the inferior process.

     Read LEN bytes at OFFSET into a buffer at MYADDR.  */
  virtual int read_auxv (CORE_ADDR offset, unsigned char *myaddr,
			 unsigned int len);

  /* Returns true if GDB Z breakpoint type TYPE is supported, false
     otherwise.  The type is coded as follows:
       '0' - software-breakpoint
       '1' - hardware-breakpoint
       '2' - write watchpoint
       '3' - read watchpoint
       '4' - access watchpoint
  */
  virtual bool supports_z_point_type (char z_type);

  /* Insert and remove a break or watchpoint.
     Returns 0 on success, -1 on failure and 1 on unsupported.  */
  virtual int insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
			    int size, raw_breakpoint *bp);

  virtual int remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
			    int size, raw_breakpoint *bp);

  /* Returns true if the target stopped because it executed a software
     breakpoint instruction, false otherwise.  */
  virtual bool stopped_by_sw_breakpoint ();

  /* Returns true if the target knows whether a trap was caused by a
     SW breakpoint triggering.  */
  virtual bool supports_stopped_by_sw_breakpoint ();

  /* Returns true if the target stopped for a hardware breakpoint.  */
  virtual bool stopped_by_hw_breakpoint ();

  /* Returns true if the target knows whether a trap was caused by a
     HW breakpoint triggering.  */
  virtual bool supports_stopped_by_hw_breakpoint ();

  /* Returns true if the target can do hardware single step.  */
  virtual bool supports_hardware_single_step ();

  /* Returns true if target was stopped due to a watchpoint hit, false
     otherwise.  */
  virtual bool stopped_by_watchpoint ();

  /* Returns the address associated with the watchpoint that hit, if any;
     returns 0 otherwise.  */
  virtual CORE_ADDR stopped_data_address ();

  /* Return true if the read_offsets target op is supported.  */
  virtual bool supports_read_offsets ();

  /* Reports the text, data offsets of the executable.  This is
     needed for uclinux where the executable is relocated during load
     time.  */
  virtual int read_offsets (CORE_ADDR *text, CORE_ADDR *data);

  /* Return true if the get_tls_address target op is supported.  */
  virtual bool supports_get_tls_address ();

  /* Fetch the address associated with a specific thread local storage
     area, determined by the specified THREAD, OFFSET, and LOAD_MODULE.
     Stores it in *ADDRESS and returns zero on success; otherwise returns
     an error code.  A return value of -1 means this system does not
     support the operation.  */
  virtual int get_tls_address (thread_info *thread, CORE_ADDR offset,
			       CORE_ADDR load_module, CORE_ADDR *address);

  /* Return true if the qxfer_osdata target op is supported.  */
  virtual bool supports_qxfer_osdata ();

  /* Read/Write OS data using qXfer packets.  */
  virtual int qxfer_osdata (const char *annex, unsigned char *readbuf,
			    unsigned const char *writebuf,
			    CORE_ADDR offset, int len);

  /* Return true if the qxfer_siginfo target op is supported.  */
  virtual bool supports_qxfer_siginfo ();

  /* Read/Write extra signal info.  */
  virtual int qxfer_siginfo (const char *annex, unsigned char *readbuf,
			     unsigned const char *writebuf,
			     CORE_ADDR offset, int len);

  /* Return true if non-stop mode is supported.  */
  virtual bool supports_non_stop ();

  /* Enables async target events.  Returns the previous enable
     state.  */
  virtual bool async (bool enable);

  /* Switch to non-stop (ENABLE == true) or all-stop (ENABLE == false)
     mode.  Return 0 on success, -1 otherwise.  */
  virtual int start_non_stop (bool enable);

  /* Returns true if the target supports multi-process debugging.  */
  virtual bool supports_multi_process ();

  /* Returns true if fork events are supported.  */
  virtual bool supports_fork_events ();

  /* Returns true if vfork events are supported.  */
  virtual bool supports_vfork_events ();

  /* Returns true if exec events are supported.  */
  virtual bool supports_exec_events ();

  /* Allows target to re-initialize connection-specific settings.  */
  virtual void handle_new_gdb_connection ();

  /* The target-specific routine to process monitor command.
     Returns 1 if handled, or 0 to perform default processing.  */
  virtual int handle_monitor_command (char *mon);

  /* Returns the core given a thread, or -1 if not known.  */
  virtual int core_of_thread (ptid_t ptid);

  /* Returns true if the read_loadmap target op is supported.  */
  virtual bool supports_read_loadmap ();

  /* Read loadmaps.  Read LEN bytes at OFFSET into a buffer at MYADDR.  */
  virtual int read_loadmap (const char *annex, CORE_ADDR offset,
			    unsigned char *myaddr, unsigned int len);

  /* Target specific qSupported support.  FEATURES is an array of
     features unsupported by the core of GDBserver.  */
  virtual void process_qsupported
    (gdb::array_view<const char * const> features);

  /* Return true if the target supports tracepoints, false otherwise.  */
  virtual bool supports_tracepoints ();

  /* Read PC from REGCACHE.  */
  virtual CORE_ADDR read_pc (regcache *regcache);

  /* Write PC to REGCACHE.  */
  virtual void write_pc (regcache *regcache, CORE_ADDR pc);

  /* Return true if the thread_stopped op is supported.  */
  virtual bool supports_thread_stopped ();

  /* Return true if THREAD is known to be stopped now.  */
  virtual bool thread_stopped (thread_info *thread);

  /* Return true if the get_tib_address op is supported.  */
  virtual bool supports_get_tib_address ();

  /* Read Thread Information Block address.  */
  virtual int get_tib_address (ptid_t ptid, CORE_ADDR *address);

  /* Pause all threads.  If FREEZE, arrange for any resume attempt to
     be ignored until an unpause_all call unfreezes threads again.
     There can be nested calls to pause_all, so a freeze counter
     should be maintained.  */
  virtual void pause_all (bool freeze);

  /* Unpause all threads.  Threads that hadn't been resumed by the
     client should be left stopped.  Basically a pause/unpause call
     pair should not end up resuming threads that were stopped before
     the pause call.  */
  virtual void unpause_all (bool unfreeze);

  /* Stabilize all threads.  That is, force them out of jump pads.  */
  virtual void stabilize_threads ();

  /* Return true if the install_fast_tracepoint_jump_pad op is
     supported.  */
  virtual bool supports_fast_tracepoints ();

  /* Install a fast tracepoint jump pad.  TPOINT is the address of the
     tracepoint internal object as used by the IPA agent.  TPADDR is
     the address of tracepoint.  COLLECTOR is address of the function
     the jump pad redirects to.  LOCKADDR is the address of the jump
     pad lock object.  ORIG_SIZE is the size in bytes of the
     instruction at TPADDR.  JUMP_ENTRY points to the address of the
     jump pad entry, and on return holds the address past the end of
     the created jump pad.  If a trampoline is created by the function,
     then TRAMPOLINE and TRAMPOLINE_SIZE return the address and size of
     the trampoline, else they remain unchanged.  JJUMP_PAD_INSN is a
     buffer containing a copy of the instruction at TPADDR.
     ADJUST_INSN_ADDR and ADJUST_INSN_ADDR_END are output parameters that
     return the address range where the instruction at TPADDR was relocated
     to.  If an error occurs, the ERR may be used to pass on an error
     message.  */
  virtual int install_fast_tracepoint_jump_pad
    (CORE_ADDR tpoint, CORE_ADDR tpaddr, CORE_ADDR collector,
     CORE_ADDR lockaddr, ULONGEST orig_size, CORE_ADDR *jump_entry,
     CORE_ADDR *trampoline, ULONGEST *trampoline_size,
     unsigned char *jjump_pad_insn, ULONGEST *jjump_pad_insn_size,
     CORE_ADDR *adjusted_insn_addr, CORE_ADDR *adjusted_insn_addr_end,
     char *err);

  /* Return the minimum length of an instruction that can be safely
     overwritten for use as a fast tracepoint.  */
  virtual int get_min_fast_tracepoint_insn_len ();

  /* Return the bytecode operations vector for the current inferior.
     Returns nullptr if bytecode compilation is not supported.  */
  virtual struct emit_ops *emit_ops ();

  /* Returns true if the target supports disabling randomization.  */
  virtual bool supports_disable_randomization ();

  /* Return true if the qxfer_libraries_svr4 op is supported.  */
  virtual bool supports_qxfer_libraries_svr4 ();

  /* Read solib info on SVR4 platforms.  */
  virtual int qxfer_libraries_svr4 (const char *annex,
				    unsigned char *readbuf,
				    unsigned const char *writebuf,
				    CORE_ADDR offset, int len);

  /* Return true if target supports debugging agent.  */
  virtual bool supports_agent ();

  /* Return true if target supports btrace.  */
  virtual bool supports_btrace ();

  /* Enable branch tracing for TP based on CONF and allocate a branch trace
     target information struct for reading and for disabling branch trace.  */
  virtual btrace_target_info *enable_btrace (thread_info *tp,
					     const btrace_config *conf);

  /* Disable branch tracing.
     Returns zero on success, non-zero otherwise.  */
  virtual int disable_btrace (btrace_target_info *tinfo);

  /* Read branch trace data into buffer.
     Return 0 on success; print an error message into BUFFER and return -1,
     otherwise.  */
  virtual int read_btrace (btrace_target_info *tinfo, buffer *buf,
			   enum btrace_read_type type);

  /* Read the branch trace configuration into BUFFER.
     Return 0 on success; print an error message into BUFFER and return -1
     otherwise.  */
  virtual int read_btrace_conf (const btrace_target_info *tinfo,
				buffer *buf);

  /* Return true if target supports range stepping.  */
  virtual bool supports_range_stepping ();

  /* Return true if the pid_to_exec_file op is supported.  */
  virtual bool supports_pid_to_exec_file ();

  /* Return the full absolute name of the executable file that was
     run to create the process PID.  If the executable file cannot
     be determined, NULL is returned.  Otherwise, a pointer to a
     character string containing the pathname is returned.  This
     string should be copied into a buffer by the client if the string
     will not be immediately used, or if it must persist.  */
  virtual const char *pid_to_exec_file (int pid);

  /* Return true if any of the multifs ops is supported.  */
  virtual bool supports_multifs ();

  /* Multiple-filesystem-aware open.  Like open(2), but operating in
     the filesystem as it appears to process PID.  Systems where all
     processes share a common filesystem should not override this.
     The default behavior is to use open(2).  */
  virtual int multifs_open (int pid, const char *filename,
			    int flags, mode_t mode);

  /* Multiple-filesystem-aware unlink.  Like unlink(2), but operates
     in the filesystem as it appears to process PID.  Systems where
     all processes share a common filesystem should not override this.
     The default behavior is to use unlink(2).  */
  virtual int multifs_unlink (int pid, const char *filename);

  /* Multiple-filesystem-aware readlink.  Like readlink(2), but
     operating in the filesystem as it appears to process PID.
     Systems where all processes share a common filesystem should
     not override this.  The default behavior is to use readlink(2).  */
  virtual ssize_t multifs_readlink (int pid, const char *filename,
				    char *buf, size_t bufsiz);

  /* Return the breakpoint kind for this target based on PC.  The
     PCPTR is adjusted to the real memory location in case a flag
     (e.g., the Thumb bit on ARM) was present in the PC.  */
  virtual int breakpoint_kind_from_pc (CORE_ADDR *pcptr);

  /* Return the software breakpoint from KIND.  KIND can have target
     specific meaning like the Z0 kind parameter.
     SIZE is set to the software breakpoint's length in memory.  */
  virtual const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) = 0;

  /* Return the breakpoint kind for this target based on the current
     processor state (e.g. the current instruction mode on ARM) and the
     PC.  The PCPTR is adjusted to the real memory location in case a
     flag (e.g., the Thumb bit on ARM) is present in the  PC.  */
  virtual int breakpoint_kind_from_current_state (CORE_ADDR *pcptr);

  /* Return the thread's name, or NULL if the target is unable to
     determine it.  The returned value must not be freed by the
     caller.  */
  virtual const char *thread_name (ptid_t thread);

  /* Thread ID to (numeric) thread handle: Return true on success and
     false for failure.  Return pointer to thread handle via HANDLE
     and the handle's length via HANDLE_LEN.  */
  virtual bool thread_handle (ptid_t ptid, gdb_byte **handle,
			      int *handle_len);

  /* If THREAD is a fork child that was not reported to GDB, return its parent
     else nullptr.  */
  virtual thread_info *thread_pending_parent (thread_info *thread);

  /* If THREAD is the parent of a fork child that was not reported to GDB,
     return this child, else nullptr.  */
  virtual thread_info *thread_pending_child (thread_info *thread);

  /* Returns true if the target can software single step.  */
  virtual bool supports_software_single_step ();

  /* Return true if the target supports catch syscall.  */
  virtual bool supports_catch_syscall ();

  /* Return tdesc index for IPA.  */
  virtual int get_ipa_tdesc_idx ();

  /* Returns true if the target supports memory tagging facilities.  */
  virtual bool supports_memory_tagging ();

  /* Return the allocated memory tags of type TYPE associated with
     [ADDRESS, ADDRESS + LEN) in TAGS.

     Returns true if successful and false otherwise.  */
  virtual bool fetch_memtags (CORE_ADDR address, size_t len,
			      gdb::byte_vector &tags, int type);

  /* Write the allocation tags of type TYPE contained in TAGS to the
     memory range [ADDRESS, ADDRESS + LEN).

     Returns true if successful and false otherwise.  */
  virtual bool store_memtags (CORE_ADDR address, size_t len,
			      const gdb::byte_vector &tags, int type);
};

extern process_stratum_target *the_target;

void set_target_ops (process_stratum_target *);

#define target_create_inferior(program, program_args)	\
  the_target->create_inferior (program, program_args)

#define target_post_create_inferior()			 \
  the_target->post_create_inferior ()

#define myattach(pid) \
  the_target->attach (pid)

int kill_inferior (process_info *proc);

#define target_supports_fork_events() \
  the_target->supports_fork_events ()

#define target_supports_vfork_events() \
  the_target->supports_vfork_events ()

#define target_supports_exec_events() \
  the_target->supports_exec_events ()

#define target_supports_memory_tagging() \
  the_target->supports_memory_tagging ()

#define target_handle_new_gdb_connection()		 \
  the_target->handle_new_gdb_connection ()

#define detach_inferior(proc) \
  the_target->detach (proc)

#define mythread_alive(pid) \
  the_target->thread_alive (pid)

#define fetch_inferior_registers(regcache, regno)	\
  the_target->fetch_registers (regcache, regno)

#define store_inferior_registers(regcache, regno) \
  the_target->store_registers (regcache, regno)

#define join_inferior(pid) \
  the_target->join (pid)

#define target_supports_non_stop() \
  the_target->supports_non_stop ()

#define target_async(enable) \
  the_target->async (enable)

#define target_process_qsupported(features) \
  the_target->process_qsupported (features)

#define target_supports_catch_syscall()              	\
  the_target->supports_catch_syscall ()

#define target_get_ipa_tdesc_idx()			\
  the_target->get_ipa_tdesc_idx ()

#define target_supports_tracepoints()			\
  the_target->supports_tracepoints ()

#define target_supports_fast_tracepoints()		\
  the_target->supports_fast_tracepoints ()

#define target_get_min_fast_tracepoint_insn_len()	\
  the_target->get_min_fast_tracepoint_insn_len ()

#define target_thread_stopped(thread) \
  the_target->thread_stopped (thread)

#define target_pause_all(freeze)		\
  the_target->pause_all (freeze)

#define target_unpause_all(unfreeze)		\
  the_target->unpause_all (unfreeze)

#define target_stabilize_threads()		\
  the_target->stabilize_threads ()

#define target_install_fast_tracepoint_jump_pad(tpoint, tpaddr,		\
						collector, lockaddr,	\
						orig_size,		\
						jump_entry,		\
						trampoline, trampoline_size, \
						jjump_pad_insn,		\
						jjump_pad_insn_size,	\
						adjusted_insn_addr,	\
						adjusted_insn_addr_end,	\
						err)			\
  the_target->install_fast_tracepoint_jump_pad (tpoint, tpaddr,	\
						collector,lockaddr,	\
						orig_size, jump_entry,	\
						trampoline,		\
						trampoline_size,	\
						jjump_pad_insn,		\
						jjump_pad_insn_size,	\
						adjusted_insn_addr,	\
						adjusted_insn_addr_end, \
						err)

#define target_emit_ops() \
  the_target->emit_ops ()

#define target_supports_disable_randomization() \
  the_target->supports_disable_randomization ()

#define target_supports_agent() \
  the_target->supports_agent ()

static inline struct btrace_target_info *
target_enable_btrace (thread_info *tp, const struct btrace_config *conf)
{
  return the_target->enable_btrace (tp, conf);
}

static inline int
target_disable_btrace (struct btrace_target_info *tinfo)
{
  return the_target->disable_btrace (tinfo);
}

static inline int
target_read_btrace (struct btrace_target_info *tinfo,
		    struct buffer *buffer,
		    enum btrace_read_type type)
{
  return the_target->read_btrace (tinfo, buffer, type);
}

static inline int
target_read_btrace_conf (struct btrace_target_info *tinfo,
			 struct buffer *buffer)
{
  return the_target->read_btrace_conf (tinfo, buffer);
}

#define target_supports_range_stepping() \
  the_target->supports_range_stepping ()

#define target_supports_stopped_by_sw_breakpoint() \
  the_target->supports_stopped_by_sw_breakpoint ()

#define target_stopped_by_sw_breakpoint() \
  the_target->stopped_by_sw_breakpoint ()

#define target_supports_stopped_by_hw_breakpoint() \
  the_target->supports_stopped_by_hw_breakpoint ()

#define target_supports_hardware_single_step() \
  the_target->supports_hardware_single_step ()

#define target_stopped_by_hw_breakpoint() \
  the_target->stopped_by_hw_breakpoint ()

#define target_breakpoint_kind_from_pc(pcptr) \
  the_target->breakpoint_kind_from_pc (pcptr)

#define target_breakpoint_kind_from_current_state(pcptr) \
  the_target->breakpoint_kind_from_current_state (pcptr)

#define target_supports_software_single_step() \
  the_target->supports_software_single_step ()

ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus,
	       target_wait_flags options, int connected_wait);

#define target_core_of_thread(ptid)		\
  the_target->core_of_thread (ptid)

#define target_thread_name(ptid)                                \
  the_target->thread_name (ptid)

#define target_thread_handle(ptid, handle, handle_len) \
  the_target->thread_handle (ptid, handle, handle_len)

static inline thread_info *
target_thread_pending_parent (thread_info *thread)
{
  return the_target->thread_pending_parent (thread);
}

static inline thread_info *
target_thread_pending_child (thread_info *thread)
{
  return the_target->thread_pending_child (thread);
}

int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);

/* Set GDBserver's current thread to the thread the client requested
   via Hg.  Also switches the current process to the requested
   process.  If the requested thread is not found in the thread list,
   then the current thread is set to NULL.  Likewise, if the requested
   process is not found in the process list, then the current process
   is set to NULL.  Returns true if the requested thread was found,
   false otherwise.  */

bool set_desired_thread ();

/* Set GDBserver's current process to the process the client requested
   via Hg.  The current thread is set to NULL.  */

bool set_desired_process ();

std::string target_pid_to_str (ptid_t);

#endif /* GDBSERVER_TARGET_H */
