X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fppcobsd-tdep.c;h=2cc62a0db3ba58dbf1fa1266d873eb39a1cfd54b;hb=21002a635bf3da33367592e3a3ab3cce24fe5299;hp=dac9e7bb24e401b0af03b99d641d17063fb8acaa;hpb=f2db237aa14bae7e5e7a7c4c85e4c2c84b11a30e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ppcobsd-tdep.c b/gdb/ppcobsd-tdep.c index dac9e7bb24..2cc62a0db3 100644 --- a/gdb/ppcobsd-tdep.c +++ b/gdb/ppcobsd-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for OpenBSD/powerpc. - Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 2004-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -28,9 +28,6 @@ #include "symtab.h" #include "trad-frame.h" -#include "gdb_assert.h" -#include "gdb_string.h" - #include "ppc-tdep.h" #include "ppcobsd-tdep.h" #include "solib-svr4.h" @@ -56,7 +53,7 @@ ppcobsd_supply_gregset (const struct regset *regset, } /* Collect register REGNUM in the general-purpose register set - REGSET. from register cache REGCACHE into the buffer specified by + REGSET, from register cache REGCACHE into the buffer specified by GREGS and LEN. If REGNUM is -1, do this for all registers in REGSET. */ @@ -71,29 +68,27 @@ ppcobsd_collect_gregset (const struct regset *regset, /* OpenBSD/powerpc register set. */ -struct regset ppcobsd_gregset = +const struct regset ppcobsd_gregset = { &ppcobsd_reg_offsets, ppcobsd_supply_gregset }; -struct regset ppcobsd_fpregset = +const struct regset ppcobsd_fpregset = { &ppcobsd_fpreg_offsets, ppc_supply_fpregset }; -/* Return the appropriate register set for the core section identified - by SECT_NAME and SECT_SIZE. */ +/* Iterate over core file register note sections. */ -static const struct regset * -ppcobsd_regset_from_core_section (struct gdbarch *gdbarch, - const char *sect_name, size_t sect_size) +static void +ppcobsd_iterate_over_regset_sections (struct gdbarch *gdbarch, + iterate_over_regset_sections_cb *cb, + void *cb_data, + const struct regcache *regcache) { - if (strcmp (sect_name, ".reg") == 0 && sect_size >= 412) - return &ppcobsd_gregset; - - return NULL; + cb (".reg", 412, &ppcobsd_gregset, NULL, cb_data); } @@ -121,12 +116,16 @@ static const int ppcobsd_sigreturn_offset[] = { }; static int -ppcobsd_sigtramp_p (struct frame_info *next_frame) +ppcobsd_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); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + CORE_ADDR pc = get_frame_pc (this_frame); CORE_ADDR start_pc = (pc & ~(ppcobsd_page_size - 1)); const int *offset; - char *name; + const char *name; find_pc_partial_function (pc, &name, NULL, NULL); if (name) @@ -137,17 +136,18 @@ ppcobsd_sigtramp_p (struct frame_info *next_frame) gdb_byte buf[2 * PPC_INSN_SIZE]; unsigned long insn; - if (!safe_frame_unwind_memory (next_frame, start_pc + *offset, + if (!safe_frame_unwind_memory (this_frame, start_pc + *offset, buf, sizeof buf)) continue; /* Check for "li r0,SYS_sigreturn". */ - insn = extract_unsigned_integer (buf, PPC_INSN_SIZE); + insn = extract_unsigned_integer (buf, PPC_INSN_SIZE, byte_order); if (insn != 0x38000067) continue; /* Check for "sc". */ - insn = extract_unsigned_integer (buf + PPC_INSN_SIZE, PPC_INSN_SIZE); + insn = extract_unsigned_integer (buf + PPC_INSN_SIZE, + PPC_INSN_SIZE, byte_order); if (insn != 0x44000002) continue; @@ -158,10 +158,11 @@ ppcobsd_sigtramp_p (struct frame_info *next_frame) } static struct trad_frame_cache * -ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) +ppcobsd_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) { - struct gdbarch *gdbarch = get_frame_arch (next_frame); + 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; CORE_ADDR addr, base, func; gdb_byte buf[PPC_INSN_SIZE]; @@ -169,24 +170,23 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) int i; if (*this_cache) - return *this_cache; + return (struct trad_frame_cache *) *this_cache; - cache = trad_frame_cache_zalloc (next_frame); + cache = trad_frame_cache_zalloc (this_frame); *this_cache = cache; - func = frame_pc_unwind (next_frame); + func = get_frame_pc (this_frame); func &= ~(ppcobsd_page_size - 1); - if (!safe_frame_unwind_memory (next_frame, func, buf, sizeof buf)) + if (!safe_frame_unwind_memory (this_frame, func, buf, sizeof buf)) return cache; /* Calculate the offset where we can find `struct sigcontext'. We base our calculation on the amount of stack space reserved by the first instruction of the signal trampoline. */ - insn = extract_unsigned_integer (buf, PPC_INSN_SIZE); + insn = extract_unsigned_integer (buf, PPC_INSN_SIZE, byte_order); sigcontext_offset = (0x10000 - (insn & 0x0000ffff)) + 8; - base = frame_unwind_register_unsigned (next_frame, - gdbarch_sp_regnum (current_gdbarch)); + base = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch)); addr = base + sigcontext_offset + 2 * tdep->wordsize; for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize) { @@ -201,8 +201,8 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) addr += tdep->wordsize; trad_frame_set_reg_addr (cache, tdep->ppc_ctr_regnum, addr); addr += tdep->wordsize; - trad_frame_set_reg_addr (cache, gdbarch_pc_regnum (current_gdbarch), addr); - /* SRR0? */ + trad_frame_set_reg_addr (cache, gdbarch_pc_regnum (gdbarch), addr); + /* SRR0? */ addr += tdep->wordsize; /* Construct the frame ID using the function start. */ @@ -212,43 +212,33 @@ ppcobsd_sigtramp_frame_cache (struct frame_info *next_frame, void **this_cache) } static void -ppcobsd_sigtramp_frame_this_id (struct frame_info *next_frame, +ppcobsd_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache, struct frame_id *this_id) { struct trad_frame_cache *cache = - ppcobsd_sigtramp_frame_cache (next_frame, this_cache); + ppcobsd_sigtramp_frame_cache (this_frame, this_cache); trad_frame_get_id (cache, this_id); } -static void -ppcobsd_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 * +ppcobsd_sigtramp_frame_prev_register (struct frame_info *this_frame, + void **this_cache, int regnum) { struct trad_frame_cache *cache = - ppcobsd_sigtramp_frame_cache (next_frame, this_cache); + ppcobsd_sigtramp_frame_cache (this_frame, this_cache); - trad_frame_get_register (cache, next_frame, regnum, - optimizedp, lvalp, addrp, realnump, valuep); + return trad_frame_get_register (cache, this_frame, regnum); } static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = { SIGTRAMP_FRAME, + default_frame_unwind_stop_reason, ppcobsd_sigtramp_frame_this_id, - ppcobsd_sigtramp_frame_prev_register + ppcobsd_sigtramp_frame_prev_register, + NULL, + ppcobsd_sigtramp_frame_sniffer }; - -static const struct frame_unwind * -ppcobsd_sigtramp_frame_sniffer (struct frame_info *next_frame) -{ - if (ppcobsd_sigtramp_p (next_frame)) - return &ppcobsd_sigtramp_frame_unwind; - - return NULL; -} static void @@ -265,10 +255,10 @@ ppcobsd_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_regset_from_core_section - (gdbarch, ppcobsd_regset_from_core_section); + set_gdbarch_iterate_over_regset_sections + (gdbarch, ppcobsd_iterate_over_regset_sections); - frame_unwind_append_sniffer (gdbarch, ppcobsd_sigtramp_frame_sniffer); + frame_unwind_append_unwinder (gdbarch, &ppcobsd_sigtramp_frame_unwind); }