X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ffrv-linux-tdep.c;h=c051a4deb9f6b70827d057ac23ff286e19054c6d;hb=71dee6639e9df74c4a4914b4cf19d53266ca9852;hp=7dce7a8626398593ff64f6ca90c87cdacac044b6;hpb=155bd5d1c1c18a53240f651475f55798e35c2659;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/frv-linux-tdep.c b/gdb/frv-linux-tdep.c index 7dce7a8626..c051a4deb9 100644 --- a/gdb/frv-linux-tdep.c +++ b/gdb/frv-linux-tdep.c @@ -1,13 +1,14 @@ /* Target-dependent code for GNU/Linux running on the Fujitsu FR-V, for GDB. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 + 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, @@ -16,9 +17,7 @@ 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 . */ #include "defs.h" #include "gdbcore.h" @@ -43,8 +42,9 @@ enum { }; static int -frv_linux_pc_in_sigtramp (CORE_ADDR pc, char *name) +frv_linux_pc_in_sigtramp (struct gdbarch *gdbarch, CORE_ADDR pc, char *name) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); char buf[frv_instr_size]; LONGEST instr; int retval = 0; @@ -52,7 +52,7 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, char *name) if (target_read_memory (pc, buf, sizeof buf) != 0) return 0; - instr = extract_unsigned_integer (buf, sizeof buf); + instr = extract_unsigned_integer (buf, sizeof buf, byte_order); if (instr == 0x8efc0077) /* setlos #__NR_sigreturn, gr7 */ retval = NORMAL_SIGTRAMP; @@ -63,7 +63,7 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, char *name) if (target_read_memory (pc + frv_instr_size, buf, sizeof buf) != 0) return 0; - instr = extract_unsigned_integer (buf, sizeof buf); + instr = extract_unsigned_integer (buf, sizeof buf, byte_order); if (instr != 0xc0700000) /* tira gr0, 0 */ return 0; @@ -167,9 +167,11 @@ frv_linux_pc_in_sigtramp (CORE_ADDR pc, char *name) } __attribute__((aligned(8))); */ static LONGEST -frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno, +frv_linux_sigcontext_reg_addr (struct frame_info *this_frame, int regno, CORE_ADDR *sc_addr_cache_ptr) { + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR sc_addr; if (sc_addr_cache_ptr && *sc_addr_cache_ptr) @@ -182,11 +184,11 @@ frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno, char buf[4]; int tramp_type; - pc = frame_pc_unwind (next_frame); - tramp_type = frv_linux_pc_in_sigtramp (pc, 0); + pc = get_frame_pc (this_frame); + tramp_type = frv_linux_pc_in_sigtramp (gdbarch, pc, 0); - frame_unwind_register (next_frame, sp_regnum, buf); - sp = extract_unsigned_integer (buf, sizeof buf); + get_frame_register (this_frame, sp_regnum, buf); + sp = extract_unsigned_integer (buf, sizeof buf, byte_order); if (tramp_type == NORMAL_SIGTRAMP) { @@ -208,7 +210,7 @@ frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno, warning (_("Can't read realtime sigtramp frame.")); return 0; } - sc_addr = extract_unsigned_integer (buf, sizeof buf); + sc_addr = extract_unsigned_integer (buf, sizeof buf, byte_order); sc_addr += 24; } else @@ -255,10 +257,12 @@ frv_linux_sigcontext_reg_addr (struct frame_info *next_frame, int regno, /* Signal trampolines. */ static struct trad_frame_cache * -frv_linux_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) +frv_linux_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) { + struct gdbarch *gdbarch = get_frame_arch (this_frame); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct trad_frame_cache *cache; - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); CORE_ADDR addr; char buf[4]; int regnum; @@ -268,20 +272,20 @@ frv_linux_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache if (*this_cache) return *this_cache; - cache = trad_frame_cache_zalloc (next_frame); + cache = trad_frame_cache_zalloc (this_frame); /* FIXME: cagney/2004-05-01: This is is long standing broken code. The frame ID's code address should be the start-address of the signal trampoline and not the current PC within that trampoline. */ - frame_unwind_register (next_frame, sp_regnum, buf); - this_id = frame_id_build (extract_unsigned_integer (buf, sizeof buf), - frame_pc_unwind (next_frame)); + get_frame_register (this_frame, sp_regnum, buf); + addr = extract_unsigned_integer (buf, sizeof buf, byte_order); + this_id = frame_id_build (addr, get_frame_pc (this_frame)); trad_frame_set_id (cache, this_id); for (regnum = 0; regnum < frv_num_regs; regnum++) { - LONGEST reg_addr = frv_linux_sigcontext_reg_addr (next_frame, regnum, + LONGEST reg_addr = frv_linux_sigcontext_reg_addr (this_frame, regnum, &sc_addr_cache_val); if (reg_addr != -1) trad_frame_set_reg_addr (cache, regnum, reg_addr); @@ -292,48 +296,48 @@ frv_linux_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache } static void -frv_linux_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache, +frv_linux_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache, struct frame_id *this_id) { struct trad_frame_cache *cache = - frv_linux_sigtramp_frame_cache (next_frame, this_cache); + frv_linux_sigtramp_frame_cache (this_frame, this_cache); trad_frame_get_id (cache, this_id); } -static void -frv_linux_sigtramp_frame_prev_register (struct frame_info *next_frame, - void **this_cache, - int regnum, int *optimizedp, - enum lval_type *lvalp, CORE_ADDR *addrp, - int *realnump, gdb_byte *valuep) +static struct value * +frv_linux_sigtramp_frame_prev_register (struct frame_info *this_frame, + void **this_cache, int regnum) { /* Make sure we've initialized the cache. */ struct trad_frame_cache *cache = - frv_linux_sigtramp_frame_cache (next_frame, this_cache); - trad_frame_get_register (cache, next_frame, regnum, optimizedp, lvalp, - addrp, realnump, valuep); + frv_linux_sigtramp_frame_cache (this_frame, this_cache); + return trad_frame_get_register (cache, this_frame, regnum); } -static const struct frame_unwind frv_linux_sigtramp_frame_unwind = -{ - SIGTRAMP_FRAME, - frv_linux_sigtramp_frame_this_id, - frv_linux_sigtramp_frame_prev_register -}; - -static const struct frame_unwind * -frv_linux_sigtramp_frame_sniffer (struct frame_info *next_frame) +static int +frv_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, + struct frame_info *this_frame, + void **this_cache) { - CORE_ADDR pc = frame_pc_unwind (next_frame); + struct gdbarch *gdbarch = get_frame_arch (this_frame); + CORE_ADDR pc = get_frame_pc (this_frame); char *name; find_pc_partial_function (pc, &name, NULL, NULL); - if (frv_linux_pc_in_sigtramp (pc, name)) - return &frv_linux_sigtramp_frame_unwind; + if (frv_linux_pc_in_sigtramp (gdbarch, pc, name)) + return 1; - return NULL; + return 0; } +static const struct frame_unwind frv_linux_sigtramp_frame_unwind = +{ + SIGTRAMP_FRAME, + frv_linux_sigtramp_frame_this_id, + frv_linux_sigtramp_frame_prev_register, + NULL, + frv_linux_sigtramp_frame_sniffer +}; /* The FRV kernel defines ELF_NGREG as 46. We add 2 in order to include the loadmap addresses in the register set. (See below for more info.) */ @@ -487,7 +491,7 @@ static void frv_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { /* Set the sigtramp frame sniffer. */ - frame_unwind_append_sniffer (gdbarch, frv_linux_sigtramp_frame_sniffer); + frame_unwind_append_unwinder (gdbarch, &frv_linux_sigtramp_frame_unwind); set_gdbarch_regset_from_core_section (gdbarch, frv_linux_regset_from_core_section); }