/* Target-dependent code for GNU/Linux on Alpha.
- Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2002-2003, 2007-2012 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "frame.h"
#include "symtab.h"
#include "regset.h"
#include "regcache.h"
-
+#include "linux-tdep.h"
#include "alpha-tdep.h"
/* Under GNU/Linux, signal handler invocations can be identified by
(2) the kernel has changed from using "addq" to "lda" to load the
syscall number,
(3) there is a "normal" sigreturn and an "rt" sigreturn which
- has a different stack layout.
-*/
+ has a different stack layout. */
static long
-alpha_linux_sigtramp_offset_1 (CORE_ADDR pc)
+alpha_linux_sigtramp_offset_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
{
- switch (alpha_read_insn (pc))
+ switch (alpha_read_insn (gdbarch, pc))
{
case 0x47de0410: /* bis $30,$30,$16 */
case 0x47fe0410: /* bis $31,$30,$16 */
}
static LONGEST
-alpha_linux_sigtramp_offset (CORE_ADDR pc)
+alpha_linux_sigtramp_offset (struct gdbarch *gdbarch, CORE_ADDR pc)
{
long i, off;
return -1;
/* Guess where we might be in the sequence. */
- off = alpha_linux_sigtramp_offset_1 (pc);
+ off = alpha_linux_sigtramp_offset_1 (gdbarch, pc);
if (off < 0)
return -1;
{
if (i == off)
continue;
- if (alpha_linux_sigtramp_offset_1 (pc + i) != i)
+ if (alpha_linux_sigtramp_offset_1 (gdbarch, pc + i) != i)
return -1;
}
}
static int
-alpha_linux_pc_in_sigtramp (CORE_ADDR pc, char *func_name)
+alpha_linux_pc_in_sigtramp (struct gdbarch *gdbarch,
+ CORE_ADDR pc, const char *func_name)
{
- return alpha_linux_sigtramp_offset (pc) >= 0;
+ return alpha_linux_sigtramp_offset (gdbarch, pc) >= 0;
}
static CORE_ADDR
-alpha_linux_sigcontext_addr (struct frame_info *next_frame)
+alpha_linux_sigcontext_addr (struct frame_info *this_frame)
{
+ struct gdbarch *gdbarch = get_frame_arch (this_frame);
CORE_ADDR pc;
ULONGEST sp;
long off;
- pc = frame_pc_unwind (next_frame);
- frame_unwind_unsigned_register (next_frame, ALPHA_SP_REGNUM, &sp);
+ pc = get_frame_pc (this_frame);
+ sp = get_frame_register_unsigned (this_frame, ALPHA_SP_REGNUM);
- off = alpha_linux_sigtramp_offset (pc);
+ off = alpha_linux_sigtramp_offset (gdbarch, pc);
gdb_assert (off >= 0);
/* __NR_rt_sigreturn has a couple of structures on the stack. This is:
struct ucontext uc;
};
- offsetof (struct rt_sigframe, uc.uc_mcontext);
- */
- if (alpha_read_insn (pc - off + 4) == 0x201f015f)
+ offsetof (struct rt_sigframe, uc.uc_mcontext); */
+
+ if (alpha_read_insn (gdbarch, pc - off + 4) == 0x201f015f)
return sp + 176;
/* __NR_sigreturn has the sigcontext structure at the top of the stack. */
}
if (regnum == ALPHA_FPCR_REGNUM || regnum == -1)
- regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 32 * 8);
+ regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 31 * 8);
}
static struct regset alpha_linux_gregset =
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
-const struct regset *
+static const struct regset *
alpha_linux_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
{
struct gdbarch_tdep *tdep;
+ linux_init_abi (info, gdbarch);
+
/* Hook into the DWARF CFI frame unwinder. */
alpha_dwarf2_init_abi (info, gdbarch);
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
+ set_solib_svr4_fetch_link_map_offsets
+ (gdbarch, svr4_lp64_fetch_link_map_offsets);
+
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
svr4_fetch_objfile_link_map);
(gdbarch, alpha_linux_regset_from_core_section);
}
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_alpha_linux_tdep;
+
void
_initialize_alpha_linux_tdep (void)
{