shared code. */
struct process_stratum_target
{
- /* Prepare to read or write memory from the inferior process.
- Targets use this to do what is necessary to get the state of the
- inferior such that it is possible to access memory.
-
- This should generally only be called from client facing routines,
- such as gdb_read_memory/gdb_write_memory, or the GDB breakpoint
- insertion routine.
-
- Like `read_memory' and `write_memory' below, returns 0 on success
- and errno on failure. */
-
- int (*prepare_to_access_memory) (void);
-
- /* Undo the effects of prepare_to_access_memory. */
-
- void (*done_accessing_memory) (void);
-
- /* 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. */
-
- int (*read_memory) (CORE_ADDR memaddr, unsigned char *myaddr, int len);
-
- /* 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. */
-
- int (*write_memory) (CORE_ADDR memaddr, const unsigned char *myaddr,
- int len);
-
- /* 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. NULL if we aren't interested in any
- symbols. */
-
- void (*look_up_symbols) (void);
-
- /* Send an interrupt request to the inferior process,
- however is appropriate. */
-
- void (*request_interrupt) (void);
-
- /* Read auxiliary vector data from the inferior process.
-
- Read LEN bytes at OFFSET into a buffer at MYADDR. */
-
- 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
- */
- int (*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. */
-
- int (*insert_point) (enum raw_bkpt_type type, CORE_ADDR addr,
- int size, struct raw_breakpoint *bp);
- int (*remove_point) (enum raw_bkpt_type type, CORE_ADDR addr,
- int size, struct raw_breakpoint *bp);
-
- /* Returns 1 if the target stopped because it executed a software
- breakpoint instruction, 0 otherwise. */
- int (*stopped_by_sw_breakpoint) (void);
-
- /* Returns true if the target knows whether a trap was caused by a
- SW breakpoint triggering. */
- int (*supports_stopped_by_sw_breakpoint) (void);
-
- /* Returns 1 if the target stopped for a hardware breakpoint. */
- int (*stopped_by_hw_breakpoint) (void);
-
- /* Returns true if the target knows whether a trap was caused by a
- HW breakpoint triggering. */
- int (*supports_stopped_by_hw_breakpoint) (void);
-
- /* Returns true if the target can do hardware single step. */
- int (*supports_hardware_single_step) (void);
-
- /* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise. */
-
- int (*stopped_by_watchpoint) (void);
-
- /* Returns the address associated with the watchpoint that hit, if any;
- returns 0 otherwise. */
-
- CORE_ADDR (*stopped_data_address) (void);
-
- /* Reports the text, data offsets of the executable. This is
- needed for uclinux where the executable is relocated during load
- time. */
-
- int (*read_offsets) (CORE_ADDR *text, CORE_ADDR *data);
-
- /* 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. */
-
- int (*get_tls_address) (struct 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. */
- void (*hostio_last_error) (char *buf);
-
- /* Read/Write OS data using qXfer packets. */
- int (*qxfer_osdata) (const char *annex, unsigned char *readbuf,
- unsigned const char *writebuf, CORE_ADDR offset,
- int len);
-
- /* Read/Write extra signal info. */
- int (*qxfer_siginfo) (const char *annex, unsigned char *readbuf,
- unsigned const char *writebuf,
- CORE_ADDR offset, int len);
-
- int (*supports_non_stop) (void);
-
- /* Enables async target events. Returns the previous enable
- state. */
- int (*async) (int enable);
-
- /* Switch to non-stop (1) or all-stop (0) mode. Return 0 on
- success, -1 otherwise. */
- int (*start_non_stop) (int);
-
- /* Returns true if the target supports multi-process debugging. */
- int (*supports_multi_process) (void);
-
- /* Returns true if fork events are supported. */
- int (*supports_fork_events) (void);
-
- /* Returns true if vfork events are supported. */
- int (*supports_vfork_events) (void);
-
- /* Returns true if exec events are supported. */
- int (*supports_exec_events) (void);
-
- /* Allows target to re-initialize connection-specific settings. */
- void (*handle_new_gdb_connection) (void);
-
- /* If not NULL, target-specific routine to process monitor command.
- Returns 1 if handled, or 0 to perform default processing. */
- int (*handle_monitor_command) (char *);
-
- /* Returns the core given a thread, or -1 if not known. */
- int (*core_of_thread) (ptid_t);
-
- /* Read loadmaps. Read LEN bytes at OFFSET into a buffer at MYADDR. */
- 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 with COUNT elements. */
- void (*process_qsupported) (char **features, int count);
-
- /* Return 1 if the target supports tracepoints, 0 (or leave the
- callback NULL) otherwise. */
- int (*supports_tracepoints) (void);
-
/* Read PC from REGCACHE. */
CORE_ADDR (*read_pc) (struct regcache *regcache);
If REGNO is -1, store all registers; otherwise, store at least REGNO. */
virtual void store_registers (regcache *regcache, int regno) = 0;
+
+ /* Prepare to read or write memory from the inferior process.
+ Targets use this to do what is necessary to get the state of the
+ inferior such that it is possible to access memory.
+
+ This should generally only be called from client facing routines,
+ such as gdb_read_memory/gdb_write_memory, or the GDB breakpoint
+ insertion routine.
+
+ Like `read_memory' and `write_memory' below, returns 0 on success
+ and errno on failure. */
+ virtual int prepare_to_access_memory ();
+
+ /* Undo the effects of prepare_to_access_memory. */
+ virtual void done_accessing_memory ();
+
+ /* 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);
+
+ /* 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 ();
+
+ /* 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 with COUNT elements. */
+ virtual void process_qsupported (char **features, int count);
+
+ /* Return true if the target supports tracepoints, false otherwise. */
+ virtual bool supports_tracepoints ();
};
extern process_stratum_target *the_target;
int kill_inferior (process_info *proc);
#define target_supports_fork_events() \
- (the_target->supports_fork_events ? \
- (*the_target->supports_fork_events) () : 0)
+ the_target->pt->supports_fork_events ()
#define target_supports_vfork_events() \
- (the_target->supports_vfork_events ? \
- (*the_target->supports_vfork_events) () : 0)
+ the_target->pt->supports_vfork_events ()
#define target_supports_exec_events() \
- (the_target->supports_exec_events ? \
- (*the_target->supports_exec_events) () : 0)
+ the_target->pt->supports_exec_events ()
#define target_handle_new_gdb_connection() \
- do \
- { \
- if (the_target->handle_new_gdb_connection != NULL) \
- (*the_target->handle_new_gdb_connection) (); \
- } while (0)
+ the_target->pt->handle_new_gdb_connection ()
#define detach_inferior(proc) \
the_target->pt->detach (proc)
the_target->pt->join (pid)
#define target_supports_non_stop() \
- (the_target->supports_non_stop ? (*the_target->supports_non_stop ) () : 0)
+ the_target->pt->supports_non_stop ()
#define target_async(enable) \
- (the_target->async ? (*the_target->async) (enable) : 0)
+ the_target->pt->async (enable)
#define target_process_qsupported(features, count) \
- do \
- { \
- if (the_target->process_qsupported) \
- the_target->process_qsupported (features, count); \
- } while (0)
+ the_target->pt->process_qsupported (features, count)
#define target_supports_catch_syscall() \
(the_target->supports_catch_syscall ? \
? (*the_target->get_ipa_tdesc_idx) () : 0)
#define target_supports_tracepoints() \
- (the_target->supports_tracepoints \
- ? (*the_target->supports_tracepoints) () : 0)
+ the_target->pt->supports_tracepoints ()
#define target_supports_fast_tracepoints() \
(the_target->install_fast_tracepoint_jump_pad != NULL)
(*the_target->supports_range_stepping) () : 0)
#define target_supports_stopped_by_sw_breakpoint() \
- (the_target->supports_stopped_by_sw_breakpoint ? \
- (*the_target->supports_stopped_by_sw_breakpoint) () : 0)
+ the_target->pt->supports_stopped_by_sw_breakpoint ()
#define target_stopped_by_sw_breakpoint() \
- (the_target->stopped_by_sw_breakpoint ? \
- (*the_target->stopped_by_sw_breakpoint) () : 0)
+ the_target->pt->stopped_by_sw_breakpoint ()
#define target_supports_stopped_by_hw_breakpoint() \
- (the_target->supports_stopped_by_hw_breakpoint ? \
- (*the_target->supports_stopped_by_hw_breakpoint) () : 0)
+ the_target->pt->supports_stopped_by_hw_breakpoint ()
#define target_supports_hardware_single_step() \
- (the_target->supports_hardware_single_step ? \
- (*the_target->supports_hardware_single_step) () : 0)
+ the_target->pt->supports_hardware_single_step ()
#define target_stopped_by_hw_breakpoint() \
- (the_target->stopped_by_hw_breakpoint ? \
- (*the_target->stopped_by_hw_breakpoint) () : 0)
+ the_target->pt->stopped_by_hw_breakpoint ()
#define target_breakpoint_kind_from_pc(pcptr) \
(the_target->breakpoint_kind_from_pc \
(the_target->supports_software_single_step ? \
(*the_target->supports_software_single_step) () : 0)
-/* Start non-stop mode, returns 0 on success, -1 on failure. */
-
-int start_non_stop (int nonstop);
-
ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
int connected_wait);
void done_accessing_memory (void);
#define target_core_of_thread(ptid) \
- (the_target->core_of_thread ? (*the_target->core_of_thread) (ptid) \
- : -1)
+ the_target->pt->core_of_thread (ptid)
#define target_thread_name(ptid) \
(the_target->thread_name ? (*the_target->thread_name) (ptid) \
const char *target_pid_to_str (ptid_t);
-int target_can_do_hardware_single_step (void);
-
int default_breakpoint_kind_from_pc (CORE_ADDR *pcptr);
#endif /* GDBSERVER_TARGET_H */