Index: gdb/gdbserver/linux-arm-low.c |
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c |
index 2718cecbe19730790e991a3037c0b29bf99efcc9..81461a9cd595d15efe6a36c8795c9f2a31fc7b4f 100644 |
--- a/gdb/gdbserver/linux-arm-low.c |
+++ b/gdb/gdbserver/linux-arm-low.c |
@@ -1,5 +1,5 @@ |
/* GNU/Linux/ARM specific low level interface, for the remote server for GDB. |
- Copyright (C) 1995-1996, 1998-2012 Free Software Foundation, Inc. |
+ Copyright (C) 1995-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -29,10 +29,19 @@ |
/* Defined in auto-generated files. */ |
void init_registers_arm (void); |
+extern const struct target_desc *tdesc_arm; |
+ |
void init_registers_arm_with_iwmmxt (void); |
+extern const struct target_desc *tdesc_arm_with_iwmmxt; |
+ |
void init_registers_arm_with_vfpv2 (void); |
+extern const struct target_desc *tdesc_arm_with_vfpv2; |
+ |
void init_registers_arm_with_vfpv3 (void); |
+extern const struct target_desc *tdesc_arm_with_vfpv3; |
+ |
void init_registers_arm_with_neon (void); |
+extern const struct target_desc *tdesc_arm_with_neon; |
#ifndef PTRACE_GET_THREAD_AREA |
#define PTRACE_GET_THREAD_AREA 22 |
@@ -212,7 +221,7 @@ arm_fill_vfpregset (struct regcache *regcache, void *buf) |
else |
num = 16; |
- base = find_regno ("d0"); |
+ base = find_regno (regcache->tdesc, "d0"); |
for (i = 0; i < num; i++) |
collect_register (regcache, base + i, (char *) buf + i * 8); |
@@ -232,7 +241,7 @@ arm_store_vfpregset (struct regcache *regcache, const void *buf) |
else |
num = 16; |
- base = find_regno ("d0"); |
+ base = find_regno (regcache->tdesc, "d0"); |
for (i = 0; i < num; i++) |
supply_register (regcache, base + i, (char *) buf + i * 8); |
@@ -711,13 +720,13 @@ arm_prepare_to_resume (struct lwp_info *lwp) |
if (arm_hwbp_control_is_enabled (proc_info->bpts[i].control)) |
if (ptrace (PTRACE_SETHBPREGS, pid, |
- (PTRACE_ARG3_TYPE) ((i << 1) + 1), |
+ (PTRACE_TYPE_ARG3) ((i << 1) + 1), |
&proc_info->bpts[i].address) < 0) |
perror_with_name ("Unexpected error setting breakpoint address"); |
if (arm_hwbp_control_is_initialized (proc_info->bpts[i].control)) |
if (ptrace (PTRACE_SETHBPREGS, pid, |
- (PTRACE_ARG3_TYPE) ((i << 1) + 2), |
+ (PTRACE_TYPE_ARG3) ((i << 1) + 2), |
&proc_info->bpts[i].control) < 0) |
perror_with_name ("Unexpected error setting breakpoint"); |
@@ -731,13 +740,13 @@ arm_prepare_to_resume (struct lwp_info *lwp) |
if (arm_hwbp_control_is_enabled (proc_info->wpts[i].control)) |
if (ptrace (PTRACE_SETHBPREGS, pid, |
- (PTRACE_ARG3_TYPE) -((i << 1) + 1), |
+ (PTRACE_TYPE_ARG3) -((i << 1) + 1), |
&proc_info->wpts[i].address) < 0) |
perror_with_name ("Unexpected error setting watchpoint address"); |
if (arm_hwbp_control_is_initialized (proc_info->wpts[i].control)) |
if (ptrace (PTRACE_SETHBPREGS, pid, |
- (PTRACE_ARG3_TYPE) -((i << 1) + 2), |
+ (PTRACE_TYPE_ARG3) -((i << 1) + 2), |
&proc_info->wpts[i].control) < 0) |
perror_with_name ("Unexpected error setting watchpoint"); |
@@ -768,8 +777,8 @@ arm_get_hwcap (unsigned long *valp) |
return 0; |
} |
-static void |
-arm_arch_setup (void) |
+static const struct target_desc * |
+arm_read_description (void) |
{ |
int pid = lwpid_of (get_thread_lwp (current_inferior)); |
@@ -778,29 +787,24 @@ arm_arch_setup (void) |
arm_hwcap = 0; |
if (arm_get_hwcap (&arm_hwcap) == 0) |
- { |
- init_registers_arm (); |
- return; |
- } |
+ return tdesc_arm; |
if (arm_hwcap & HWCAP_IWMMXT) |
- { |
- init_registers_arm_with_iwmmxt (); |
- return; |
- } |
+ return tdesc_arm_with_iwmmxt; |
if (arm_hwcap & HWCAP_VFP) |
{ |
+ const struct target_desc *result; |
char *buf; |
/* NEON implies either no VFP, or VFPv3-D32. We only support |
it with VFP. */ |
if (arm_hwcap & HWCAP_NEON) |
- init_registers_arm_with_neon (); |
+ result = tdesc_arm_with_neon; |
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) |
- init_registers_arm_with_vfpv3 (); |
+ result = tdesc_arm_with_vfpv3; |
else |
- init_registers_arm_with_vfpv2 (); |
+ result = tdesc_arm_with_vfpv2; |
/* Now make sure that the kernel supports reading these |
registers. Support was added in 2.6.30. */ |
@@ -810,19 +814,25 @@ arm_arch_setup (void) |
&& errno == EIO) |
{ |
arm_hwcap = 0; |
- init_registers_arm (); |
+ result = tdesc_arm; |
} |
free (buf); |
- return; |
+ return result; |
} |
/* The default configuration uses legacy FPA registers, probably |
simulated. */ |
- init_registers_arm (); |
+ return tdesc_arm; |
} |
-struct regset_info target_regsets[] = { |
+static void |
+arm_arch_setup (void) |
+{ |
+ current_process ()->tdesc = arm_read_description (); |
+} |
+ |
+static struct regset_info arm_regsets[] = { |
{ PTRACE_GETREGS, PTRACE_SETREGS, 0, 18 * 4, |
GENERAL_REGS, |
arm_fill_gregset, arm_store_gregset }, |
@@ -835,11 +845,35 @@ struct regset_info target_regsets[] = { |
{ 0, 0, 0, -1, -1, NULL, NULL } |
}; |
+static struct regsets_info arm_regsets_info = |
+ { |
+ arm_regsets, /* regsets */ |
+ 0, /* num_regsets */ |
+ NULL, /* disabled_regsets */ |
+ }; |
+ |
+static struct usrregs_info arm_usrregs_info = |
+ { |
+ arm_num_regs, |
+ arm_regmap, |
+ }; |
+ |
+static struct regs_info regs_info = |
+ { |
+ NULL, /* regset_bitmap */ |
+ &arm_usrregs_info, |
+ &arm_regsets_info |
+ }; |
+ |
+static const struct regs_info * |
+arm_regs_info (void) |
+{ |
+ return ®s_info; |
+} |
+ |
struct linux_target_ops the_low_target = { |
arm_arch_setup, |
- arm_num_regs, |
- arm_regmap, |
- NULL, |
+ arm_regs_info, |
arm_cannot_fetch_register, |
arm_cannot_store_register, |
NULL, /* fetch_register */ |
@@ -871,3 +905,16 @@ struct linux_target_ops the_low_target = { |
arm_new_thread, |
arm_prepare_to_resume, |
}; |
+ |
+void |
+initialize_low_arch (void) |
+{ |
+ /* Initialize the Linux target descriptions. */ |
+ init_registers_arm (); |
+ init_registers_arm_with_iwmmxt (); |
+ init_registers_arm_with_vfpv2 (); |
+ init_registers_arm_with_vfpv3 (); |
+ init_registers_arm_with_neon (); |
+ |
+ initialize_regsets_info (&arm_regsets_info); |
+} |