X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fxtensa-linux-tdep.c;h=d27cc42e0e80a18c789219bb6f01b1c46f6db2dc;hb=8a6200ba863f207d93467312431d107f50f0e2ab;hp=0d2137828eab649c27788b40d143bf862781f40f;hpb=a5ee0f0c4d286ed3437ded51e904016b1e26209d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xtensa-linux-tdep.c b/gdb/xtensa-linux-tdep.c index 0d2137828e..d27cc42e0e 100644 --- a/gdb/xtensa-linux-tdep.c +++ b/gdb/xtensa-linux-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for GNU/Linux on Xtensa processors. - Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2007-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -23,6 +23,75 @@ #include "solib-svr4.h" #include "symtab.h" +/* This enum represents the signals' numbers on the Xtensa + architecture. It just contains the signal definitions which are + different from the generic implementation. + + It is derived from the file , + from the Linux kernel tree. */ + +enum + { + XTENSA_LINUX_SIGRTMIN = 32, + XTENSA_LINUX_SIGRTMAX = 63, + }; + +/* Implementation of `gdbarch_gdb_signal_from_target', as defined in + gdbarch.h. */ + +static enum gdb_signal +xtensa_linux_gdb_signal_from_target (struct gdbarch *gdbarch, + int signal) +{ + if (signal >= XTENSA_LINUX_SIGRTMIN && signal <= XTENSA_LINUX_SIGRTMAX) + { + int offset = signal - XTENSA_LINUX_SIGRTMIN; + + if (offset == 0) + return GDB_SIGNAL_REALTIME_32; + else + return (enum gdb_signal) (offset - 1 + + (int) GDB_SIGNAL_REALTIME_33); + } + else if (signal > XTENSA_LINUX_SIGRTMAX) + return GDB_SIGNAL_UNKNOWN; + + return linux_gdb_signal_from_target (gdbarch, signal); +} + +/* Implementation of `gdbarch_gdb_signal_to_target', as defined in + gdbarch.h. */ + +static int +xtensa_linux_gdb_signal_to_target (struct gdbarch *gdbarch, + enum gdb_signal signal) +{ + switch (signal) + { + /* GDB_SIGNAL_REALTIME_32 is not continuous in , + therefore we have to handle it here. */ + case GDB_SIGNAL_REALTIME_32: + return XTENSA_LINUX_SIGRTMIN; + + /* GDB_SIGNAL_REALTIME_64 is not valid on Xtensa. */ + case GDB_SIGNAL_REALTIME_64: + return -1; + } + + /* GDB_SIGNAL_REALTIME_33 to _63 are continuous. + + Xtensa does not have _64. */ + if (signal >= GDB_SIGNAL_REALTIME_33 + && signal <= GDB_SIGNAL_REALTIME_63) + { + int offset = signal - GDB_SIGNAL_REALTIME_33; + + return XTENSA_LINUX_SIGRTMIN + 1 + offset; + } + + return linux_gdb_signal_to_target (gdbarch, signal); +} + /* OS specific initialization of gdbarch. */ static void @@ -32,6 +101,15 @@ xtensa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); + + set_gdbarch_gdb_signal_from_target (gdbarch, + xtensa_linux_gdb_signal_from_target); + set_gdbarch_gdb_signal_to_target (gdbarch, + xtensa_linux_gdb_signal_to_target); + + /* Enable TLS support. */ + set_gdbarch_fetch_tls_load_module_address (gdbarch, + svr4_fetch_objfile_link_map); } /* Provide a prototype to silence -Wmissing-prototypes. */