gdb/ppcfbsd-nat.c - gdb
Functions defined
Source code
- #include "defs.h"
- #include "gdbcore.h"
- #include "inferior.h"
- #include "regcache.h"
- #include <sys/types.h>
- #include <sys/procfs.h>
- #include <sys/ptrace.h>
- #include <sys/signal.h>
- #include <machine/frame.h>
- #include <machine/pcb.h>
- #include <machine/reg.h>
- #include "fbsd-nat.h"
- #include "gregset.h"
- #include "ppc-tdep.h"
- #include "ppcfbsd-tdep.h"
- #include "inf-ptrace.h"
- #include "bsd-kvm.h"
- void
- supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
- {
- const struct regset *regset = ppc_fbsd_gregset (sizeof (long));
- ppc_supply_gregset (regset, regcache, -1, gregsetp, sizeof (*gregsetp));
- }
- void
- fill_gregset (const struct regcache *regcache,
- gdb_gregset_t *gregsetp, int regno)
- {
- const struct regset *regset = ppc_fbsd_gregset (sizeof (long));
- if (regno == -1)
- memset (gregsetp, 0, sizeof (*gregsetp));
- ppc_collect_gregset (regset, regcache, regno, gregsetp, sizeof (*gregsetp));
- }
- void
- supply_fpregset (struct regcache *regcache, const gdb_fpregset_t * fpregsetp)
- {
- const struct regset *regset = ppc_fbsd_fpregset ();
- ppc_supply_fpregset (regset, regcache, -1,
- fpregsetp, sizeof (*fpregsetp));
- }
- void
- fill_fpregset (const struct regcache *regcache,
- gdb_fpregset_t *fpregsetp, int regno)
- {
- const struct regset *regset = ppc_fbsd_fpregset ();
- ppc_collect_fpregset (regset, regcache, regno,
- fpregsetp, sizeof (*fpregsetp));
- }
- static int
- getfpregs_supplies (struct gdbarch *gdbarch, int regno)
- {
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- FIXME
- gdb_assert (ppc_floating_point_unit_p (gdbarch));
- return ((regno >= tdep->ppc_fp0_regnum
- && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)
- || regno == tdep->ppc_fpscr_regnum);
- }
- static void
- ppcfbsd_fetch_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
- {
- gdb_gregset_t regs;
- if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) ®s, 0) == -1)
- perror_with_name (_("Couldn't get registers"));
- supply_gregset (regcache, ®s);
- if (regno == -1 || getfpregs_supplies (get_regcache_arch (regcache), regno))
- {
- const struct regset *fpregset = ppc_fbsd_fpregset ();
- gdb_fpregset_t fpregs;
- if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
- perror_with_name (_("Couldn't get FP registers"));
- ppc_supply_fpregset (fpregset, regcache, regno, &fpregs, sizeof fpregs);
- }
- }
- static void
- ppcfbsd_store_inferior_registers (struct target_ops *ops,
- struct regcache *regcache, int regno)
- {
- gdb_gregset_t regs;
- if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) ®s, 0) == -1)
- perror_with_name (_("Couldn't get registers"));
- fill_gregset (regcache, ®s, regno);
- if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) ®s, 0) == -1)
- perror_with_name (_("Couldn't write registers"));
- if (regno == -1 || getfpregs_supplies (get_regcache_arch (regcache), regno))
- {
- gdb_fpregset_t fpregs;
- if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
- perror_with_name (_("Couldn't get FP registers"));
- fill_fpregset (regcache, &fpregs, regno);
- if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid),
- (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
- perror_with_name (_("Couldn't set FP registers"));
- }
- }
- static int
- ppcfbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
- {
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- int i, regnum;
-
- if (pcb->pcb_sp == 0)
- return 0;
- regcache_raw_supply (regcache, gdbarch_sp_regnum (gdbarch), &pcb->pcb_sp);
- regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &pcb->pcb_cr);
- regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &pcb->pcb_lr);
- for (i = 0, regnum = tdep->ppc_gp0_regnum + 14; i < 20; i++, regnum++)
- regcache_raw_supply (regcache, regnum, &pcb->pcb_context[i]);
- return 1;
- }
- void _initialize_ppcfbsd_nat (void);
- void
- _initialize_ppcfbsd_nat (void)
- {
- struct target_ops *t;
-
- t = inf_ptrace_target ();
- t->to_fetch_registers = ppcfbsd_fetch_inferior_registers;
- t->to_store_registers = ppcfbsd_store_inferior_registers;
- t->to_pid_to_exec_file = fbsd_pid_to_exec_file;
- t->to_find_memory_regions = fbsd_find_memory_regions;
- add_target (t);
-
- bsd_kvm_add_target (ppcfbsd_supply_pcb);
- }