/* Target operations for the remote server for GDB.
- Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ Copyright (C) 2002-2021 Free Software Foundation, Inc.
Contributed by MontaVista Software.
#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;
CORE_ADDR step_range_end; /* Exclusive */
};
-class process_target;
-
/* 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. */
-struct process_stratum_target
-{
- /* Returns true if the target can software single step. */
- int (*supports_software_single_step) (void);
-
- /* Return 1 if the target supports catch syscall, 0 (or leave the
- callback NULL) otherwise. */
- int (*supports_catch_syscall) (void);
-
- /* Return tdesc index for IPA. */
- int (*get_ipa_tdesc_idx) (void);
- /* The object that will gradually replace this struct. */
- process_target *pt;
-};
-
-class process_target
+class process_stratum_target
{
public:
- virtual ~process_target () = default;
+ virtual ~process_stratum_target () = default;
/* Start a new process.
no child stop to report, return is
null_ptid/TARGET_WAITKIND_IGNORE. */
virtual ptid_t wait (ptid_t ptid, target_waitstatus *status,
- int options) = 0;
+ target_wait_flags options) = 0;
/* Fetch registers from the inferior process.
virtual int get_tls_address (thread_info *thread, CORE_ADDR offset,
CORE_ADDR load_module, CORE_ADDR *address);
- /* Fill BUF with an hostio error packet representing the last hostio
- error. */
- virtual void hostio_last_error (char *buf);
-
/* Return true if the qxfer_osdata target op is supported. */
virtual bool supports_qxfer_osdata ();
unsigned char *myaddr, unsigned int len);
/* Target specific qSupported support. FEATURES is an array of
- features with COUNT elements. */
- virtual void process_qsupported (char **features, int count);
+ 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 ();
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 char *pid_to_exec_file (int pid);
+ virtual const char *pid_to_exec_file (int pid);
/* Return true if any of the multifs ops is supported. */
virtual bool supports_multifs ();
and the handle's length via HANDLE_LEN. */
virtual bool thread_handle (ptid_t ptid, gdb_byte **handle,
int *handle_len);
+
+ /* 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->pt->create_inferior (program, program_args)
+ the_target->create_inferior (program, program_args)
#define target_post_create_inferior() \
- the_target->pt->post_create_inferior ()
+ the_target->post_create_inferior ()
#define myattach(pid) \
- the_target->pt->attach (pid)
+ the_target->attach (pid)
int kill_inferior (process_info *proc);
#define target_supports_fork_events() \
- the_target->pt->supports_fork_events ()
+ the_target->supports_fork_events ()
#define target_supports_vfork_events() \
- the_target->pt->supports_vfork_events ()
+ the_target->supports_vfork_events ()
#define target_supports_exec_events() \
- the_target->pt->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->pt->handle_new_gdb_connection ()
+ the_target->handle_new_gdb_connection ()
#define detach_inferior(proc) \
- the_target->pt->detach (proc)
+ the_target->detach (proc)
#define mythread_alive(pid) \
- the_target->pt->thread_alive (pid)
+ the_target->thread_alive (pid)
#define fetch_inferior_registers(regcache, regno) \
- the_target->pt->fetch_registers (regcache, regno)
+ the_target->fetch_registers (regcache, regno)
#define store_inferior_registers(regcache, regno) \
- the_target->pt->store_registers (regcache, regno)
+ the_target->store_registers (regcache, regno)
#define join_inferior(pid) \
- the_target->pt->join (pid)
+ the_target->join (pid)
#define target_supports_non_stop() \
- the_target->pt->supports_non_stop ()
+ the_target->supports_non_stop ()
#define target_async(enable) \
- the_target->pt->async (enable)
+ the_target->async (enable)
-#define target_process_qsupported(features, count) \
- the_target->pt->process_qsupported (features, count)
+#define target_process_qsupported(features) \
+ the_target->process_qsupported (features)
#define target_supports_catch_syscall() \
- (the_target->supports_catch_syscall ? \
- (*the_target->supports_catch_syscall) () : 0)
+ the_target->supports_catch_syscall ()
#define target_get_ipa_tdesc_idx() \
- (the_target->get_ipa_tdesc_idx \
- ? (*the_target->get_ipa_tdesc_idx) () : 0)
+ the_target->get_ipa_tdesc_idx ()
#define target_supports_tracepoints() \
- the_target->pt->supports_tracepoints ()
+ the_target->supports_tracepoints ()
#define target_supports_fast_tracepoints() \
- the_target->pt->supports_fast_tracepoints ()
+ the_target->supports_fast_tracepoints ()
#define target_get_min_fast_tracepoint_insn_len() \
- the_target->pt->get_min_fast_tracepoint_insn_len ()
+ the_target->get_min_fast_tracepoint_insn_len ()
#define target_thread_stopped(thread) \
- the_target->pt->thread_stopped (thread)
+ the_target->thread_stopped (thread)
#define target_pause_all(freeze) \
- the_target->pt->pause_all (freeze)
+ the_target->pause_all (freeze)
#define target_unpause_all(unfreeze) \
- the_target->pt->unpause_all (unfreeze)
+ the_target->unpause_all (unfreeze)
#define target_stabilize_threads() \
- the_target->pt->stabilize_threads ()
+ the_target->stabilize_threads ()
#define target_install_fast_tracepoint_jump_pad(tpoint, tpaddr, \
collector, lockaddr, \
adjusted_insn_addr, \
adjusted_insn_addr_end, \
err) \
- the_target->pt->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->pt->emit_ops ()
+ the_target->emit_ops ()
#define target_supports_disable_randomization() \
- the_target->pt->supports_disable_randomization ()
+ the_target->supports_disable_randomization ()
#define target_supports_agent() \
- the_target->pt->supports_agent ()
+ the_target->supports_agent ()
static inline struct btrace_target_info *
target_enable_btrace (ptid_t ptid, const struct btrace_config *conf)
{
- return the_target->pt->enable_btrace (ptid, conf);
+ return the_target->enable_btrace (ptid, conf);
}
static inline int
target_disable_btrace (struct btrace_target_info *tinfo)
{
- return the_target->pt->disable_btrace (tinfo);
+ return the_target->disable_btrace (tinfo);
}
static inline int
struct buffer *buffer,
enum btrace_read_type type)
{
- return the_target->pt->read_btrace (tinfo, buffer, 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->pt->read_btrace_conf (tinfo, buffer);
+ return the_target->read_btrace_conf (tinfo, buffer);
}
#define target_supports_range_stepping() \
- the_target->pt->supports_range_stepping ()
+ the_target->supports_range_stepping ()
#define target_supports_stopped_by_sw_breakpoint() \
- the_target->pt->supports_stopped_by_sw_breakpoint ()
+ the_target->supports_stopped_by_sw_breakpoint ()
#define target_stopped_by_sw_breakpoint() \
- the_target->pt->stopped_by_sw_breakpoint ()
+ the_target->stopped_by_sw_breakpoint ()
#define target_supports_stopped_by_hw_breakpoint() \
- the_target->pt->supports_stopped_by_hw_breakpoint ()
+ the_target->supports_stopped_by_hw_breakpoint ()
#define target_supports_hardware_single_step() \
- the_target->pt->supports_hardware_single_step ()
+ the_target->supports_hardware_single_step ()
#define target_stopped_by_hw_breakpoint() \
- the_target->pt->stopped_by_hw_breakpoint ()
+ the_target->stopped_by_hw_breakpoint ()
#define target_breakpoint_kind_from_pc(pcptr) \
- the_target->pt->breakpoint_kind_from_pc (pcptr)
+ the_target->breakpoint_kind_from_pc (pcptr)
#define target_breakpoint_kind_from_current_state(pcptr) \
- the_target->pt->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 ? \
- (*the_target->supports_software_single_step) () : 0)
+ the_target->supports_software_single_step ()
-ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
- int connected_wait);
+ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus,
+ target_wait_flags options, int connected_wait);
/* Prepare to read or write memory from the inferior process. See the
corresponding process_stratum_target methods for more details. */
void done_accessing_memory (void);
#define target_core_of_thread(ptid) \
- the_target->pt->core_of_thread (ptid)
+ the_target->core_of_thread (ptid)
#define target_thread_name(ptid) \
- the_target->pt->thread_name (ptid)
+ the_target->thread_name (ptid)
#define target_thread_handle(ptid, handle, handle_len) \
- the_target->pt->thread_handle (ptid, handle, handle_len)
+ the_target->thread_handle (ptid, handle, handle_len)
int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);