X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Ftarget.h;h=1b0810ba04987e2522a00735833ee7c7e5d290bc;hb=5b6d1e4fa4fc6827c7b3f0e99ff120dfa14d65d2;hp=a09ba2fd54f8d41a8be6b56233e58097b7e97803;hpb=a67a9faef0e32886c83611cc7a0ba61e91123063;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index a09ba2fd54..1b0810ba04 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -1,5 +1,5 @@ /* Target operations for the remote server for GDB. - Copyright (C) 2002-2015 Free Software Foundation, Inc. + Copyright (C) 2002-2020 Free Software Foundation, Inc. Contributed by MontaVista Software. @@ -18,8 +18,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef TARGET_H -#define TARGET_H +#ifndef GDBSERVER_TARGET_H +#define GDBSERVER_TARGET_H #include /* for mode_t */ #include "target/target.h" @@ -27,7 +27,8 @@ #include "target/wait.h" #include "target/waitstatus.h" #include "mem-break.h" -#include "btrace-common.h" +#include "gdbsupport/btrace-common.h" +#include struct emit_ops; struct buffer; @@ -62,21 +63,25 @@ struct thread_resume CORE_ADDR step_range_end; /* Exclusive */ }; -struct target_ops +/* 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 { /* Start a new process. PROGRAM is a path to the program to execute. - ARGS is a standard NULL-terminated array of arguments, - to be passed to the inferior as ``argv''. + 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. */ + int (*create_inferior) (const char *program, + const std::vector &program_args); - int (*create_inferior) (char *program, char **args); - - /* Architecture-specific setup. */ - void (*arch_setup) (void); + /* Do additional setup after a new process is created, including + exec-wrapper completion. */ + void (*post_create_inferior) (void); /* Attach to a running process. @@ -88,20 +93,21 @@ struct target_ops int (*attach) (unsigned long pid); - /* Kill inferior PID. Return -1 on failure, and 0 on success. */ + /* Kill process PROC. Return -1 on failure, and 0 on success. */ - int (*kill) (int pid); + int (*kill) (process_info *proc); - /* Detach from inferior PID. Return -1 on failure, and 0 on + /* Detach from process PROC. Return -1 on failure, and 0 on success. */ - int (*detach) (int pid); + int (*detach) (process_info *proc); /* The inferior process has died. Do what is right. */ void (*mourn) (struct process_info *proc); - /* Wait for inferior PID to exit. */ + /* Wait for process PID to exit. */ + void (*join) (int pid); /* Return 1 iff the thread with process ID PID is alive. */ @@ -164,7 +170,7 @@ struct target_ops int (*read_memory) (CORE_ADDR memaddr, unsigned char *myaddr, int len); /* Write memory to the inferior process. This should generally be - called through write_inferior_memory, which handles breakpoint shadowing. + called through target_write_memory, which handles breakpoint shadowing. Write LEN bytes from the buffer at MYADDR to MEMADDR. @@ -253,10 +259,6 @@ struct target_ops int (*get_tls_address) (struct thread_info *thread, CORE_ADDR offset, CORE_ADDR load_module, CORE_ADDR *address); - /* Read/Write from/to spufs using qXfer packets. */ - int (*qxfer_spu) (const char *annex, unsigned char *readbuf, - unsigned const char *writebuf, CORE_ADDR offset, int len); - /* Fill BUF with an hostio error packet representing the last hostio error. */ void (*hostio_last_error) (char *buf); @@ -389,9 +391,6 @@ struct target_ops /* Return true if target supports debugging agent. */ int (*supports_agent) (void); - /* Check whether the target supports branch tracing. */ - int (*supports_btrace) (struct target_ops *, enum btrace_format); - /* Enable branch tracing for PTID based on CONF and allocate a branch trace target information struct for reading and for disabling branch trace. */ struct btrace_target_info *(*enable_btrace) @@ -457,26 +456,47 @@ struct target_ops /* 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. */ const char *(*thread_name) (ptid_t thread); + + /* 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. */ + int (*breakpoint_kind_from_current_state) (CORE_ADDR *pcptr); + + /* 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); + + /* 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. */ + bool (*thread_handle) (ptid_t ptid, gdb_byte **handle, int *handle_len); }; -extern struct target_ops *the_target; +extern process_stratum_target *the_target; -void set_target_ops (struct target_ops *); +void set_target_ops (process_stratum_target *); -#define create_inferior(program, args) \ - (*the_target->create_inferior) (program, args) +#define create_inferior(program, program_args) \ + (*the_target->create_inferior) (program, program_args) -#define target_arch_setup() \ - do \ - { \ - if (the_target->arch_setup != NULL) \ - (*the_target->arch_setup) (); \ +#define target_post_create_inferior() \ + do \ + { \ + if (the_target->post_create_inferior != NULL) \ + (*the_target->post_create_inferior) (); \ } while (0) #define myattach(pid) \ (*the_target->attach) (pid) -int kill_inferior (int); +int kill_inferior (process_info *proc); #define target_supports_fork_events() \ (the_target->supports_fork_events ? \ @@ -497,11 +517,8 @@ int kill_inferior (int); (*the_target->handle_new_gdb_connection) (); \ } while (0) -#define detach_inferior(pid) \ - (*the_target->detach) (pid) - -#define mourn_inferior(PROC) \ - (*the_target->mourn) (PROC) +#define detach_inferior(proc) \ + (*the_target->detach) (proc) #define mythread_alive(pid) \ (*the_target->thread_alive) (pid) @@ -521,10 +538,6 @@ int kill_inferior (int); #define target_async(enable) \ (the_target->async ? (*the_target->async) (enable) : 0) -#define target_supports_multi_process() \ - (the_target->supports_multi_process ? \ - (*the_target->supports_multi_process) () : 0) - #define target_process_qsupported(features, count) \ do \ { \ @@ -532,6 +545,14 @@ int kill_inferior (int); the_target->process_qsupported (features, count); \ } while (0) +#define target_supports_catch_syscall() \ + (the_target->supports_catch_syscall ? \ + (*the_target->supports_catch_syscall) () : 0) + +#define target_get_ipa_tdesc_idx() \ + (the_target->get_ipa_tdesc_idx \ + ? (*the_target->get_ipa_tdesc_idx) () : 0) + #define target_supports_tracepoints() \ (the_target->supports_tracepoints \ ? (*the_target->supports_tracepoints) () : 0) @@ -599,21 +620,44 @@ int kill_inferior (int); (the_target->supports_agent ? \ (*the_target->supports_agent) () : 0) -#define target_supports_btrace(format) \ - (the_target->supports_btrace \ - ? (*the_target->supports_btrace) (the_target, format) : 0) +static inline struct btrace_target_info * +target_enable_btrace (ptid_t ptid, const struct btrace_config *conf) +{ + if (the_target->enable_btrace == nullptr) + error (_("Target does not support branch tracing.")); -#define target_enable_btrace(ptid, conf) \ - (*the_target->enable_btrace) (ptid, conf) + return (*the_target->enable_btrace) (ptid, conf); +} -#define target_disable_btrace(tinfo) \ - (*the_target->disable_btrace) (tinfo) +static inline int +target_disable_btrace (struct btrace_target_info *tinfo) +{ + if (the_target->disable_btrace == nullptr) + error (_("Target does not support branch tracing.")); -#define target_read_btrace(tinfo, buffer, type) \ - (*the_target->read_btrace) (tinfo, buffer, type) + return (*the_target->disable_btrace) (tinfo); +} -#define target_read_btrace_conf(tinfo, buffer) \ - (*the_target->read_btrace_conf) (tinfo, buffer) +static inline int +target_read_btrace (struct btrace_target_info *tinfo, + struct buffer *buffer, + enum btrace_read_type type) +{ + if (the_target->read_btrace == nullptr) + error (_("Target does not support branch tracing.")); + + return (*the_target->read_btrace) (tinfo, buffer, type); +} + +static inline int +target_read_btrace_conf (struct btrace_target_info *tinfo, + struct buffer *buffer) +{ + if (the_target->read_btrace_conf == nullptr) + error (_("Target does not support branch tracing.")); + + return (*the_target->read_btrace_conf) (tinfo, buffer); +} #define target_supports_range_stepping() \ (the_target->supports_range_stepping ? \ @@ -644,6 +688,15 @@ int kill_inferior (int); ? (*the_target->breakpoint_kind_from_pc) (pcptr) \ : default_breakpoint_kind_from_pc (pcptr)) +#define target_breakpoint_kind_from_current_state(pcptr) \ + (the_target->breakpoint_kind_from_current_state \ + ? (*the_target->breakpoint_kind_from_current_state) (pcptr) \ + : target_breakpoint_kind_from_pc (pcptr)) + +#define target_supports_software_single_step() \ + (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); @@ -652,7 +705,7 @@ ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options, int connected_wait); /* Prepare to read or write memory from the inferior process. See the - corresponding target_ops methods for more details. */ + corresponding process_stratum_target methods for more details. */ int prepare_to_access_memory (void); void done_accessing_memory (void); @@ -665,12 +718,14 @@ void done_accessing_memory (void); (the_target->thread_name ? (*the_target->thread_name) (ptid) \ : NULL) -int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len); +#define target_thread_handle(ptid, handle, handle_len) \ + (the_target->thread_handle ? (*the_target->thread_handle) \ + (ptid, handle, handle_len) \ + : false) -int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr, - int len); +int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len); -int set_desired_thread (int id); +int set_desired_thread (); const char *target_pid_to_str (ptid_t); @@ -678,4 +733,4 @@ int target_can_do_hardware_single_step (void); int default_breakpoint_kind_from_pc (CORE_ADDR *pcptr); -#endif /* TARGET_H */ +#endif /* GDBSERVER_TARGET_H */