| 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 *);
|
|
|