* ppcnbsd-tdep.h: Update copyright year. Include <stddef.h>

(ppcnbsd_supply_reg, ppcnbsd_fill_reg, ppcnbsd_supply_fpreg)
(ppcnbsd_fill_fpreg): Remove prototypes.
(struct regset): Add forward declaration.
(ppcnbsd_gregset, ppcnbsd_fpregset): Extern declarations.
* ppcnbsd-tdep.c: Update copyright year.  Include "gdbtypes.h",
"regset.h" and "gdb_string.h".  Don't include "breakpoint.h",
"value.h", target.h and nbsd-tdep.h".  Reorder includes.
(REG_FIXREG_OFFSET, REG_LR_OFFSET, REG_CR_OFFSET, REG_XER_OFFSET)
(REG_CTR_OFFSET, REG_PC_OFFSET, SIZEOF_STRUCT_REG)
(FPREG_FPR_OFFSET, FPREG_FPSCR_OFFSET, SIZEOF_STRUCT_FPREG):
Remove macros.
(ppcnbsd_supply_reg, ppcnbsd_fill_reg, ppcnbsd_supply_fpreg)
(ppcnbsd_fill_fpreg): Remove functions.
(fetch_core_registers, fetch_elfcore_registers): Remove functions.
(ppcnbsd_core_fns, ppcnbsd_elfcore_fns): Remove variables.
(ppcnbsd_reg_offsets): New variable.
(ppcnbsd_gregset, ppcnbsd_fpregset): New variables.
(ppcnbsd_sigtramp_cache_init): Deal with new signal trampoline
introduced in NetBSD 2.0.
(ppcnbsd_sigtramp): Provide complete signal trampoline.
(ppcnbsd2_sigtramp): New variable.
(ppcnbsd_init_abi): Set svr4_fetch_link_map_offsets to
svr4_ilp32_fetch_link_map_offsets.  Set regset_from_core_section.
Add ppcnbs2_sigtramp unwinder.
(_initialize_ppcnbsd_tdep): Don't use deprecated_add_core_fns.
Initialize ppcnbsd_reg_offsets.
* ppcnbsd-nat.c: Update copyright year.  Reorder includes.
(getregs_supplies): Use regnum instead of regno.
(getfpregs_supplies): Likewise.
(ppcnbsd_fetch_inferior_registers): Likewise.  Call
ppc_supply_gregset and ppc_suppply_fpregset instead of
ppcnbsd_supply_reg and ppcnbsd_supply_fpreg
(ppcnbsd_store_inferior_registers): Likewise.  Call
ppc_collect_gregset and ppc_collect_fpregset instead of
ppcnbsd_fill_reg and ppcnbsd_fill_fpreg.
(ppcnbsd_supply_pcb): Use `gdb_byte *' instead of `char *'.
(_initialize_ppcnbsd_nat): Add some whitespace.
* Makefile.in (ppcnbsd-nat.o, ppcnbsd-tdep.o): Update dependencies.
* config/powerpc/nbsd.mh (NATDEPFILES): Remove infptrace.o.
(NAT_FILE): Remove.
* config/powerpc/nbsd.mt (TDEPFILES): Remove nbsd-tdep.o.
This commit is contained in:
Mark Kettenis 2006-05-12 20:53:15 +00:00
parent f6b66e9075
commit def18405fb
7 changed files with 243 additions and 299 deletions

View File

