mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-09 18:53:00 +00:00
* sparc64-tdep.h (SPARC64_PSTATE_AG, SPARC64_PSTATE_IE)
(SPARC64_PSTATE_PRIV, SPARC64_PSTATE_AM, SPARC64_PSTATE_PEF) (SPARC64_PSTATE_RED, SPARC64_PSTATE_TLE, SPARC64_PSTATE_CLE) (SPARC64_PSTATE_PID0, SPARC64_PSTATE_PID1): New defines. * sparc64nbsd-nat.c: Include "gdbcore.h". (sparc64nbsd_supply_pcb): Get %pc from stack if necessary. Supply processor state register. * sparc64obsd-tdep.c (sparc64obsd_trapframe_cache) (sparc64obsd_trapframe_this_id) (sparc64obsd_trapframe_prev_register) (sparc64obsd_trapframe_sniffer): New functions. (sparc64obsd_trapframe_unwind): New variable. (sparc64obsd_init_abi): Append trapframe unwinder. * Makefile.in (sparc64nbsd-nat.o): Update dependencies.
This commit is contained in:
parent
f9225e75c0
commit
6df5070e3f
@ -1,3 +1,20 @@
|
||||
2006-12-31 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* sparc64-tdep.h (SPARC64_PSTATE_AG, SPARC64_PSTATE_IE)
|
||||
(SPARC64_PSTATE_PRIV, SPARC64_PSTATE_AM, SPARC64_PSTATE_PEF)
|
||||
(SPARC64_PSTATE_RED, SPARC64_PSTATE_TLE, SPARC64_PSTATE_CLE)
|
||||
(SPARC64_PSTATE_PID0, SPARC64_PSTATE_PID1): New defines.
|
||||
* sparc64nbsd-nat.c: Include "gdbcore.h".
|
||||
(sparc64nbsd_supply_pcb): Get %pc from stack if necessary. Supply
|
||||
processor state register.
|
||||
* sparc64obsd-tdep.c (sparc64obsd_trapframe_cache)
|
||||
(sparc64obsd_trapframe_this_id)
|
||||
(sparc64obsd_trapframe_prev_register)
|
||||
(sparc64obsd_trapframe_sniffer): New functions.
|
||||
(sparc64obsd_trapframe_unwind): New variable.
|
||||
(sparc64obsd_init_abi): Append trapframe unwinder.
|
||||
* Makefile.in (sparc64nbsd-nat.o): Update dependencies.
|
||||
|
||||
2006-12-30 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* infrun.c (handle_inferior_event): Don't call
|
||||
|
@ -2676,8 +2676,8 @@ sparc64-linux-tdep.o: sparc64-linux-tdep.c $(defs_h) $(frame_h) \
|
||||
$(trad_frame_h) $(tramp_frame_h) $(sparc64_tdep_h)
|
||||
sparc64-nat.o: sparc64-nat.c $(defs_h) $(gdbarch_h) $(sparc64_tdep_h) \
|
||||
$(sparc_nat_h)
|
||||
sparc64nbsd-nat.o: sparc64nbsd-nat.c $(defs_h) $(regcache_h) $(target_h) \
|
||||
$(sparc64_tdep_h) $(sparc_nat_h) $(bsd_kvm_h)
|
||||
sparc64nbsd-nat.o: sparc64nbsd-nat.c $(defs_h) $(gdbcore_h) $(regcache_h) \
|
||||
$(target_h) $(sparc64_tdep_h) $(sparc_nat_h) $(bsd_kvm_h)
|
||||
sparc64nbsd-tdep.o: sparc64nbsd-tdep.c $(defs_h) $(frame_h) \
|
||||
$(frame_unwind_h) $(gdbcore_h) $(osabi_h) $(regcache_h) $(regset_h) \
|
||||
$(symtab_h) $(objfiles_h) $(solib_svr4_h) $(trad_frame_h) \
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Target-dependent code for UltraSPARC.
|
||||
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -84,6 +84,18 @@ enum sparc64_regnum
|
||||
= SPARC64_Q0_REGNUM + 15
|
||||
};
|
||||
|
||||
/* Processor state bits. */
|
||||
#define SPARC64_PSTATE_AG 0x001
|
||||
#define SPARC64_PSTATE_IE 0x002
|
||||
#define SPARC64_PSTATE_PRIV 0x004
|
||||
#define SPARC64_PSTATE_AM 0x008
|
||||
#define SPARC64_PSTATE_PEF 0x010
|
||||
#define SPARC64_PSTATE_RED 0x020
|
||||
#define SPARC64_PSTATE_TLE 0x100
|
||||
#define SPARC64_PSTATE_CLE 0x200
|
||||
#define SPARC64_PSTATE_PID0 0x400
|
||||
#define SPARC64_PSTATE_PID1 0x800
|
||||
|
||||
extern void sparc64_init_abi (struct gdbarch_info info,
|
||||
struct gdbarch *gdbarch);
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Native-dependent code for NetBSD/sparc64.
|
||||
|
||||
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include "defs.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "target.h"
|
||||
|
||||
@ -136,6 +137,7 @@ sparc64nbsd_fpregset_supplies_p (int regnum)
|
||||
static int
|
||||
sparc64nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
|
||||
{
|
||||
u_int64_t state;
|
||||
int regnum;
|
||||
|
||||
/* The following is true for NetBSD 1.6.2:
|
||||
@ -148,9 +150,19 @@ sparc64nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
|
||||
if (pcb->pcb_sp == 0)
|
||||
return 0;
|
||||
|
||||
/* If the program counter is zero, this is probably a core dump, and
|
||||
we can get %pc from the stack. */
|
||||
if (pcb->pcb_pc == 0)
|
||||
read_memory(pcb->pcb_sp + BIAS - 176 + (11 * 8),
|
||||
(gdb_byte *)&pcb->pcb_pc, sizeof pcb->pcb_pc);
|
||||
|
||||
|
||||
regcache_raw_supply (regcache, SPARC_SP_REGNUM, &pcb->pcb_sp);
|
||||
regcache_raw_supply (regcache, SPARC64_PC_REGNUM, &pcb->pcb_pc);
|
||||
|
||||
state = pcb->pcb_pstate << 8 | pcb->pcb_cwp;
|
||||
regcache_raw_supply (regcache, SPARC64_STATE_REGNUM, &state);
|
||||
|
||||
sparc_supply_rwindow (regcache, pcb->pcb_sp, -1);
|
||||
|
||||
return 1;
|
||||
|
@ -202,6 +202,86 @@ sparc64obsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Kernel debugging support. */
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc64obsd_trapframe_cache(struct frame_info *next_frame, void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR sp, trapframe_addr;
|
||||
int regnum;
|
||||
|
||||
if (*this_cache)
|
||||
return *this_cache;
|
||||
|
||||
cache = sparc_frame_cache (next_frame, this_cache);
|
||||
gdb_assert (cache == *this_cache);
|
||||
|
||||
sp = frame_unwind_register_unsigned (next_frame, SPARC_SP_REGNUM);
|
||||
trapframe_addr = sp + BIAS + 176;
|
||||
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
cache->saved_regs[SPARC64_STATE_REGNUM].addr = trapframe_addr;
|
||||
cache->saved_regs[SPARC64_PC_REGNUM].addr = trapframe_addr + 8;
|
||||
cache->saved_regs[SPARC64_NPC_REGNUM].addr = trapframe_addr + 16;
|
||||
|
||||
for (regnum = SPARC_G0_REGNUM; regnum <= SPARC_I7_REGNUM; regnum++)
|
||||
cache->saved_regs[regnum].addr =
|
||||
trapframe_addr + 48 + (regnum - SPARC_G0_REGNUM) * 8;
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64obsd_trapframe_this_id (struct frame_info *next_frame,
|
||||
void **this_cache, struct frame_id *this_id)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64obsd_trapframe_cache (next_frame, this_cache);
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, cache->pc);
|
||||
}
|
||||
|
||||
static void
|
||||
sparc64obsd_trapframe_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)
|
||||
{
|
||||
struct sparc_frame_cache *cache =
|
||||
sparc64obsd_trapframe_cache (next_frame, this_cache);
|
||||
|
||||
trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
|
||||
optimizedp, lvalp, addrp, realnump, valuep);
|
||||
}
|
||||
|
||||
static const struct frame_unwind sparc64obsd_trapframe_unwind =
|
||||
{
|
||||
NORMAL_FRAME,
|
||||
sparc64obsd_trapframe_this_id,
|
||||
sparc64obsd_trapframe_prev_register
|
||||
};
|
||||
|
||||
static const struct frame_unwind *
|
||||
sparc64obsd_trapframe_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
ULONGEST pstate;
|
||||
char *name;
|
||||
|
||||
/* Check whether we are in privileged mode, and bail out if we're not. */
|
||||
pstate = frame_unwind_register_unsigned(next_frame, SPARC64_PSTATE_REGNUM);
|
||||
if ((pstate & SPARC64_PSTATE_PRIV) == 0)
|
||||
return NULL;
|
||||
|
||||
find_pc_partial_function (frame_pc_unwind (next_frame), &name, NULL, NULL);
|
||||
if (name && strcmp (name, "Lslowtrap_reenter") == 0)
|
||||
return &sparc64obsd_trapframe_unwind;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Threads support. */
|
||||
|
||||
@ -299,6 +379,7 @@ sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
tdep->step_trap = sparcnbsd_step_trap;
|
||||
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64obsd_sigtramp_frame_sniffer);
|
||||
frame_unwind_append_sniffer (gdbarch, sparc64obsd_trapframe_sniffer);
|
||||
|
||||
sparc64_init_abi (info, gdbarch);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user