X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Ftarget.h;h=be8925802fe333abce36503387fa326bf7602310;hb=2090129c36c7e582943b7d300968d19b46160d84;hp=8d233834ceefd51e1013eca89518c5b95188e4d8;hpb=de0d863ec3fda88e488cee568f943c7998b68862;p=external%2Fbinutils.git diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index 8d23383..be89258 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-2017 Free Software Foundation, Inc. Contributed by MontaVista Software. @@ -21,12 +21,14 @@ #ifndef TARGET_H #define TARGET_H +#include /* for mode_t */ #include "target/target.h" #include "target/resume.h" #include "target/wait.h" #include "target/waitstatus.h" #include "mem-break.h" #include "btrace-common.h" +#include struct emit_ops; struct buffer; @@ -66,13 +68,17 @@ struct target_ops /* 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); + /* Do additional setup after a new process is created, including + exec-wrapper completion. */ + void (*post_create_inferior) (void); /* Attach to a running process. @@ -222,9 +228,8 @@ struct target_ops HW breakpoint triggering. */ int (*supports_stopped_by_hw_breakpoint) (void); - /* Returns true if the target can evaluate conditions of - breakpoints. */ - int (*supports_conditional_breakpoints) (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. */ @@ -287,6 +292,9 @@ struct target_ops /* 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); @@ -301,8 +309,9 @@ struct target_ops int (*read_loadmap) (const char *annex, CORE_ADDR offset, unsigned char *myaddr, unsigned int len); - /* Target specific qSupported support. */ - void (*process_qsupported) (const char *); + /* 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. */ @@ -394,11 +403,11 @@ struct target_ops Returns zero on success, non-zero otherwise. */ int (*disable_btrace) (struct btrace_target_info *tinfo); - /* Read branch trace data into buffer. We use an int to specify the type - to break a cyclic dependency. + /* Read branch trace data into buffer. Return 0 on success; print an error message into BUFFER and return -1, otherwise. */ - int (*read_btrace) (struct btrace_target_info *, struct buffer *, int type); + int (*read_btrace) (struct btrace_target_info *, struct buffer *, + 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 @@ -415,14 +424,72 @@ struct target_ops string should be copied into a buffer by the client if the string will not be immediately used, or if it must persist. */ char *(*pid_to_exec_file) (int pid); + + /* 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 set this to NULL. + If NULL, the caller should fall back to open(2). */ + 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 set this to NULL. + If NULL, the caller should fall back to unlink(2). */ + 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 + set this to NULL. If NULL, the caller should fall back to + readlink(2). */ + 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. */ + 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. */ + const gdb_byte *(*sw_breakpoint_from_kind) (int kind, int *size); + + /* 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); }; extern struct target_ops *the_target; void set_target_ops (struct target_ops *); -#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_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) @@ -437,16 +504,20 @@ int kill_inferior (int); (the_target->supports_vfork_events ? \ (*the_target->supports_vfork_events) () : 0) -#define target_handle_new_gdb_connection() \ - (the_target->handle_new_gdb_connection ? \ - (*the_target->handle_new_gdb_connection) () : 0) +#define target_supports_exec_events() \ + (the_target->supports_exec_events ? \ + (*the_target->supports_exec_events) () : 0) + +#define target_handle_new_gdb_connection() \ + do \ + { \ + if (the_target->handle_new_gdb_connection != NULL) \ + (*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 mythread_alive(pid) \ (*the_target->thread_alive) (pid) @@ -465,17 +536,21 @@ 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(query) \ +#define target_process_qsupported(features, count) \ do \ { \ if (the_target->process_qsupported) \ - the_target->process_qsupported (query); \ + 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) @@ -575,14 +650,28 @@ int kill_inferior (int); (the_target->supports_stopped_by_hw_breakpoint ? \ (*the_target->supports_stopped_by_hw_breakpoint) () : 0) -#define target_supports_conditional_breakpoints() \ - (the_target->supports_conditional_breakpoints ? \ - (*the_target->supports_conditional_breakpoints) () : 0) +#define target_supports_hardware_single_step() \ + (the_target->supports_hardware_single_step ? \ + (*the_target->supports_hardware_single_step) () : 0) #define target_stopped_by_hw_breakpoint() \ (the_target->stopped_by_hw_breakpoint ? \ (*the_target->stopped_by_hw_breakpoint) () : 0) +#define target_breakpoint_kind_from_pc(pcptr) \ + (the_target->breakpoint_kind_from_pc \ + ? (*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); @@ -590,29 +679,31 @@ int start_non_stop (int nonstop); ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options, int connected_wait); -#define prepare_to_access_memory() \ - (the_target->prepare_to_access_memory \ - ? (*the_target->prepare_to_access_memory) () \ - : 0) +/* Prepare to read or write memory from the inferior process. See the + corresponding target_ops methods for more details. */ -#define done_accessing_memory() \ - do \ - { \ - if (the_target->done_accessing_memory) \ - (*the_target->done_accessing_memory) (); \ - } while (0) +int prepare_to_access_memory (void); +void done_accessing_memory (void); #define target_core_of_thread(ptid) \ (the_target->core_of_thread ? (*the_target->core_of_thread) (ptid) \ : -1) +#define target_thread_name(ptid) \ + (the_target->thread_name ? (*the_target->thread_name) (ptid) \ + : NULL) + int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len); int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len); -void set_desired_thread (int id); +int set_desired_thread (int id); 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 /* TARGET_H */