@ -1,3 +1,48 @@
2006-05-12 Mark Kettenis <kettenis@gnu.org>
* ppcnbsd-tdep.h: Update copyright year. Include <stddef.h>
(ppcnbsd_supply_reg, ppcnbsd_fill_reg, ppcnbsd_supply_fpreg)
(ppcnbsd_fill_fpreg): Remove prototypes.
(struct regset): Add forward declaration.
(ppcnbsd_gregset, ppcnbsd_fpregset): Extern declarations.
* ppcnbsd-tdep.c: Update copyright year. Include "gdbtypes.h",
"regset.h" and "gdb_string.h". Don't include "breakpoint.h",
"value.h", target.h and nbsd-tdep.h". Reorder includes.
(REG_FIXREG_OFFSET, REG_LR_OFFSET, REG_CR_OFFSET, REG_XER_OFFSET)
(REG_CTR_OFFSET, REG_PC_OFFSET, SIZEOF_STRUCT_REG)
(FPREG_FPR_OFFSET, FPREG_FPSCR_OFFSET, SIZEOF_STRUCT_FPREG):
Remove macros.
(ppcnbsd_supply_reg, ppcnbsd_fill_reg, ppcnbsd_supply_fpreg)
(ppcnbsd_fill_fpreg): Remove functions.
(fetch_core_registers, fetch_elfcore_registers): Remove functions.
(ppcnbsd_core_fns, ppcnbsd_elfcore_fns): Remove variables.
(ppcnbsd_reg_offsets): New variable.
(ppcnbsd_gregset, ppcnbsd_fpregset): New variables.
(ppcnbsd_sigtramp_cache_init): Deal with new signal trampoline
introduced in NetBSD 2.0.
(ppcnbsd_sigtramp): Provide complete signal trampoline.
(ppcnbsd2_sigtramp): New variable.
(ppcnbsd_init_abi): Set svr4_fetch_link_map_offsets to
svr4_ilp32_fetch_link_map_offsets. Set regset_from_core_section.
Add ppcnbs2_sigtramp unwinder.
(_initialize_ppcnbsd_tdep): Don't use deprecated_add_core_fns.
Initialize ppcnbsd_reg_offsets.
* ppcnbsd-nat.c: Update copyright year. Reorder includes.
(getregs_supplies): Use regnum instead of regno.
(getfpregs_supplies): Likewise.
(ppcnbsd_fetch_inferior_registers): Likewise. Call
ppc_supply_gregset and ppc_suppply_fpregset instead of
ppcnbsd_supply_reg and ppcnbsd_supply_fpreg
(ppcnbsd_store_inferior_registers): Likewise. Call
ppc_collect_gregset and ppc_collect_fpregset instead of
ppcnbsd_fill_reg and ppcnbsd_fill_fpreg.
(ppcnbsd_supply_pcb): Use `gdb_byte *' instead of `char *'.
(_initialize_ppcnbsd_nat): Add some whitespace.
* Makefile.in (ppcnbsd-nat.o, ppcnbsd-tdep.o): Update dependencies.
* config/powerpc/nbsd.mh (NATDEPFILES): Remove infptrace.o.
(NAT_FILE): Remove.
* config/powerpc/nbsd.mt (TDEPFILES): Remove nbsd-tdep.o.
2006-05-11 Alfred M. Szmidt <ams@gnu.org>
* gnu-nat.c (inf_validate_procs): Don't use lvalue in assignments.

View File

@ -2416,13 +2416,13 @@ ppc-linux-tdep.o: ppc-linux-tdep.c $(defs_h) $(frame_h) $(inferior_h) \
ppcnbsd-nat.o: ppcnbsd-nat.c $(defs_h) $(inferior_h) $(gdb_assert_h) \
$(gdbcore_h) $(regcache_h) $(bsd_kvm_h) $(ppc_tdep_h) \
$(ppcnbsd_tdep_h) $(inf_ptrace_h)
ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
$(target_h) $(breakpoint_h) $(value_h) $(osabi_h) $(ppc_tdep_h) \
$(ppcnbsd_tdep_h) $(nbsd_tdep_h) $(tramp_frame_h) $(trad_frame_h) \
$(gdb_assert_h) $(solib_svr4_h)
ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(gdb_types_h) \
$(osabi_h) $(regcache_h) $(regset_h) $(trad_frame_h) \
$(tramp_frame_h) $(gdb_assert_h) $(gdb_string_h) \
$(ppc_tdep_h) $(ppcnbsd_tdep_h) $(solib_svr4_h)
ppcobsd-nat.o: ppcobsd-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) \
$(regcache_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) $(inf_ptrace_h) \
$(bsd_kvm_h)
$(regcache_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) $(bsd_kvm_h) \
$(inf_ptrace_h)
ppcobsd-tdep.o: ppcobsd-tdep.c $(defs_h) $(arch_utils_h) $(floatformat_h) \
$(frame_h) $(frame_unwind_h) $(osabi_h) $(regcache_h) $(regset_h) \
$(symtab_h) $(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) \

View File

