X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-low.h;h=e051ab6c82f49b7a5e32fc46f858071bcd22e8a3;hb=b8e1b30ec516d23493942a91ef6db2f701b4005b;hp=834dd9133c97ab1f5de3c4ed90dd379e25e9984c;hpb=04f5fe89ae8c13d903cded6cc28924dff058ece0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index 834dd9133c..e051ab6c82 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -22,8 +22,8 @@ #include "gdbthread.h" #include "gdb_proc_service.h" -#define PTRACE_ARG3_TYPE void * -#define PTRACE_ARG4_TYPE void * +#define PTRACE_TYPE_ARG3 void * +#define PTRACE_TYPE_ARG4 void * #define PTRACE_XFER_TYPE long #ifdef HAVE_LINUX_REGSETS @@ -46,9 +46,61 @@ struct regset_info regset_fill_func fill_function; regset_store_func store_function; }; -extern struct regset_info target_regsets[]; + +/* Aggregation of all the supported regsets of a given + architecture/mode. */ + +struct regsets_info +{ + /* The regsets array. */ + struct regset_info *regsets; + + /* The number of regsets in the REGSETS array. */ + int num_regsets; + + /* If we get EIO on a regset, do not try it again. Note the set of + supported regsets may depend on processor mode on biarch + machines. This is a (lazily allocated) array holding one boolean + byte (0/1) per regset, with each element corresponding to the + regset in the REGSETS array above at the same offset. */ + char *disabled_regsets; +}; + #endif +/* Mapping between the general-purpose registers in `struct user' + format and GDB's register array layout. */ + +struct usrregs_info +{ + /* The number of registers accessible. */ + int num_regs; + + /* The registers map. */ + int *regmap; +}; + +/* All info needed to access an architecture/mode's registers. */ + +struct regs_info +{ + /* Regset support bitmap: 1 for registers that are transferred as a part + of a regset, 0 for ones that need to be handled individually. This + can be NULL if all registers are transferred with regsets or regsets + are not supported. */ + unsigned char *regset_bitmap; + + /* Info used when accessing registers with PTRACE_PEEKUSER / + PTRACE_POKEUSER. This can be NULL if all registers are + transferred with regsets .*/ + struct usrregs_info *usrregs; + +#ifdef HAVE_LINUX_REGSETS + /* Info used when accessing registers with regsets. */ + struct regsets_info *regsets_info; +#endif +}; + struct process_info_private { /* Arch-specific additions. */ @@ -60,6 +112,11 @@ struct process_info_private /* &_r_debug. 0 if not yet determined. -1 if no PT_DYNAMIC in Phdrs. */ CORE_ADDR r_debug; + + /* This flag is true iff we've just created or attached to the first + LWP of this process but it has not stopped yet. As soon as it + does, we need to call the low target's arch_setup callback. */ + int new_inferior; }; struct lwp_info; @@ -69,14 +126,7 @@ struct linux_target_ops /* Architecture-specific setup. */ void (*arch_setup) (void); - int num_regs; - int *regmap; - - /* Regset support bitmap: 1 for registers that are transferred as a part - of a regset, 0 for ones that need to be handled individually. This - can be NULL if all registers are transferred with regsets or regsets - are not supported. */ - unsigned char *regset_bitmap; + const struct regs_info *(*regs_info) (void); int (*cannot_fetch_register) (int); /* Returns 0 if we can store the register, 1 if we can not @@ -166,6 +216,8 @@ struct linux_target_ops for use as a fast tracepoint. */ int (*get_min_fast_tracepoint_insn_len) (void); + /* Returns true if the low target supports range stepping. */ + int (*supports_range_stepping) (void); }; extern struct linux_target_ops the_low_target; @@ -235,6 +287,12 @@ struct lwp_info level on this process was a single-step. */ int stepping; + /* Range to single step within. This is a copy of the step range + passed along the last resume request. See 'struct + thread_resume'. */ + CORE_ADDR step_range_start; /* Inclusive */ + CORE_ADDR step_range_end; /* Exclusive */ + /* If this flag is set, we need to set the event request flags the next time we see this LWP stop. */ int must_set_ptrace_flags; @@ -267,8 +325,8 @@ struct lwp_info stepping over later when it is resumed. */ int need_step_over; - int thread_known; #ifdef USE_THREAD_DB + int thread_known; /* The thread handle, used for e.g. TLS access. Only valid if THREAD_KNOWN is set. */ td_thrhandle_t th; @@ -286,6 +344,12 @@ void linux_attach_lwp (unsigned long pid); struct lwp_info *find_lwp_pid (ptid_t ptid); void linux_stop_lwp (struct lwp_info *lwp); +#ifdef HAVE_LINUX_REGSETS +void initialize_regsets_info (struct regsets_info *regsets_info); +#endif + +void initialize_low_arch (void); + /* From thread-db.c */ int thread_db_init (int use_events); void thread_db_detach (struct process_info *);