Index: gdb/gdbserver/linux-low.h |
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h |
index 99d882aa5e0141e85c2ef75a7afd715e063802de..4bf0dc37d66ded2a537ad12b0ebbeef1ac1d593f 100644 |
--- a/gdb/gdbserver/linux-low.h |
+++ b/gdb/gdbserver/linux-low.h |
@@ -1,6 +1,5 @@ |
/* Internal interfaces for the GNU/Linux specific target code for gdbserver. |
- Copyright (C) 2002, 2004-2005, 2007-2012 Free Software Foundation, |
- Inc. |
+ Copyright (C) 2002-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -17,16 +16,15 @@ |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
-#ifdef HAVE_THREAD_DB_H |
-#include <thread_db.h> |
-#endif |
+#include "gdb_thread_db.h" |
#include <signal.h> |
#include "gdbthread.h" |
#include "gdb_proc_service.h" |
-#define PTRACE_ARG3_TYPE void * |
-#define PTRACE_ARG4_TYPE void * |
+/* Included for ptrace type definitions. */ |
+#include "linux-ptrace.h" |
+ |
#define PTRACE_XFER_TYPE long |
#ifdef HAVE_LINUX_REGSETS |
@@ -49,9 +47,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. */ |
@@ -63,6 +113,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; |
@@ -72,14 +127,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 |
@@ -169,6 +217,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; |
@@ -238,6 +288,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; |
@@ -270,8 +326,8 @@ struct lwp_info |
stepping over later when it is resumed. */ |
int need_step_over; |
+#ifdef USE_THREAD_DB |
int thread_known; |
-#ifdef HAVE_THREAD_DB_H |
/* The thread handle, used for e.g. TLS access. Only valid if |
THREAD_KNOWN is set. */ |
td_thrhandle_t th; |
@@ -289,6 +345,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 *); |