@ -1,5 +1,4 @@
# Host: PowerPC, running NetBSD
NATDEPFILES= fork-child.o inf-ptrace.o infptrace.o ppcnbsd-nat.o bsd-kvm.o
NAT_FILE= config/nm-nbsd.h
# Host: NetBSD/powerpc
NATDEPFILES= fork-child.o inf-ptrace.o ppcnbsd-nat.o bsd-kvm.o
LOADLIBES= -lkvm

View File

@ -1,6 +1,6 @@
# Target: PowerPC, running NetBSD
TDEPFILES= rs6000-tdep.o ppc-sysv-tdep.o ppcnbsd-tdep.o nbsd-tdep.o corelow.o \
solib.o solib-svr4.o
# Target: NetBSD/powerpc
TDEPFILES= rs6000-tdep.o ppc-sysv-tdep.o ppcnbsd-tdep.o \
corelow.o solib.o solib-svr4.o
DEPRECATED_TM_FILE= tm-ppc-eabi.h
SIM_OBS = remote-sim.o

View File

@ -1,5 +1,7 @@
/* Native-dependent code for PowerPC's running NetBSD, for GDB.
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
/* Native-dependent code for NetBSD/powerpc.
Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Wasabi Systems, Inc.
This file is part of GDB.
@ -26,35 +28,37 @@
#include <machine/pcb.h>
#include "defs.h"
#include "inferior.h"
#include "gdb_assert.h"
#include "gdbcore.h"
#include "inferior.h"
#include "regcache.h"
#include "bsd-kvm.h"
#include "gdb_assert.h"
#include "ppc-tdep.h"
#include "ppcnbsd-tdep.h"
#include "bsd-kvm.h"
#include "inf-ptrace.h"
/* Returns true if PT_GETREGS fetches this register. */
static int
getregs_supplies (int regno)
getregs_supplies (int regnum)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
return ((regno >= tdep->ppc_gp0_regnum
&& regno < tdep->ppc_gp0_regnum + ppc_num_gprs)
|| regno == tdep->ppc_lr_regnum
|| regno == tdep->ppc_cr_regnum
|| regno == tdep->ppc_xer_regnum
|| regno == tdep->ppc_ctr_regnum
|| regno == PC_REGNUM);
return ((regnum >= tdep->ppc_gp0_regnum
&& regnum < tdep->ppc_gp0_regnum + ppc_num_gprs)
|| regnum == tdep->ppc_lr_regnum
|| regnum == tdep->ppc_cr_regnum
|| regnum == tdep->ppc_xer_regnum
|| regnum == tdep->ppc_ctr_regnum
|| regnum == PC_REGNUM);
}
/* Like above, but for PT_GETFPREGS. */
static int
getfpregs_supplies (int regno)
getfpregs_supplies (int regnum)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
@ -70,15 +74,15 @@ getfpregs_supplies (int regno)
combination to the problem. */
gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
return ((regno >= tdep->ppc_fp0_regnum
&& regno < tdep->ppc_fp0_regnum + ppc_num_fprs)
|| regno == tdep->ppc_fpscr_regnum);
return ((regnum >= tdep->ppc_fp0_regnum
&& regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
|| regnum == tdep->ppc_fpscr_regnum);
}
static void
ppcnbsd_fetch_inferior_registers (int regno)
ppcnbsd_fetch_inferior_registers (int regnum)
{
if (regno == -1 || getregs_supplies (regno))
if (regnum == -1 || getregs_supplies (regnum))
{
struct reg regs;
@ -86,12 +90,11 @@ ppcnbsd_fetch_inferior_registers (int regno)
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
ppcnbsd_supply_reg ((char *) &regs, regno);
if (regno != -1)
return;
ppc_supply_gregset (&ppcnbsd_gregset, current_regcache,
regnum, &regs, sizeof regs);
}
if (regno == -1 || getfpregs_supplies (regno))
if (regnum == -1 || getfpregs_supplies (regnum))
{
struct fpreg fpregs;
@ -99,16 +102,15 @@ ppcnbsd_fetch_inferior_registers (int regno)
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get FP registers"));
ppcnbsd_supply_fpreg ((char *) &fpregs, regno);
if (regno != -1)
return;
ppc_supply_fpregset (&ppcnbsd_fpregset, current_regcache,
regnum, &fpregs, sizeof fpregs);
}
}
static void
ppcnbsd_store_inferior_registers (int regno)
ppcnbsd_store_inferior_registers (int regnum)
{
if (regno == -1 || getregs_supplies (regno))
if (regnum == -1 || getregs_supplies (regnum))
{
struct reg regs;
@ -116,17 +118,15 @@ ppcnbsd_store_inferior_registers (int regno)
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't get registers"));
ppcnbsd_fill_reg ((char *) &regs, regno);
ppc_collect_gregset (&ppcnbsd_gregset, current_regcache,
regnum, &regs, sizeof regs);
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &regs, 0) == -1)
perror_with_name (_("Couldn't write registers"));
if (regno != -1)
return;
}
if (regno == -1 || getfpregs_supplies (regno))
if (regnum == -1 || getfpregs_supplies (regnum))
{
struct fpreg fpregs;
@ -134,8 +134,9 @@ ppcnbsd_store_inferior_registers (int regno)
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't get FP registers"));
ppcnbsd_fill_fpreg ((char *) &fpregs, regno);
ppc_collect_fpregset (&ppcnbsd_fpregset, current_regcache,
regnum, &fpregs, sizeof fpregs);
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
perror_with_name (_("Couldn't set FP registers"));
@ -154,19 +155,19 @@ ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
if (pcb->pcb_sp == 0)
return 0;
read_memory (pcb->pcb_sp, (char *) &sf, sizeof sf);
read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf);
regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr);
regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2);
for (i = 0 ; i < 19 ; i++)
regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 13 + i,
&sf.fixreg[i]);
read_memory(sf.sp, (char *)&cf, sizeof(cf));
read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf));
regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.r30);
regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.r31);
regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 1, &cf.sp);
read_memory(cf.sp, (char *)&cf, sizeof(cf));
read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf));
regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &cf.lr);
regcache_raw_supply (regcache, PC_REGNUM, &cf.lr);
@ -180,8 +181,10 @@ void
_initialize_ppcnbsd_nat (void)
{
struct target_ops *t;
/* Support debugging kernel virtual memory images. */
bsd_kvm_add_target (ppcnbsd_supply_pcb);
/* Add in local overrides. */
t = inf_ptrace_target ();
t->to_fetch_registers = ppcnbsd_fetch_inferior_registers;

View File

@ -1,6 +1,6 @@
/* Target-dependent code for PowerPC systems running NetBSD.
/* Target-dependent code for NetBSD/powerpc.
Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Wasabi Systems, Inc.
@ -22,225 +22,58 @@
Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "gdbcore.h"
#include "regcache.h"
#include "target.h"
#include "breakpoint.h"
#include "value.h"
#include "gdbtypes.h"
#include "osabi.h"
#include "regcache.h"
#include "regset.h"
#include "trad-frame.h"
#include "tramp-frame.h"
#include "gdb_assert.h"
#include "gdb_string.h"
#include "ppc-tdep.h"
#include "ppcnbsd-tdep.h"
#include "nbsd-tdep.h"
#include "tramp-frame.h"
#include "trad-frame.h"
#include "gdb_assert.h"
#include "solib-svr4.h"
#define REG_FIXREG_OFFSET(x) ((x) * 4)
#define REG_LR_OFFSET (32 * 4)
#define REG_CR_OFFSET (33 * 4)
#define REG_XER_OFFSET (34 * 4)
#define REG_CTR_OFFSET (35 * 4)
#define REG_PC_OFFSET (36 * 4)
#define SIZEOF_STRUCT_REG (37 * 4)
/* Register offsets from <machine/reg.h>. */
struct ppc_reg_offsets ppcnbsd_reg_offsets;
#define FPREG_FPR_OFFSET(x) ((x) * 8)
#define FPREG_FPSCR_OFFSET (32 * 8)
#define SIZEOF_STRUCT_FPREG (33 * 8)
/* Core file support. */
void
ppcnbsd_supply_reg (char *regs, int regno)
/* NetBSD/powerpc register set. */
struct regset ppcnbsd_gregset =
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
int i;
for (i = 0; i < ppc_num_gprs; i++)
{
if (regno == tdep->ppc_gp0_regnum + i || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_gp0_regnum + i,
regs + REG_FIXREG_OFFSET (i));
}
if (regno == tdep->ppc_lr_regnum || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_lr_regnum,
regs + REG_LR_OFFSET);
if (regno == tdep->ppc_cr_regnum || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_cr_regnum,
regs + REG_CR_OFFSET);
if (regno == tdep->ppc_xer_regnum || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_xer_regnum,
regs + REG_XER_OFFSET);
if (regno == tdep->ppc_ctr_regnum || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_ctr_regnum,
regs + REG_CTR_OFFSET);
if (regno == PC_REGNUM || regno == -1)
regcache_raw_supply (current_regcache, PC_REGNUM,
regs + REG_PC_OFFSET);
}
void
ppcnbsd_fill_reg (char *regs, int regno)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
int i;
for (i = 0; i < ppc_num_gprs; i++)
{
if (regno == tdep->ppc_gp0_regnum + i || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_gp0_regnum + i,
regs + REG_FIXREG_OFFSET (i));
}
if (regno == tdep->ppc_lr_regnum || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_lr_regnum,
regs + REG_LR_OFFSET);
if (regno == tdep->ppc_cr_regnum || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_cr_regnum,
regs + REG_CR_OFFSET);
if (regno == tdep->ppc_xer_regnum || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_xer_regnum,
regs + REG_XER_OFFSET);
if (regno == tdep->ppc_ctr_regnum || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_ctr_regnum,
regs + REG_CTR_OFFSET);
if (regno == PC_REGNUM || regno == -1)
regcache_raw_collect (current_regcache, PC_REGNUM, regs + REG_PC_OFFSET);
}
void
ppcnbsd_supply_fpreg (char *fpregs, int regno)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
int i;
/* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
point registers. Traditionally, GDB's register set has still
listed the floating point registers for such machines, so this
code is harmless. However, the new E500 port actually omits the
floating point registers entirely from the register set --- they
don't even have register numbers assigned to them.
It's not clear to me how best to update this code, so this assert
will alert the first person to encounter the NetBSD/E500
combination to the problem. */
gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
for (i = 0; i < ppc_num_fprs; i++)
{
if (regno == tdep->ppc_fp0_regnum + i || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_fp0_regnum + i,
fpregs + FPREG_FPR_OFFSET (i));
}
if (regno == tdep->ppc_fpscr_regnum || regno == -1)
regcache_raw_supply (current_regcache, tdep->ppc_fpscr_regnum,
fpregs + FPREG_FPSCR_OFFSET);
}
void
ppcnbsd_fill_fpreg (char *fpregs, int regno)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
int i;
/* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
point registers. Traditionally, GDB's register set has still
listed the floating point registers for such machines, so this
code is harmless. However, the new E500 port actually omits the
floating point registers entirely from the register set --- they
don't even have register numbers assigned to them.
It's not clear to me how best to update this code, so this assert
will alert the first person to encounter the NetBSD/E500
combination to the problem. */
gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
for (i = 0; i < ppc_num_fprs; i++)
{
if (regno == tdep->ppc_fp0_regnum + i || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_fp0_regnum + i,
fpregs + FPREG_FPR_OFFSET (i));
}
if (regno == tdep->ppc_fpscr_regnum || regno == -1)
regcache_raw_collect (current_regcache, tdep->ppc_fpscr_regnum,
fpregs + FPREG_FPSCR_OFFSET);
}
static void
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
CORE_ADDR ignore)
{
char *regs, *fpregs;
/* We get everything from one section. */
if (which != 0)
return;
regs = core_reg_sect;
fpregs = core_reg_sect + SIZEOF_STRUCT_REG;
/* Integer registers. */
ppcnbsd_supply_reg (regs, -1);
/* Floating point registers. */
ppcnbsd_supply_fpreg (fpregs, -1);
}
static void
fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which,
CORE_ADDR ignore)
{
switch (which)
{
case 0: /* Integer registers. */
if (core_reg_size != SIZEOF_STRUCT_REG)
warning (_("Wrong size register set in core file."));
else
ppcnbsd_supply_reg (core_reg_sect, -1);
break;
case 2: /* Floating point registers. */
if (core_reg_size != SIZEOF_STRUCT_FPREG)
warning (_("Wrong size FP register set in core file."));
else
ppcnbsd_supply_fpreg (core_reg_sect, -1);
break;
default:
/* Don't know what kind of register request this is; just ignore it. */
break;
}
}
static struct core_fns ppcnbsd_core_fns =
{
bfd_target_unknown_flavour, /* core_flavour */
default_check_format, /* check_format */
default_core_sniffer, /* core_sniffer */
fetch_core_registers, /* core_read_registers */
NULL /* next */
&ppcnbsd_reg_offsets,
ppc_supply_gregset
};
static struct core_fns ppcnbsd_elfcore_fns =
struct regset ppcnbsd_fpregset =
{
bfd_target_elf_flavour, /* core_flavour */
default_check_format, /* check_format */
default_core_sniffer, /* core_sniffer */
fetch_elfcore_registers, /* core_read_registers */
NULL /* next */
&ppcnbsd_reg_offsets,
ppc_supply_fpregset
};
/* NetBSD is confused. It appears that 1.5 was using the correct SVr4
/* Return the appropriate register set for the core section identified
by SECT_NAME and SECT_SIZE. */
static const struct regset *
ppcnbsd_regset_from_core_section (struct gdbarch *gdbarch,
const char *sect_name, size_t sect_size)
{
if (strcmp (sect_name, ".reg") == 0 && sect_size >= 148)
return &ppcnbsd_gregset;
if (strcmp (sect_name, ".reg2") == 0 && sect_size >= 264)
return &ppcnbsd_fpregset;
return NULL;
}
/* NetBSD is confused. It appears that 1.5 was using the correct SVR4
convention but, 1.6 switched to the below broken convention. For
the moment use the broken convention. Ulgh!. */
@ -249,6 +82,7 @@ ppcnbsd_return_value (struct gdbarch *gdbarch, struct type *valtype,
struct regcache *regcache, gdb_byte *readbuf,
const gdb_byte *writebuf)
{
#if 0
if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
|| TYPE_CODE (valtype) == TYPE_CODE_UNION)
&& !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
@ -259,9 +93,15 @@ ppcnbsd_return_value (struct gdbarch *gdbarch, struct type *valtype,
|| TYPE_LENGTH (valtype) == 8))
return RETURN_VALUE_STRUCT_CONVENTION;
else
#endif
return ppc_sysv_abi_broken_return_value (gdbarch, valtype, regcache,
readbuf, writebuf);
}
/* Signal trampolines. */
static const struct tramp_frame ppcnbsd2_sigtramp;
static void
ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
@ -269,54 +109,73 @@ ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
struct trad_frame_cache *this_cache,
CORE_ADDR func)
{
CORE_ADDR base;
CORE_ADDR offset;
int i;
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
CORE_ADDR addr, base;
int i;
base = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
offset = base + 0x18 + 2 * tdep->wordsize;
for (i = 0; i < ppc_num_gprs; i++)
if (self == &ppcnbsd2_sigtramp)
addr = base + 0x10 + 2 * tdep->wordsize;
else
addr = base + 0x18 + 2 * tdep->wordsize;
for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize)
{
int regnum = i + tdep->ppc_gp0_regnum;
trad_frame_set_reg_addr (this_cache, regnum, offset);
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, regnum, addr);
}
trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, offset);
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, offset);
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, offset);
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, offset);
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, PC_REGNUM, offset); /* SRR0? */
offset += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, addr);
addr += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, addr);
addr += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, addr);
addr += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, addr);
addr += tdep->wordsize;
trad_frame_set_reg_addr (this_cache, PC_REGNUM, addr); /* SRR0? */
addr += tdep->wordsize;
/* Construct the frame ID using the function start. */
trad_frame_set_id (this_cache, frame_id_build (base, func));
}
/* Given the NEXT frame, examine the instructions at and around this
frame's resume address (aka PC) to see of they look like a signal
trampoline. Return the address of the trampolines first
instruction, or zero if it isn't a signal trampoline. */
static const struct tramp_frame ppcnbsd_sigtramp = {
static const struct tramp_frame ppcnbsd_sigtramp =
{
SIGTRAMP_FRAME,
4, /* insn size */
{ /* insn */
{ 0x38610018, -1 }, /* addi r3,r1,24 */
{ 0x38000127, -1 }, /* li r0,295 */
{ 0x44000002, -1 }, /* sc */
{ 0x38000001, -1 }, /* li r0,1 */
{ 0x44000002, -1 }, /* sc */
4,
{
{ 0x3821fff0, -1 }, /* add r1,r1,-16 */
{ 0x4e800021, -1 }, /* blrl */
{ 0x38610018, -1 }, /* addi r3,r1,24 */
{ 0x38000127, -1 }, /* li r0,295 */
{ 0x44000002, -1 }, /* sc */
{ 0x38000001, -1 }, /* li r0,1 */
{ 0x44000002, -1 }, /* sc */
{ TRAMP_SENTINEL_INSN, -1 }
},
ppcnbsd_sigtramp_cache_init
};
/* NetBSD 2.0 introduced a slightly different signal trampoline. */
static const struct tramp_frame ppcnbsd2_sigtramp =
{
SIGTRAMP_FRAME,
4,
{
{ 0x3821fff0, -1 }, /* add r1,r1,-16 */
{ 0x4e800021, -1 }, /* blrl */
{ 0x38610010, -1 }, /* addi r3,r1,16 */
{ 0x38000127, -1 }, /* li r0,295 */
{ 0x44000002, -1 }, /* sc */
{ 0x38000001, -1 }, /* li r0,1 */
{ 0x44000002, -1 }, /* sc */
{ TRAMP_SENTINEL_INSN, -1 }
},
ppcnbsd_sigtramp_cache_init
};
static void
ppcnbsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
@ -324,10 +183,21 @@ ppcnbsd_init_abi (struct gdbarch_info info,
/* For NetBSD, this is an on again, off again thing. Some systems
do use the broken struct convention, and some don't. */
set_gdbarch_return_value (gdbarch, ppcnbsd_return_value);
set_solib_svr4_fetch_link_map_offsets (gdbarch,
nbsd_ilp32_solib_svr4_fetch_link_map_offsets);
/* NetBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
set_gdbarch_regset_from_core_section
(gdbarch, ppcnbsd_regset_from_core_section);
tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd_sigtramp);
tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd2_sigtramp);
}
/* Provide a prototype to silence -Wmissing-prototypes. */
void _initialize_ppcnbsd_tdep (void);
void
_initialize_ppcnbsd_tdep (void)
@ -335,6 +205,27 @@ _initialize_ppcnbsd_tdep (void)
gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_NETBSD_ELF,
ppcnbsd_init_abi);
deprecated_add_core_fns (&ppcnbsd_core_fns);
deprecated_add_core_fns (&ppcnbsd_elfcore_fns);
/* Avoid initializing the register offsets again if they were
already initailized by ppcnbsd-nat.c. */
if (ppcnbsd_reg_offsets.pc_offset == 0)
{
/* General-purpose registers. */
ppcnbsd_reg_offsets.r0_offset = 0;
ppcnbsd_reg_offsets.lr_offset = 128;
ppcnbsd_reg_offsets.cr_offset = 132;
ppcnbsd_reg_offsets.xer_offset = 136;
ppcnbsd_reg_offsets.ctr_offset = 140;
ppcnbsd_reg_offsets.pc_offset = 144;
ppcnbsd_reg_offsets.ps_offset = -1;
ppcnbsd_reg_offsets.mq_offset = -1;
/* Floating-point registers. */
ppcnbsd_reg_offsets.f0_offset = 0;
ppcnbsd_reg_offsets.fpscr_offset = 256;
/* AltiVec registers. */
ppcnbsd_reg_offsets.vr0_offset = 0;
ppcnbsd_reg_offsets.vrsave_offset = 512;
ppcnbsd_reg_offsets.vscr_offset = 524;
}
}

View File

@ -1,5 +1,6 @@
/* Common target dependent code for GDB on PowerPC systems running NetBSD.
Copyright (C) 2002 Free Software Foundation, Inc.
/* Target-dependent code for NetBSD/powerpc.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GDB.
@ -21,10 +22,15 @@
#ifndef PPCNBSD_TDEP_H
#define PPCNBSD_TDEP_H
void ppcnbsd_supply_reg (char *, int);
void ppcnbsd_fill_reg (char *, int);
#include <stddef.h>
void ppcnbsd_supply_fpreg (char *, int);
void ppcnbsd_fill_fpreg (char *, int);
struct regset;
#endif /* PPCNBSD_TDEP_H */
/* Register offsets for NetBSD/powerpc. */
extern struct ppc_reg_offsets ppcnbsd_reg_offsets;
/* Register sets for NetBSD/powerpc. */
extern struct regset ppcnbsd_gregset;
extern struct regset ppcnbsd_fpregset;
#endif /* ppcnbsd-tdep.h */