This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 02/17] Linux kernel generic support
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Date: Mon, 01 Jul 2013 07:57:07 -0300
- Subject: Re: [PATCH 02/17] Linux kernel generic support
- References: <1372664545-3947-1-git-send-email-sergiodj at redhat dot com> <1372664545-3947-3-git-send-email-sergiodj at redhat dot com>
On Monday, July 01 2013, I wrote:
> This is, along with the gdbarch changes, the main patch of this series.
> It implements the generic converter between GDB's internal signals and
> x86 ones.
According to Andreas' and Pedro's comments, here is a new patch which
updates the comment on linux-tdep.c's enum definition. The ChangeLog is
the same.
> 2013-07-01 Sergio Durigan Junior <sergiodj@redhat.com>
>
> * linux-tdep.c: Define enum with x86 signal numbers.
> (linux_gdb_signal_to_target): New function.
> * linux-tdep.h (linux_gdb_signal_to_target): New prototype.
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index bfb6404..ec39060 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -36,6 +36,63 @@
#include <ctype.h>
+/* This enum represents the signals' numbers on a generic architecture
+ running the Linux kernel. The definition of "generic" comes from
+ the file <include/uapi/asm-generic/signal.h>, from the Linux kernel
+ tree, which is the "de facto" implementation of signal numbers to
+ be used by new architecture ports.
+
+ For those architectures which have differences from the generic
+ standard (e.g., Alpha), we define the different signals (and *only*
+ those) in the specific target-dependent file (e.g.,
+ alpha-linux-tdep.c, for Alpha). Please refer to the architecture's
+ tdep file for more information.
+
+ As stated above, this enum is derived from
+ <include/uapi/asm-generic/signal.h>, from the Linux kernel
+ tree. */
+
+enum
+ {
+ LINUX_SIGHUP = 1,
+ LINUX_SIGINT = 2,
+ LINUX_SIGQUIT = 3,
+ LINUX_SIGILL = 4,
+ LINUX_SIGTRAP = 5,
+ LINUX_SIGABRT = 6,
+ LINUX_SIGIOT = 6,
+ LINUX_SIGBUS = 7,
+ LINUX_SIGFPE = 8,
+ LINUX_SIGKILL = 9,
+ LINUX_SIGUSR1 = 10,
+ LINUX_SIGSEGV = 11,
+ LINUX_SIGUSR2 = 12,
+ LINUX_SIGPIPE = 13,
+ LINUX_SIGALRM = 14,
+ LINUX_SIGTERM = 15,
+ LINUX_SIGSTKFLT = 16,
+ LINUX_SIGCHLD = 17,
+ LINUX_SIGCONT = 18,
+ LINUX_SIGSTOP = 19,
+ LINUX_SIGTSTP = 20,
+ LINUX_SIGTTIN = 21,
+ LINUX_SIGTTOU = 22,
+ LINUX_SIGURG = 23,
+ LINUX_SIGXCPU = 24,
+ LINUX_SIGXFSZ = 25,
+ LINUX_SIGVTALRM = 26,
+ LINUX_SIGPROF = 27,
+ LINUX_SIGWINCH = 28,
+ LINUX_SIGIO = 29,
+ LINUX_SIGPOLL = LINUX_SIGIO,
+ LINUX_SIGPWR = 30,
+ LINUX_SIGSYS = 31,
+ LINUX_SIGUNUSED = 31,
+
+ LINUX_SIGRTMIN = 32,
+ LINUX_SIGRTMAX = 64,
+ };
+
static struct gdbarch_data *linux_gdbarch_data_handle;
struct linux_gdbarch_data
@@ -1447,6 +1504,134 @@ linux_make_corefile_notes_1 (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
linux_collect_thread_registers);
}
+/* Implementation of `gdbarch_gdb_signal_to_target', as defined in
+ gdbarch.h. This function is not static because it is exported to
+ other -tdep files. */
+
+int
+linux_gdb_signal_to_target (struct gdbarch *gdbarch,
+ enum gdb_signal signal)
+{
+ switch (signal)
+ {
+ case GDB_SIGNAL_0:
+ return 0;
+
+ case GDB_SIGNAL_HUP:
+ return LINUX_SIGHUP;
+
+ case GDB_SIGNAL_INT:
+ return LINUX_SIGINT;
+
+ case GDB_SIGNAL_QUIT:
+ return LINUX_SIGQUIT;
+
+ case GDB_SIGNAL_ILL:
+ return LINUX_SIGILL;
+
+ case GDB_SIGNAL_TRAP:
+ return LINUX_SIGTRAP;
+
+ case GDB_SIGNAL_ABRT:
+ return LINUX_SIGABRT;
+
+ case GDB_SIGNAL_FPE:
+ return LINUX_SIGFPE;
+
+ case GDB_SIGNAL_KILL:
+ return LINUX_SIGKILL;
+
+ case GDB_SIGNAL_BUS:
+ return LINUX_SIGBUS;
+
+ case GDB_SIGNAL_SEGV:
+ return LINUX_SIGSEGV;
+
+ case GDB_SIGNAL_SYS:
+ return LINUX_SIGSYS;
+
+ case GDB_SIGNAL_PIPE:
+ return LINUX_SIGPIPE;
+
+ case GDB_SIGNAL_ALRM:
+ return LINUX_SIGALRM;
+
+ case GDB_SIGNAL_TERM:
+ return LINUX_SIGTERM;
+
+ case GDB_SIGNAL_URG:
+ return LINUX_SIGURG;
+
+ case GDB_SIGNAL_STOP:
+ return LINUX_SIGSTOP;
+
+ case GDB_SIGNAL_TSTP:
+ return LINUX_SIGTSTP;
+
+ case GDB_SIGNAL_CONT:
+ return LINUX_SIGCONT;
+
+ case GDB_SIGNAL_CHLD:
+ return LINUX_SIGCHLD;
+
+ case GDB_SIGNAL_TTIN:
+ return LINUX_SIGTTIN;
+
+ case GDB_SIGNAL_TTOU:
+ return LINUX_SIGTTOU;
+
+ case GDB_SIGNAL_IO:
+ return LINUX_SIGIO;
+
+ case GDB_SIGNAL_XCPU:
+ return LINUX_SIGXCPU;
+
+ case GDB_SIGNAL_XFSZ:
+ return LINUX_SIGXFSZ;
+
+ case GDB_SIGNAL_VTALRM:
+ return LINUX_SIGVTALRM;
+
+ case GDB_SIGNAL_PROF:
+ return LINUX_SIGPROF;
+
+ case GDB_SIGNAL_WINCH:
+ return LINUX_SIGWINCH;
+
+ case GDB_SIGNAL_USR1:
+ return LINUX_SIGUSR1;
+
+ case GDB_SIGNAL_USR2:
+ return LINUX_SIGUSR2;
+
+ case GDB_SIGNAL_PWR:
+ return LINUX_SIGPWR;
+
+ case GDB_SIGNAL_POLL:
+ return LINUX_SIGPOLL;
+
+ /* GDB_SIGNAL_REALTIME_32 is not continuous in <gdb/signals.def>,
+ therefore we have to handle it here. */
+ case GDB_SIGNAL_REALTIME_32:
+ return LINUX_SIGRTMIN;
+
+ /* Same comment applies to _64. */
+ case GDB_SIGNAL_REALTIME_64:
+ return LINUX_SIGRTMAX;
+ }
+
+ /* GDB_SIGNAL_REALTIME_33 to _64 are continuous. */
+ if (signal >= GDB_SIGNAL_REALTIME_33
+ && signal <= GDB_SIGNAL_REALTIME_63)
+ {
+ int offset = signal - GDB_SIGNAL_REALTIME_33;
+
+ return LINUX_SIGRTMIN + 1 + offset;
+ }
+
+ return -1;
+}
+
/* To be called from the various GDB_OSABI_LINUX handlers for the
various GNU/Linux architectures and machine types. */
diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h
index 380507e..c1d80de 100644
--- a/gdb/linux-tdep.h
+++ b/gdb/linux-tdep.h
@@ -34,6 +34,9 @@ char *linux_make_corefile_notes (struct gdbarch *, bfd *, int *,
struct type *linux_get_siginfo_type (struct gdbarch *);
+extern int linux_gdb_signal_to_target (struct gdbarch *gdbarch,
+ enum gdb_signal signal);
+
extern void linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
#endif /* linux-tdep.h */