genode/repos/ports/src/noux-pkg/gdb/patches/gdbserver_genode.patch

1391 lines
37 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

gdbserver_genode.patch
From: Christian Prochaska <christian.prochaska@genode-labs.com>
---
gdb/common/common-defs.h | 8 +
gdb/common/gdb_tilde_expand.c | 10 ++
gdb/common/pathstuff.c | 2
gdb/gdbserver/linux-aarch32-low.c | 4 +
gdb/gdbserver/linux-arm-low.c | 8 +
gdb/gdbserver/linux-low.c | 168 ++++++++++++++++++++++++++++++
gdb/gdbserver/linux-low.h | 5 +
gdb/gdbserver/linux-x86-low.c | 111 +++++++++++++++++++-
gdb/gdbserver/linux-x86-tdesc-selftest.c | 31 ++++++
gdb/gdbserver/linux-x86-tdesc.c | 8 +
gdb/gdbserver/remote-utils.c | 15 +++
gdb/gdbserver/server.c | 36 ++++++
gdb/gdbserver/server.h | 4 +
gdb/nat/fork-inferior.c | 4 -
gdb/nat/gdb_ptrace.h | 2
gdb/nat/linux-ptrace.c | 17 +++
gdb/nat/linux-ptrace.h | 4 +
17 files changed, 422 insertions(+), 15 deletions(-)
diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h
index eb0ec21..4dc07ce 100644
--- a/gdb/common/common-defs.h
+++ b/gdb/common/common-defs.h
@@ -28,7 +28,9 @@
#undef PACKAGE_TARNAME
#ifdef GDBSERVER
+#ifndef __GENODE__
#include "build-gnulib-gdbserver/config.h"
+#endif /* __GENODE__ */
#else
#include "build-gnulib/config.h"
#endif
@@ -69,9 +71,11 @@
#include <strings.h> /* for strcasecmp and strncasecmp */
#endif
#include <errno.h>
+#ifndef __GENODE__
#include <alloca.h>
-
+#endif /* __GENODE__ */
#include "ansidecl.h"
+#ifndef __GENODE__
/* This is defined by ansidecl.h, but we prefer gnulib's version. On
MinGW, gnulib might enable __USE_MINGW_ANSI_STDIO, which may or not
require use of attribute gnu_printf instead of printf. gnulib
@@ -79,7 +83,7 @@
is compatible with ATTRIBUTE_PRINTF, simply use it. */
#undef ATTRIBUTE_PRINTF
#define ATTRIBUTE_PRINTF _GL_ATTRIBUTE_FORMAT_PRINTF
-
+#endif /* __GENODE__ */
#include "libiberty.h"
#include "pathmax.h"
#include "gdb/signals.h"
diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c
index fcb9796..bd77a83 100644
--- a/gdb/common/gdb_tilde_expand.c
+++ b/gdb/common/gdb_tilde_expand.c
@@ -71,7 +71,12 @@ private:
std::string
gdb_tilde_expand (const char *dir)
{
+#ifdef __GENODE__
+ /* GLOB_TILDE_CHECK is not defined in Genode's libc */
+ gdb_glob glob (dir, GLOB_TILDE, NULL);
+#else
gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL);
+#endif /* __GENODE__ */
gdb_assert (glob.pathc () > 0);
/* "glob" may return more than one match to the path provided by the
@@ -86,7 +91,12 @@ gdb_tilde_expand (const char *dir)
gdb::unique_xmalloc_ptr<char>
gdb_tilde_expand_up (const char *dir)
{
+#ifdef __GENODE__
+ /* GLOB_TILDE_CHECK is not defined in Genode's libc */
+ gdb_glob glob (dir, GLOB_TILDE, NULL);
+#else
gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL);
+#endif
gdb_assert (glob.pathc () > 0);
/* "glob" may return more than one match to the path provided by the
diff --git a/gdb/common/pathstuff.c b/gdb/common/pathstuff.c
index 8c4093f..db3c23d 100644
--- a/gdb/common/pathstuff.c
+++ b/gdb/common/pathstuff.c
@@ -55,6 +55,7 @@ gdb_realpath (const char *filename)
does not exist locally), we rely instead on GetFullPathName to
perform the canonicalization. */
+#ifndef __GENODE__
#if defined (_WIN32)
{
char buf[MAX_PATH];
@@ -75,6 +76,7 @@ gdb_realpath (const char *filename)
return gdb::unique_xmalloc_ptr<char> (rp);
}
#endif
+#endif /* __GENODE__ */
/* This system is a lost cause, just dup the buffer. */
return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
diff --git a/gdb/gdbserver/linux-aarch32-low.c b/gdb/gdbserver/linux-aarch32-low.c
index 12c11a4..c42b5bb 100644
--- a/gdb/gdbserver/linux-aarch32-low.c
+++ b/gdb/gdbserver/linux-aarch32-low.c
@@ -35,7 +35,11 @@
is used for gdbserver, so single threaded debugging should work
OK, but for multi-threaded debugging we only insert the current
ABI's breakpoint instruction. For now at least. */
+#ifdef __GENODE__
+#define arm_eabi_breakpoint 0xe7ffdefeUL
+#else
#define arm_eabi_breakpoint 0xe7f001f0UL
+#endif
#if (defined __ARM_EABI__ || defined __aarch64__)
static const unsigned long arm_breakpoint = arm_eabi_breakpoint;
diff --git a/gdb/gdbserver/linux-arm-low.c b/gdb/gdbserver/linux-arm-low.c
index 6c2dcea..b682f96 100644
--- a/gdb/gdbserver/linux-arm-low.c
+++ b/gdb/gdbserver/linux-arm-low.c
@@ -30,6 +30,9 @@
#include <elf.h>
#endif
#include "nat/gdb_ptrace.h"
+#ifdef __GENODE__
+#include <sys/procfs.h>
+#endif
#include <signal.h>
#include <sys/syscall.h>
@@ -878,6 +881,10 @@ arm_read_description (void)
/* Query hardware watchpoint/breakpoint capabilities. */
arm_linux_init_hwbp_cap (pid);
+#ifndef __GENODE__
+
+ /* Genode: 'init_registers_arm_with_*()' functions not generated */
+
if (arm_get_hwcap (&arm_hwcap) == 0)
return tdesc_arm;
@@ -910,6 +917,7 @@ arm_read_description (void)
return result;
}
+#endif
/* The default configuration uses legacy FPA registers, probably
simulated. */
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 7c396ae..c684d9b 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -27,6 +27,11 @@
#include "nat/linux-waitpid.h"
#include "gdb_wait.h"
#include "nat/gdb_ptrace.h"
+
+#ifdef __GENODE__
+#include "genode-low.h"
+#endif
+
#include "nat/linux-ptrace.h"
#include "nat/linux-procfs.h"
#include "nat/linux-personality.h"
@@ -719,7 +724,11 @@ handle_extended_wait (struct lwp_info **orig_event_lwp, int wstat)
/* Set the event status. */
event_lwp->waitstatus.kind = TARGET_WAITKIND_EXECD;
event_lwp->waitstatus.value.execd_pathname
+#ifdef __GENODE__
+ = xstrdup ("target");
+#else
= xstrdup (linux_proc_pid_to_exec_file (lwpid_of (event_thr)));
+#endif
/* Mark the exec status as pending. */
event_lwp->stopped = 1;
@@ -1005,8 +1014,10 @@ linux_create_inferior (const char *program,
ptid_t ptid;
{
+#ifndef __GENODE__
maybe_disable_address_space_randomization restore_personality
(cs.disable_randomization);
+#endif /* __GENODE__ */
std::string str_program_args = stringify_argv (program_args);
pid = fork_inferior (program,
@@ -1054,12 +1065,17 @@ linux_attach_lwp (ptid_t ptid)
struct lwp_info *new_lwp;
int lwpid = ptid.lwp ();
+#ifndef __GENODE__
if (ptrace (PTRACE_ATTACH, lwpid, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0)
!= 0)
return errno;
+#endif
new_lwp = add_lwp (ptid);
+#ifdef __GENODE__
+ new_lwp->stopped = 1;
+#else
/* We need to wait for SIGSTOP before being able to make the next
ptrace call on this LWP. */
new_lwp->must_set_ptrace_flags = 1;
@@ -1126,6 +1142,7 @@ linux_attach_lwp (ptid_t ptid)
end of the list, and so the new thread has not yet reached
wait_for_sigstop (but will). */
new_lwp->stop_expected = 1;
+#endif
return 0;
}
@@ -1200,6 +1217,7 @@ linux_attach (unsigned long pid)
proc = linux_add_process (pid, 1);
+#ifndef __GENODE__
/* Don't ignore the initial SIGSTOP if we just attached to this
process. It will be collected by wait shortly. */
initial_thread = find_thread_ptid (ptid_t (pid, pid, 0));
@@ -1247,6 +1265,7 @@ linux_attach (unsigned long pid)
gdb_assert (proc->tdesc != NULL);
}
+#endif
return 0;
}
@@ -1507,14 +1526,21 @@ get_detach_signal (struct thread_info *thread)
/* Detach from LWP. */
+#ifdef __GENODE__
+void
+#else
static void
+#endif /* __GENODE__ */
linux_detach_one_lwp (struct lwp_info *lwp)
{
struct thread_info *thread = get_lwp_thread (lwp);
+#ifndef __GENODE__
int sig;
+#endif /* __GENODE__ */
int lwpid;
/* If there is a pending SIGSTOP, get rid of it. */
+#ifndef __GENODE__
if (lwp->stop_expected)
{
if (debug_threads)
@@ -1524,7 +1550,9 @@ linux_detach_one_lwp (struct lwp_info *lwp)
kill_lwp (lwpid_of (thread), SIGCONT);
lwp->stop_expected = 0;
}
+#endif
+#ifndef __GENODE__
/* Pass on any pending signal for this thread. */
sig = get_detach_signal (thread);
@@ -1587,6 +1615,7 @@ linux_detach_one_lwp (struct lwp_info *lwp)
target_pid_to_str (ptid_of (thread)),
strsignal (sig));
}
+#endif
delete_lwp (lwp);
}
@@ -1874,6 +1903,7 @@ iterate_over_lwps (ptid_t filter,
static void
check_zombie_leaders (void)
{
+#ifndef __GENODE__
for_each_process ([] (process_info *proc) {
pid_t leader_pid = pid_of (proc);
struct lwp_info *leader_lp;
@@ -1928,6 +1958,7 @@ check_zombie_leaders (void)
delete_lwp (leader_lp);
}
});
+#endif /* __GENODE__ */
}
/* Callback for `find_thread'. Returns the first LWP that is not
@@ -2730,11 +2761,13 @@ linux_wait_for_event_filtered (ptid_t wait_ptid, ptid_t filter_ptid,
if (ret > 0)
{
+#ifndef __GENODE__
if (debug_threads)
{
debug_printf ("LLW: waitpid %ld received %s\n",
(long) ret, status_to_str (*wstatp));
}
+#endif /* __GENODE__ */
/* Filter all events. IOW, leave all events pending. We'll
randomly select an event LWP out of all that have events
@@ -3036,11 +3069,12 @@ linux_stabilize_threads (void)
static ptid_t
ignore_event (struct target_waitstatus *ourstatus)
{
+#ifndef __GENODE__
/* If we got an event, there may still be others, as a single
SIGCHLD can indicate more than one child stopped. This forces
another target_wait call. */
async_file_mark ();
-
+#endif /* __GENODE__ */
ourstatus->kind = TARGET_WAITKIND_IGNORE;
return null_ptid;
}
@@ -3877,9 +3911,11 @@ linux_wait (ptid_t ptid,
{
ptid_t event_ptid;
+#ifndef __GENODE__
/* Flush the async file first. */
if (target_is_async_p ())
async_file_flush ();
+#endif
do
{
@@ -3889,12 +3925,14 @@ linux_wait (ptid_t ptid,
&& event_ptid == null_ptid
&& ourstatus->kind == TARGET_WAITKIND_IGNORE);
+#ifndef __GENODE__
/* If at least one stop was reported, there may be more. A single
SIGCHLD can signal more than one child stop. */
if (target_is_async_p ()
&& (target_options & TARGET_WNOHANG) != 0
&& event_ptid != null_ptid)
async_file_mark ();
+#endif
return event_ptid;
}
@@ -3904,6 +3942,9 @@ linux_wait (ptid_t ptid,
static int
kill_lwp (unsigned long lwpid, int signo)
{
+#ifdef __GENODE__
+ return kill (lwpid, signo);
+#else
int ret;
errno = 0;
@@ -3915,6 +3956,7 @@ kill_lwp (unsigned long lwpid, int signo)
perror_with_name (("tkill"));
}
return ret;
+#endif
}
void
@@ -4447,6 +4489,21 @@ linux_resume_one_lwp_throw (struct lwp_info *lwp,
regcache_invalidate_thread (thread);
errno = 0;
lwp->stepping = step;
+
+#ifdef __GENODE__
+
+ /*
+ * On Linux, the thread would get stopped immediately after resuming
+ * if a SIGSTOP is pending. This is not the case on Genode, so we
+ * just keep the thread stopped.
+ */
+ if (lwp->stop_expected)
+ return;
+
+ genode_continue_thread(lwpid_of(thread), step);
+
+#else
+
if (step)
ptrace_request = PTRACE_SINGLESTEP;
else if (gdb_catching_syscalls_p (lwp))
@@ -4459,6 +4516,7 @@ linux_resume_one_lwp_throw (struct lwp_info *lwp,
/* Coerce to a uintptr_t first to avoid potential gcc warning
of coercing an 8 byte integer to a 4 byte pointer. */
(PTRACE_TYPE_ARG4) (uintptr_t) signal);
+#endif
current_thread = saved_thread;
if (errno)
@@ -4496,7 +4554,7 @@ check_ptrace_stopped_lwp_gone (struct lwp_info *lp)
(observed in Linux 3.18). See also the note on ESRCH in the
ptrace(2) man page. Instead, check whether the LWP has any state
other than ptrace-stopped. */
-
+#ifndef __GENODE__
/* Don't assume anything if /proc/PID/status can't be read. */
if (linux_proc_pid_is_trace_stopped_nowarn (lwpid_of (thread)) == 0)
{
@@ -4504,6 +4562,7 @@ check_ptrace_stopped_lwp_gone (struct lwp_info *lp)
lp->status_pending_p = 0;
return 1;
}
+#endif /* __GENODE__ */
return 0;
}
@@ -5374,6 +5433,7 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
this process mode. */
disable_regset (regsets_info, regset);
}
+#ifndef __GENODE__
else if (errno == ENODATA)
{
/* ENODATA may be returned if the regset is currently
@@ -5386,6 +5446,7 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
already gone, in which case we simply ignore attempts
to read its registers. */
}
+#endif
else
{
char s[256];
@@ -6566,6 +6627,13 @@ linux_read_loadmap (const char *annex, CORE_ADDR offset,
static void
linux_process_qsupported (char **features, int count)
{
+#ifdef __GENODE__
+ /*
+ * 'qSupported' is the first command sent by GDB when attaching to the
+ * server, so when at this location, GDB has just (re-)attached itself.
+ */
+ genode_stop_all_threads();
+#endif
if (the_low_target.process_qsupported != NULL)
the_low_target.process_qsupported (features, count);
}
@@ -6691,6 +6759,7 @@ linux_get_min_fast_tracepoint_insn_len (void)
return (*the_low_target.get_min_fast_tracepoint_insn_len) ();
}
+#ifndef __GENODE__
/* Extract &phdr and num_phdr in the inferior. Return 0 on success. */
static int
@@ -7176,6 +7245,7 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
return len;
}
+#endif /* __GENODE__ */
#ifdef HAVE_LINUX_BTRACE
@@ -7436,25 +7506,52 @@ static struct target_ops linux_target_ops = {
linux_create_inferior,
linux_post_create_inferior,
linux_attach,
+#ifndef __GENODE__
linux_kill,
linux_detach,
linux_mourn,
linux_join,
+#else
+ genode_kill,
+ genode_detach,
+ NULL,
+ NULL,
+#endif
linux_thread_alive,
linux_resume,
linux_wait,
+#ifndef __GENODE__
linux_fetch_registers,
linux_store_registers,
+#else
+ genode_fetch_registers,
+ genode_store_registers,
+#endif
linux_prepare_to_access_memory,
linux_done_accessing_memory,
+#ifndef __GENODE__
linux_read_memory,
linux_write_memory,
+#else
+ genode_read_memory,
+ genode_write_memory,
+#endif
+#ifndef __GENODE__
linux_look_up_symbols,
+#else
+ NULL,
+#endif
linux_request_interrupt,
+#ifndef __GENODE__
linux_read_auxv,
linux_supports_z_point_type,
+#else
+ NULL,
+ NULL,
+#endif
linux_insert_point,
linux_remove_point,
+#ifndef __GENODE__
linux_stopped_by_sw_breakpoint,
linux_supports_stopped_by_sw_breakpoint,
linux_stopped_by_hw_breakpoint,
@@ -7462,6 +7559,15 @@ static struct target_ops linux_target_ops = {
linux_supports_hardware_single_step,
linux_stopped_by_watchpoint,
linux_stopped_data_address,
+#else
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+#endif
#if defined(__UCLIBC__) && defined(HAS_NOMMU) \
&& defined(PT_TEXT_ADDR) && defined(PT_DATA_ADDR) \
&& defined(PT_TEXT_END_ADDR)
@@ -7474,6 +7580,7 @@ static struct target_ops linux_target_ops = {
#else
NULL,
#endif
+#ifndef __GENODE__
linux_qxfer_spu,
hostio_last_error_from_errno,
linux_qxfer_osdata,
@@ -7486,14 +7593,34 @@ static struct target_ops linux_target_ops = {
linux_supports_vfork_events,
linux_supports_exec_events,
linux_handle_new_gdb_connection,
+#else
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+#endif
#ifdef USE_THREAD_DB
thread_db_handle_monitor_command,
#else
NULL,
#endif
+#ifndef __GENODE__
linux_common_core_of_thread,
linux_read_loadmap,
+#else
+ NULL,
+ NULL,
+#endif
linux_process_qsupported,
+#ifndef __GENODE__
linux_supports_tracepoints,
linux_read_pc,
linux_write_pc,
@@ -7525,7 +7652,34 @@ static struct target_ops linux_target_ops = {
linux_mntns_unlink,
linux_mntns_readlink,
linux_breakpoint_kind_from_pc,
+#else
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+#endif
linux_sw_breakpoint_from_kind,
+#ifndef __GENODE__
linux_proc_tid_get_name,
linux_breakpoint_kind_from_current_state,
linux_supports_software_single_step,
@@ -7536,6 +7690,14 @@ static struct target_ops linux_target_ops = {
#else
NULL,
#endif
+#else
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+#endif /* __GENODE__ */
};
#ifdef HAVE_LINUX_REGSETS
@@ -7557,8 +7719,10 @@ initialize_low (void)
memset (&sigchld_action, 0, sizeof (sigchld_action));
set_target_ops (&linux_target_ops);
+#ifndef __GENODE__
linux_ptrace_init_warnings ();
linux_proc_init_warnings ();
+#endif
sigchld_action.sa_handler = sigchld_handler;
sigemptyset (&sigchld_action.sa_mask);
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h
index 79b3311..0b7f4ed 100644
--- a/gdb/gdbserver/linux-low.h
+++ b/gdb/gdbserver/linux-low.h
@@ -17,11 +17,16 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "nat/linux-nat.h"
+#ifndef __GENODE__
#include "nat/gdb_thread_db.h"
+#endif
#include <signal.h>
#include "gdbthread.h"
+
+#ifndef __GENODE__
#include "gdb_proc_service.h"
+#endif
/* Included for ptrace type definitions. */
#include "nat/linux-ptrace.h"
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 80b4380..b8984c9 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -31,7 +31,9 @@
#include "nat/amd64-linux-siginfo.h"
#endif
+#ifndef __GENODE__
#include "gdb_proc_service.h"
+#endif
/* Don't include elf/common.h if linux/elf.h got included by
gdb_proc_service.h. */
#ifndef ELFMAG0
@@ -52,11 +54,23 @@ static struct target_desc *tdesc_amd64_linux_no_xml;
#endif
static struct target_desc *tdesc_i386_linux_no_xml;
-
static unsigned char jump_insn[] = { 0xe9, 0, 0, 0, 0 };
static unsigned char small_jump_insn[] = { 0x66, 0xe9, 0, 0 };
/* Backward compatibility for gdb without XML support. */
+#ifdef __GENODE__
+
+static const char *xmltarget_i386_linux_no_xml = "@<target>\
+<architecture>i386</architecture>\
+</target>";
+
+#ifdef __x86_64__
+static const char *xmltarget_amd64_linux_no_xml = "@<target>\
+<architecture>i386:x86-64</architecture>\
+</target>";
+#endif
+
+#else
static const char *xmltarget_i386_linux_no_xml = "@<target>\
<architecture>i386</architecture>\
@@ -70,7 +84,17 @@ static const char *xmltarget_amd64_linux_no_xml = "@<target>\
</target>";
#endif
+#endif /* __GENODE__ */
+
+#ifdef __GENODE__
+#ifdef __x86_64__
+#include "amd64.h"
+#else
+#include "i386.h"
+#endif /* __x86_64__ */
+#else
#include <sys/reg.h>
+#endif
#include <sys/procfs.h>
#include "nat/gdb_ptrace.h"
#include <sys/uio.h>
@@ -119,7 +143,11 @@ static /*const*/ int i386_regmap[] =
#define ORIG_EAX ORIG_RAX
#define REGSIZE 8
-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,
@@ -132,6 +160,7 @@ static const int x86_64_regmap[] =
-1, -1, -1, -1, -1, -1, -1, -1,
-1,
-1, -1, -1, -1, -1, -1, -1, -1,
+#ifndef __GENODE__
ORIG_RAX * 8,
#ifdef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE
21 * 8, 22 * 8,
@@ -150,6 +179,7 @@ static const int x86_64_regmap[] =
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1 /* pkru */
+#endif
};
#define X86_64_NUM_REGS (sizeof (x86_64_regmap) / sizeof (x86_64_regmap[0]))
@@ -191,6 +221,7 @@ is_64bit_tdesc (void)
/* Called by libthread_db. */
+#ifndef __GENODE__
ps_err_e
ps_get_thread_area (struct ps_prochandle *ph,
lwpid_t lwpid, int idx, void **base)
@@ -229,6 +260,7 @@ ps_get_thread_area (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
@@ -284,7 +316,11 @@ x86_cannot_store_register (int regno)
{
#ifdef __x86_64__
if (is_64bit_tdesc ())
+#ifdef __GENODE__
+ return regno >= X86_64_NUM_REGS;
+#else
return 0;
+#endif /* GENODE */
#endif
return regno >= I386_NUM_REGS;
@@ -295,12 +331,30 @@ x86_cannot_fetch_register (int regno)
{
#ifdef __x86_64__
if (is_64bit_tdesc ())
+#ifdef __GENODE__
+ return regno >= X86_64_NUM_REGS;
+#else
return 0;
+#endif /* GENODE */
#endif
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)
{
@@ -337,8 +391,10 @@ x86_fill_gregset (struct regcache *regcache, void *buf)
for (i = 0; i < I386_NUM_REGS; i++)
collect_register (regcache, i, ((char *) buf) + i386_regmap[i]);
+#ifndef __GENODE__
collect_register_by_name (regcache, "orig_eax",
((char *) buf) + ORIG_EAX * REGSIZE);
+#endif
}
static void
@@ -372,8 +428,10 @@ x86_store_gregset (struct regcache *regcache, const void *buf)
for (i = 0; i < I386_NUM_REGS; i++)
supply_register (regcache, i, ((char *) buf) + i386_regmap[i]);
+#ifndef __GENODE__
supply_register_by_name (regcache, "orig_eax",
((char *) buf) + ORIG_EAX * REGSIZE);
+#endif
}
static void
@@ -493,7 +551,15 @@ x86_set_pc (struct regcache *regcache, CORE_ADDR pc)
}
}
+#ifdef __GENODE__
+/* The 'INT3' instruction is used by some kernel debuggers and thus cannot
+ * serve as breakpoint instruction for the GDB monitor. Instead, the 'HLT'
+ * instruction gets used. It's a privileged instruction which triggers an
+ * exception when executed in user mode */
+static const gdb_byte x86_breakpoint[] = { 0xF4 };
+#else
static const gdb_byte x86_breakpoint[] = { 0xCC };
+#endif
#define x86_breakpoint_len 1
static int
@@ -502,7 +568,7 @@ x86_breakpoint_at (CORE_ADDR pc)
unsigned char c;
(*the_target->read_memory) (pc, &c, 1);
- if (c == 0xCC)
+ if (c == x86_breakpoint[0])
return 1;
return 0;
@@ -669,6 +735,7 @@ x86_debug_reg_state (pid_t pid)
as debugging it with a 32-bit GDBSERVER, we do the 32-bit <-> 64-bit
conversion in-place ourselves. */
+#ifndef __GENODE__
/* Convert a ptrace/host siginfo object, into/from the siginfo in the
layout of the inferiors' architecture. Returns true if any
conversion was done; false otherwise. If DIRECTION is 1, then copy
@@ -695,6 +762,7 @@ x86_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
return 0;
}
+#endif
static int use_xml;
@@ -735,6 +803,13 @@ int have_ptrace_getfpxregs =
static const struct target_desc *
x86_linux_read_description (void)
{
+#ifdef __GENODE__
+#ifdef __x86_64__
+ return amd64_linux_read_description(X86_XSTATE_SSE_MASK, false);
+#else
+ return i386_linux_read_description(X86_XSTATE_SSE);
+#endif
+#else
unsigned int machine;
int is_elf64;
int xcr0_features;
@@ -850,7 +925,7 @@ x86_linux_read_description (void)
return tdesc;
}
-
+#endif /* __GENODE__ */
gdb_assert_not_reached ("failed to return tdesc");
}
@@ -925,13 +1000,24 @@ static struct regsets_info x86_regsets_info =
};
#ifdef __x86_64__
+static struct usrregs_info amd64_linux_usrregs_info =
+ {
+ X86_64_NUM_REGS,
+ x86_64_regmap,
+ };
+
static struct regs_info amd64_linux_regs_info =
{
NULL, /* regset_bitmap */
+#ifdef __GENODE__
+ &amd64_linux_usrregs_info,
+#else
NULL, /* usrregs_info */
+#endif
&x86_regsets_info
};
#endif
+
static struct usrregs_info i386_linux_usrregs_info =
{
I386_NUM_REGS,
@@ -2852,12 +2938,20 @@ struct linux_target_ops the_low_target =
NULL, /* breakpoint_kind_from_pc */
x86_sw_breakpoint_from_kind,
NULL,
+#ifndef __GENODE__
1,
+#else
+ 0, /* With the HLT instruction, the PC does not get incremented */
+#endif
x86_breakpoint_at,
x86_supports_z_point_type,
x86_insert_point,
x86_remove_point,
+#ifndef __GENODE__
x86_stopped_by_watchpoint,
+#else
+ NULL,
+#endif
x86_stopped_data_address,
/* collect_ptrace_register/supply_ptrace_register are not needed in the
native i386 case (no registers smaller than an xfer unit), and are not
@@ -2865,13 +2959,22 @@ 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_delete_process,
x86_linux_new_thread,
x86_linux_delete_thread,
+#ifndef __GENODE__
x86_linux_new_fork,
x86_linux_prepare_to_resume,
+#else
+ NULL,
+ NULL,
+#endif
x86_linux_process_qsupported,
x86_supports_tracepoints,
x86_get_thread_area,
diff --git a/gdb/gdbserver/linux-x86-tdesc-selftest.c b/gdb/gdbserver/linux-x86-tdesc-selftest.c
index e840b77..c7d1e34 100644
--- a/gdb/gdbserver/linux-x86-tdesc-selftest.c
+++ b/gdb/gdbserver/linux-x86-tdesc-selftest.c
@@ -21,6 +21,17 @@
#include "common/selftest.h"
#include "x86-xstate.h"
+#ifdef __GENODE__
+/* Defined in auto-generated file i386.c. */
+void init_registers_i386 (void);
+static inline void init_registers_i386_linux(void) { init_registers_i386(); }
+extern const struct target_desc *tdesc_i386_linux;
+
+void init_registers_i386_avx (void);
+static inline void init_registers_i386_avx_linux(void) { init_registers_i386_avx(); }
+extern const struct target_desc *tdesc_i386_avx_linux;
+#else
+
/* Defined in auto-generated file i386-linux.c. */
void init_registers_i386_linux (void);
extern const struct target_desc *tdesc_i386_linux;
@@ -48,9 +59,20 @@ extern const struct target_desc *tdesc_i386_avx_mpx_avx512_pku_linux;
/* Defined in auto-generated file i386-mpx-linux.c. */
void init_registers_i386_mpx_linux (void);
extern const struct target_desc *tdesc_i386_mpx_linux;
+#endif /* __GENODE__ */
#ifdef __x86_64__
+#ifdef __GENODE__
+void init_registers_amd64 (void);
+static inline void init_registers_amd64_linux(void) { init_registers_amd64(); }
+extern const struct target_desc *tdesc_amd64_linux;
+
+void init_registers_amd64_avx (void);
+static inline void init_registers_amd64_avx_linux(void) { init_registers_amd64_avx(); }
+extern const struct target_desc *tdesc_amd64_avx_linux;
+#else
+
/* Defined in auto-generated file amd64-linux.c. */
void init_registers_amd64_linux (void);
extern const struct target_desc *tdesc_amd64_linux;
@@ -87,6 +109,7 @@ extern const struct target_desc *tdesc_x32_avx_linux;
void init_registers_x32_avx_avx512_linux (void);
extern const struct target_desc *tdesc_x32_avx_avx512_linux;
+#endif /* __GENODE__ */
#endif
namespace selftests {
@@ -157,27 +180,35 @@ void
initialize_low_tdesc ()
{
init_registers_i386_linux ();
+#ifndef __GENODE__
init_registers_i386_mmx_linux ();
+#endif /* __GENODE__ */
init_registers_i386_avx_linux ();
+#ifndef __GENODE
init_registers_i386_mpx_linux ();
init_registers_i386_avx_mpx_linux ();
init_registers_i386_avx_avx512_linux ();
init_registers_i386_avx_mpx_avx512_pku_linux ();
selftests::register_test ("i386-tdesc", selftests::tdesc::i386_tdesc_test);
+#endif /* __GENODE__ */
#ifdef __x86_64__
+#ifndef __GENODE__
init_registers_x32_linux ();
init_registers_x32_avx_linux ();
init_registers_x32_avx_avx512_linux ();
+#endif /* __GENODE__ */
init_registers_amd64_linux ();
init_registers_amd64_avx_linux ();
+#ifndef __GENODE__
init_registers_amd64_mpx_linux ();
init_registers_amd64_avx_mpx_linux ();
init_registers_amd64_avx_avx512_linux ();
init_registers_amd64_avx_mpx_avx512_pku_linux ();
selftests::register_test ("amd64-tdesc", selftests::tdesc::amd64_tdesc_test);
+#endif /* __GENODE__ */
#endif
}
diff --git a/gdb/gdbserver/linux-x86-tdesc.c b/gdb/gdbserver/linux-x86-tdesc.c
index c3aa20c..e5a57c0 100644
--- a/gdb/gdbserver/linux-x86-tdesc.c
+++ b/gdb/gdbserver/linux-x86-tdesc.c
@@ -87,7 +87,11 @@ i386_linux_read_description (uint64_t xcr0)
if (*tdesc == NULL)
{
+#ifdef __GENODE__
+ *tdesc = i386_create_target_description (xcr0, false);
+#else
*tdesc = i386_create_target_description (xcr0, true);
+#endif /* __GENODE__ */
init_target_desc (*tdesc, i386_expedite_regs);
}
@@ -118,7 +122,11 @@ amd64_linux_read_description (uint64_t xcr0, bool is_x32)
if (*tdesc == NULL)
{
+#ifdef __GENODE__
+ *tdesc = amd64_create_target_description (xcr0, is_x32, false, false);
+#else
*tdesc = amd64_create_target_description (xcr0, is_x32, true, true);
+#endif /* __GENODE__ */
init_target_desc (*tdesc, amd64_expedite_regs);
}
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index 45d5c8d..b246402 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -27,6 +27,12 @@
#include "rsp-low.h"
#include "gdbthread.h"
#include <ctype.h>
+
+#ifdef __GENODE__
+#include <sys/types.h>
+#include "genode-low.h"
+#endif
+
#if HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
@@ -108,7 +114,10 @@ struct ui_file *gdb_stdlog;
static int remote_is_stdio = 0;
-static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
+#ifndef __GENODE__
+static
+#endif
+gdb_fildes_t remote_desc = INVALID_DESCRIPTOR;
static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR;
/* FIXME headerize? */
@@ -312,7 +321,11 @@ remote_open (const char *name)
struct stat statbuf;
if (stat (name, &statbuf) == 0
+#ifndef __GENODE__
&& (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode)))
+#else
+ )
+#endif
remote_desc = open (name, O_RDWR);
else
{
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index bf6302b..b6a9494 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -28,6 +28,14 @@
#if HAVE_SIGNAL_H
#include <signal.h>
#endif
+
+#ifdef __GENODE__
+#include "genode-low.h"
+#include "linux-low.h"
+/* don't have the generated header with the declaration */
+extern "C" char *strchrnul(const char *s, int c_in);
+#endif
+
#include "gdb_vecs.h"
#include "gdb_wait.h"
#include "btrace-common.h"
@@ -70,7 +78,11 @@ static gdb_environ our_environ;
/* We always try to start the inferior using a shell. */
+#ifdef __GENODE__
+int startup_with_shell = 0;
+#else
int startup_with_shell = 1;
+#endif
int server_waiting;
@@ -1282,7 +1294,9 @@ handle_detach (char *own_buf)
need to hang around doing nothing, until the child is
gone. */
join_inferior (process->pid);
+#ifndef __GENODE__
exit (0);
+#endif /* __GENODE__ */
}
}
}
@@ -3141,11 +3155,11 @@ handle_v_requests (char *own_buf, int packet_len, int *new_packet_len)
return;
}
}
-
+#ifndef __GENODE__
if (startswith (own_buf, "vFile:")
&& handle_vFile (own_buf, packet_len, new_packet_len))
return;
-
+#endif
if (startswith (own_buf, "vAttach;"))
{
if ((!extended_protocol || !cs.multi_process) && target_running ())
@@ -3737,7 +3751,9 @@ captured_main (int argc, char *argv[])
opened by remote_prepare. */
notice_open_fds ();
+#ifndef __GENODE__
save_original_signals_state (false);
+#endif /* __GENODE__ */
/* We need to know whether the remote connection is stdio before
starting the inferior. Inferiors created in this scenario have
@@ -3942,7 +3958,11 @@ captured_main (int argc, char *argv[])
/* Main function. */
int
+#ifdef __GENODE__
+gdbserver_main (int argc, char *argv[])
+#else
main (int argc, char *argv[])
+#endif
{
TRY
@@ -4045,6 +4065,10 @@ process_serial_event (void)
}
response_needed = 1;
+#ifdef __GENODE__
+ if (debug_threads) printf("GDB command = %s\n", cs.own_buf);
+#endif
+
char ch = cs.own_buf[0];
switch (ch)
{
@@ -4290,7 +4314,11 @@ process_serial_event (void)
return 0;
}
else
+#ifndef __GENODE__
exit (0);
+#else
+ return 0;
+#endif
case 'T':
{
@@ -4365,7 +4393,9 @@ process_serial_event (void)
cs.own_buf[0] = '\0';
break;
}
-
+#ifdef __GENODE__
+ if (debug_threads) printf("GDBserver response = %s\n", cs.own_buf);
+#endif
if (new_packet_len != -1)
putpkt_binary (cs.own_buf, new_packet_len);
else
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 5e41e2f..fcffe77 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -60,7 +60,11 @@ int vsnprintf(char *str, size_t size, const char *format, va_list ap);
#include "gdb_signals.h"
#include "target.h"
#include "mem-break.h"
+#ifdef __GENODE__
+#include "common/environ.h"
+#else
#include "environ.h"
+#endif /* __GENODE__ */
/* Target-specific functions */
diff --git a/gdb/nat/fork-inferior.c b/gdb/nat/fork-inferior.c
index ea71aad..9b789e7 100644
--- a/gdb/nat/fork-inferior.c
+++ b/gdb/nat/fork-inferior.c
@@ -420,9 +420,9 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs,
undebuggable. Indeed, you probably got an error message
saying "not parent". Sorry; you'll have to use print
statements! */
-
+#ifndef __GENODE__
restore_original_signals_state ();
-
+#endif /* __GENODE__ */
/* There is no execlpe call, so we have to set the environment
for our child in the global variable. If we've vforked, this
clobbers the parent, but environ is restored a few lines down
diff --git a/gdb/nat/gdb_ptrace.h b/gdb/nat/gdb_ptrace.h
index bdd7621..45caf22 100644
--- a/gdb/nat/gdb_ptrace.h
+++ b/gdb/nat/gdb_ptrace.h
@@ -129,6 +129,7 @@
extern PTRACE_TYPE_RET ptrace();
#endif
+#ifndef __GENODE__
/* Some systems, at least AIX and HP-UX have a ptrace with five
arguments. Since we never use the fifth argument, define a ptrace
macro that calls the real ptrace with the last argument set to
@@ -149,5 +150,6 @@ extern PTRACE_TYPE_RET ptrace();
# define ptrace(request, pid, addr, data) \
ptrace ((PTRACE_TYPE_ARG1) request, pid, addr, data)
#endif
+#endif /* __GENODE__ */
#endif /* gdb_ptrace.h */
diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c
index 1f21ef0..4538dc0 100644
--- a/gdb/nat/linux-ptrace.c
+++ b/gdb/nat/linux-ptrace.c
@@ -36,6 +36,7 @@ static int supported_ptrace_options = -1;
std::string
linux_ptrace_attach_fail_reason (pid_t pid)
{
+#ifndef __GENODE__
pid_t tracerpid = linux_proc_get_tracerpid_nowarn (pid);
std::string result;
@@ -51,6 +52,7 @@ linux_ptrace_attach_fail_reason (pid_t pid)
(int) pid);
return result;
+#endif
}
/* See linux-ptrace.h. */
@@ -73,12 +75,16 @@ linux_ptrace_attach_fail_reason_string (ptid_t ptid, int err)
/* Address of the 'ret' instruction in asm code block below. */
EXTERN_C void linux_ptrace_test_ret_to_nx_instr (void);
+#ifndef __GENODE__
#include <sys/reg.h>
+#endif
#include <sys/mman.h>
#include <signal.h>
-
+#else
+#include <signal.h>
#endif /* defined __i386__ || defined __x86_64__ */
+#ifndef __GENODE__
/* Test broken off-trunk Linux kernel patchset for NX support on i386. It was
removed in Fedora kernel 88fa1f0332d188795ed73d7ac2b1564e11a0b4cd.
@@ -240,6 +246,7 @@ linux_ptrace_test_ret_to_nx (void)
"support detected!"));
#endif /* defined __i386__ || defined __x86_64__ */
}
+#endif /* __GENODE__ */
/* Helper function to fork a process and make the child process call
the function FUNCTION, passing CHILD_STACK as parameter.
@@ -325,6 +332,7 @@ static void linux_test_for_exitkill (int child_pid);
void
linux_check_ptrace_features (void)
{
+#ifndef __GENODE__
int child_pid, ret, status;
/* Initialize the options. */
@@ -362,6 +370,7 @@ linux_check_ptrace_features (void)
my_waitpid (child_pid, &status, 0);
}
while (WIFSTOPPED (status));
+#endif
}
/* Determine if PTRACE_O_TRACESYSGOOD can be used to catch
@@ -479,6 +488,7 @@ linux_test_for_exitkill (int child_pid)
void
linux_enable_event_reporting (pid_t pid, int options)
{
+#ifndef __GENODE__
/* Check if we have initialized the ptrace features for this
target. If not, do it now. */
if (supported_ptrace_options == -1)
@@ -493,6 +503,7 @@ linux_enable_event_reporting (pid_t pid, int options)
/* Set the options. */
ptrace (PTRACE_SETOPTIONS, pid, (PTRACE_TYPE_ARG3) 0,
(PTRACE_TYPE_ARG4) (uintptr_t) options);
+#endif /* __GENODE__ */
}
/* Disable reporting of all currently supported ptrace events. */
@@ -500,8 +511,10 @@ linux_enable_event_reporting (pid_t pid, int options)
void
linux_disable_event_reporting (pid_t pid)
{
+#ifndef __GENODE__
/* Set the options. */
ptrace (PTRACE_SETOPTIONS, pid, (PTRACE_TYPE_ARG3) 0, 0);
+#endif /* __GENODE__ */
}
/* Returns non-zero if PTRACE_OPTIONS is contained within
@@ -580,7 +593,9 @@ linux_ptrace_init_warnings (void)
return;
warned = 1;
+#ifndef __GENODE__
linux_ptrace_test_ret_to_nx ();
+#endif
}
/* Extract extended ptrace event from wait status. */
diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h
index 98b44a8..178310e 100644
--- a/gdb/nat/linux-ptrace.h
+++ b/gdb/nat/linux-ptrace.h
@@ -115,7 +115,11 @@ struct buffer;
way to go. That said, some architecture may get the si_code wrong,
and as such we're leaving fallback code in place. We'll remove
this after a while if no problem is reported. */
+#ifdef __GENODE__
+#define USE_SIGTRAP_SIGINFO 0
+#else
#define USE_SIGTRAP_SIGINFO 1
+#endif
/* The x86 kernel gets some of the si_code values backwards, like
this: