X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fxtensa-linux-tdep.c;h=796143c6699baf94b6e0c4bd5bb765af4536556e;hb=b93a00ca4d49ce35b52110ac1c49b9e5c4587019;hp=7fd2c90f9f44072dc01bcaf11980b1ad45f7c4c3;hpb=8acc9f485bba28b65935dcc3498d9f3b712ddac7;p=external%2Fbinutils.git diff --git a/gdb/xtensa-linux-tdep.c b/gdb/xtensa-linux-tdep.c index 7fd2c90..796143c 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-2013 Free Software Foundation, Inc. + Copyright (C) 2007-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -18,24 +18,111 @@ along with this program. If not, see . */ #include "defs.h" +#include "xtensa-tdep.h" #include "osabi.h" #include "linux-tdep.h" #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 xtensa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (tdep->num_nopriv_regs < tdep->num_regs) + { + tdep->num_pseudo_regs += tdep->num_regs - tdep->num_nopriv_regs; + tdep->num_regs = tdep->num_nopriv_regs; + + set_gdbarch_num_regs (gdbarch, tdep->num_regs); + set_gdbarch_num_pseudo_regs (gdbarch, tdep->num_pseudo_regs); + } + linux_init_abi (info, gdbarch); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); -} -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_xtensa_linux_tdep; + 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); +} void _initialize_xtensa_linux_tdep (void)