170 lines
4.3 KiB
Diff
170 lines
4.3 KiB
Diff
gdbserver_x86_64.patch
|
||
|
||
From: Christian Prochaska <christian.prochaska@genode-labs.com>
|
||
|
||
|
||
---
|
||
gdb/gdbserver/linux-x86-low.c | 54 ++++++++++++++++++++++++++++++++++++++---
|
||
1 file changed, 50 insertions(+), 4 deletions(-)
|
||
|
||
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
|
||
index e98e3bd..0ece728 100644
|
||
--- a/gdb/gdbserver/linux-x86-low.c
|
||
+++ b/gdb/gdbserver/linux-x86-low.c
|
||
@@ -33,6 +33,12 @@
|
||
#endif
|
||
|
||
#ifdef __GENODE__
|
||
+#ifdef __x86_64__
|
||
+void init_registers_amd64 (void);
|
||
+static inline void init_registers_amd64_linux(void) { init_registers_amd64(); }
|
||
+void init_registers_amd64_avx (void);
|
||
+static inline void init_registers_amd64_avx_linux(void) { init_registers_amd64_avx(); }
|
||
+#endif /* __x64_64__ */
|
||
/* Defined in auto-generated file i386.c. */
|
||
void init_registers_i386 (void);
|
||
static inline void init_registers_i386_linux(void) { init_registers_i386(); }
|
||
@@ -83,7 +89,9 @@ static const char *xmltarget_amd64_linux_no_xml = "@<target>\
|
||
#endif /* __GENODE__ */
|
||
|
||
#ifdef __GENODE__
|
||
-#ifndef __x86_64__
|
||
+#ifdef __x86_64__
|
||
+#include "amd64.h"
|
||
+#else
|
||
#include "i386.h"
|
||
#endif /* __x86_64__ */
|
||
#else
|
||
@@ -153,7 +161,11 @@ static /*const*/ int i386_regmap[] =
|
||
/* So code below doesn't have to care, i386 or amd64. */
|
||
#define ORIG_EAX ORIG_RAX
|
||
|
||
-static const int x86_64_regmap[] =
|
||
+static
|
||
+#ifndef __GENODE__
|
||
+const
|
||
+#endif
|
||
+int x86_64_regmap[] =
|
||
{
|
||
RAX * 8, RBX * 8, RCX * 8, RDX * 8,
|
||
RSI * 8, RDI * 8, RBP * 8, RSP * 8,
|
||
@@ -165,7 +177,9 @@ static const int x86_64_regmap[] =
|
||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||
-1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||
+#ifndef __GENODE__
|
||
ORIG_RAX * 8
|
||
+#endif
|
||
};
|
||
|
||
#define X86_64_NUM_REGS (sizeof (x86_64_regmap) / sizeof (x86_64_regmap[0]))
|
||
@@ -188,6 +202,7 @@ static /*const*/ int i386_regmap[] =
|
||
|
||
/* Called by libthread_db. */
|
||
|
||
+#ifndef __GENODE__
|
||
ps_err_e
|
||
ps_get_thread_area (const struct ps_prochandle *ph,
|
||
lwpid_t lwpid, int idx, void **base)
|
||
@@ -225,6 +240,7 @@ ps_get_thread_area (const struct ps_prochandle *ph,
|
||
return PS_OK;
|
||
}
|
||
}
|
||
+#endif
|
||
|
||
/* Get the thread area address. This is used to recognize which
|
||
thread is which when tracing with the in-process agent library. We
|
||
@@ -286,6 +302,20 @@ i386_cannot_fetch_register (int regno)
|
||
return regno >= I386_NUM_REGS;
|
||
}
|
||
|
||
+#ifdef __x86_64__
|
||
+static int
|
||
+x86_64_cannot_store_register (int regno)
|
||
+{
|
||
+ return regno >= X86_64_NUM_REGS;
|
||
+}
|
||
+
|
||
+static int
|
||
+x86_64_cannot_fetch_register (int regno)
|
||
+{
|
||
+ return regno >= X86_64_NUM_REGS;
|
||
+}
|
||
+#endif /* __x86_64__ */
|
||
+
|
||
static void
|
||
x86_fill_gregset (struct regcache *regcache, void *buf)
|
||
{
|
||
@@ -728,6 +758,7 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp)
|
||
compatible with the siginfo type exported by the 32-bit userspace
|
||
support. */
|
||
|
||
+#ifndef __GENODE__
|
||
#ifdef __x86_64__
|
||
|
||
typedef int compat_int_t;
|
||
@@ -969,6 +1000,7 @@ x86_siginfo_fixup (siginfo_t *native, void *inf, int direction)
|
||
|
||
return 0;
|
||
}
|
||
+#endif
|
||
|
||
static int use_xml;
|
||
|
||
@@ -1138,11 +1170,15 @@ static void
|
||
x86_arch_setup (void)
|
||
{
|
||
#ifdef __x86_64__
|
||
+#ifdef __GENODE__
|
||
+ int use_64bit = 1;
|
||
+#else
|
||
int pid = pid_of (get_thread_lwp (current_inferior));
|
||
char *file = linux_child_pid_to_exec_file (pid);
|
||
int use_64bit = elf_64_file_p (file);
|
||
|
||
free (file);
|
||
+#endif
|
||
|
||
if (use_64bit < 0)
|
||
{
|
||
@@ -1152,19 +1188,25 @@ x86_arch_setup (void)
|
||
}
|
||
else if (use_64bit)
|
||
{
|
||
+#ifdef __GENODE__
|
||
+ the_low_target.num_regs = X86_64_NUM_REGS;
|
||
+ the_low_target.regmap = x86_64_regmap;
|
||
+ the_low_target.cannot_fetch_register = x86_64_cannot_fetch_register;
|
||
+ the_low_target.cannot_store_register = x86_64_cannot_store_register;
|
||
+#else
|
||
/* Amd64 doesn't have HAVE_LINUX_USRREGS. */
|
||
the_low_target.num_regs = -1;
|
||
the_low_target.regmap = NULL;
|
||
the_low_target.cannot_fetch_register = NULL;
|
||
the_low_target.cannot_store_register = NULL;
|
||
-
|
||
+#endif
|
||
/* Amd64 has 16 xmm regs. */
|
||
num_xmm_registers = 16;
|
||
|
||
x86_linux_update_xmltarget ();
|
||
return;
|
||
}
|
||
-#endif
|
||
+#endif /* __x86_64__ */
|
||
|
||
/* Ok we have a 32-bit inferior. */
|
||
|
||
@@ -2620,7 +2662,11 @@ struct linux_target_ops the_low_target =
|
||
NULL,
|
||
NULL,
|
||
/* need to fix up i386 siginfo if host is amd64 */
|
||
+#ifdef __GENODE__
|
||
+ NULL,
|
||
+#else
|
||
x86_siginfo_fixup,
|
||
+#endif
|
||
x86_linux_new_process,
|
||
x86_linux_new_thread,
|
||
#ifndef __GENODE__
|