2008-01-19 23:03:50 +08:00
|
|
|
|
/* Native-dependent code for NetBSD/hppa.
|
|
|
|
|
|
2011-01-01 23:34:07 +08:00
|
|
|
|
Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
2008-01-19 23:03:50 +08:00
|
|
|
|
|
|
|
|
|
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
|
2009-03-18 16:51:11 +08:00
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
2008-01-19 23:03:50 +08:00
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2009-03-18 16:51:11 +08:00
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2008-01-19 23:03:50 +08:00
|
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
|
#include "inferior.h"
|
|
|
|
|
#include "regcache.h"
|
|
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/ptrace.h>
|
|
|
|
|
#include <machine/reg.h>
|
|
|
|
|
|
|
|
|
|
#include "hppa-tdep.h"
|
|
|
|
|
#include "inf-ptrace.h"
|
|
|
|
|
|
|
|
|
|
#include "nbsd-nat.h"
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
hppanbsd_gregset_supplies_p (int regnum)
|
|
|
|
|
{
|
|
|
|
|
return ((regnum >= HPPA_R0_REGNUM && regnum <= HPPA_R31_REGNUM) ||
|
|
|
|
|
(regnum >= HPPA_SAR_REGNUM && regnum <= HPPA_PCSQ_TAIL_REGNUM) ||
|
|
|
|
|
regnum == HPPA_IPSW_REGNUM ||
|
|
|
|
|
(regnum >= HPPA_SR4_REGNUM && regnum <= HPPA_SR4_REGNUM + 5));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
hppanbsd_fpregset_supplies_p (int regnum)
|
|
|
|
|
{
|
|
|
|
|
return (regnum >= HPPA_FP0_REGNUM && regnum <= HPPA_FP31R_REGNUM);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hppanbsd_supply_gregset (struct regcache *regcache, const void *gregs)
|
|
|
|
|
{
|
|
|
|
|
const char *regs = gregs;
|
|
|
|
|
const int *r = gregs;
|
|
|
|
|
int regnum;
|
|
|
|
|
|
|
|
|
|
for (regnum = HPPA_R1_REGNUM; regnum <= HPPA_R31_REGNUM; regnum++)
|
|
|
|
|
regcache_raw_supply (regcache, regnum, regs + regnum * 4);
|
|
|
|
|
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs + 32 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_PCSQ_HEAD_REGNUM, regs + 33 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_PCSQ_TAIL_REGNUM, regs + 34 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 35 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 36 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_IPSW_REGNUM, regs);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SR4_REGNUM, regs + 41 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SR4_REGNUM + 1, regs + 37 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SR4_REGNUM + 2, regs + 38 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SR4_REGNUM + 3, regs + 39 * 4);
|
|
|
|
|
regcache_raw_supply (regcache, HPPA_SR4_REGNUM + 4, regs + 40 * 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Supply the floating-point registers stored in FPREGS to REGCACHE. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hppanbsd_supply_fpregset (struct regcache *regcache, const void *fpregs)
|
|
|
|
|
{
|
|
|
|
|
const char *regs = fpregs;
|
|
|
|
|
int regnum;
|
|
|
|
|
|
|
|
|
|
for (regnum = HPPA_FP0_REGNUM; regnum <= HPPA_FP31R_REGNUM;
|
|
|
|
|
regnum += 2, regs += 8)
|
|
|
|
|
{
|
|
|
|
|
regcache_raw_supply (regcache, regnum, regs);
|
|
|
|
|
regcache_raw_supply (regcache, regnum + 1, regs + 4);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Collect the general-purpose registers from REGCACHE and store them
|
|
|
|
|
in GREGS. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hppanbsd_collect_gregset (const struct regcache *regcache,
|
|
|
|
|
void *gregs, int regnum)
|
|
|
|
|
{
|
|
|
|
|
char *regs = gregs;
|
|
|
|
|
int *r = gregs;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = HPPA_R1_REGNUM; i <= HPPA_R31_REGNUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if (regnum == -1 || regnum == i)
|
|
|
|
|
regcache_raw_collect (regcache, i, regs + i * 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_IPSW_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_IPSW_REGNUM, regs);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 35 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 36 * 4);
|
|
|
|
|
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SAR_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SAR_REGNUM, regs + 32 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCSQ_HEAD_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCSQ_HEAD_REGNUM, regs + 33 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCSQ_TAIL_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCSQ_TAIL_REGNUM, regs + 34 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 35 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 36 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_IPSW_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_IPSW_REGNUM, regs);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SR4_REGNUM)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SR4_REGNUM, regs + 41 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SR4_REGNUM + 1)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SR4_REGNUM + 1, regs + 37 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SR4_REGNUM + 2)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SR4_REGNUM + 2, regs + 38 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SR4_REGNUM + 3)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SR4_REGNUM + 3, regs + 39 * 4);
|
|
|
|
|
if (regnum == -1 || regnum == HPPA_SR4_REGNUM + 4)
|
|
|
|
|
regcache_raw_collect (regcache, HPPA_SR4_REGNUM + 4, regs + 40 * 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Collect the floating-point registers from REGCACHE and store them
|
|
|
|
|
in FPREGS. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hppanbsd_collect_fpregset (struct regcache *regcache,
|
|
|
|
|
void *fpregs, int regnum)
|
|
|
|
|
{
|
|
|
|
|
char *regs = fpregs;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = HPPA_FP0_REGNUM; i <= HPPA_FP31R_REGNUM; i += 2, regs += 8)
|
|
|
|
|
{
|
|
|
|
|
if (regnum == -1 || regnum == i || regnum == i + 1)
|
|
|
|
|
{
|
|
|
|
|
regcache_raw_collect (regcache, i, regs);
|
|
|
|
|
regcache_raw_collect (regcache, i + 1, regs + 4);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
|
|
|
|
|
for all registers (including the floating-point registers). */
|
|
|
|
|
|
|
|
|
|
static void
|
* corelow.c (get_core_registers): Adjust.
(core_file_thread_alive): Rename to...
(core_thread_alive): ... this.
(core_pid_to_str): Try gdbarch_core_pid_to_str first.
(init_core_ops): Adjust.
(coreops_suppress_target): Delete.
(_initialize_corelow): Unconditionally add core_ops.
* procfs.c: Include "inf-child.h".
(procfs_ops): Delete.
(init_procfs_ops): Delete. Reimplement as...
(procfs_target): ... this, inheriting from inf-child.
(procfs_attach, procfs_detach, procfs_fetch_registers): Adjust.
(procfs_prepare_to_store): Delete.
(procfs_store_registers, procfs_resume): Adjust.
(procfs_open): Delete.
(procfs_suppress_run): Delete.
(procfs_can_run): Delete.
(procfs_mourn_inferior): Adjust.
(procfs_init_inferior): Add target_ops parameter. Adjust.
(procfs_create_inferior): Don't pass procfs_init_inferior to
fork_inferior. Instead call it after fork_inferior returns.
(procfs_find_new_threads): Adjust.
(_initialize_procfs): Adjust to use procfs_target instead of
init_procfs_ops.
* sol-thread.c (orig_core_ops, sol_core_ops): Delete.
(lwp_to_thread): Use target_thread_alive.
(sol_thread_open): Delete.
(sol_thread_attach): Delete.
(sol_thread_detach, sol_thread_resume, sol_thread_wait)
(sol_thread_fetch_registers, sol_thread_store_registers): Adjust
to use find_target_beneath.
(sol_thread_prepare_to_store, sol_thread_xfer_memory): Delete.
(sol_thread_xfer_partial): Adjust to use find_target_beneath.
(sol_thread_files_info, sol_thread_kill_inferior): Delete.
(check_for_thread_db): New.
(sol_thread_notice_signals, sol_thread_create_inferior): Delete.
(sol_thread_new_objfile): Call check_for_thread_db.
(sol_thread_mourn_inferior): Adjust to use find_target_beneath.
(sol_thread_can_run): Delete.
(sol_thread_alive): Adjust to use find_target_beneath.
(sol_thread_stop): Delete.
(rw_common): Use target_write_memory or target_read_memory.
(ps_lgetregs, ps_lgetfpregs): Use target_fetch_registers.
(ps_lsetregs, ps_lsetfpregs): Use target_store_registers.
(solaris_pid_to_str): Remove check for libthread_db initialization
failing.
(sol_find_new_threads): Remove check for libthread_db
initialization failing, or for an invalid inferior_ptid. Adjust
to use find_target_beneath.
(sol_core_open, sol_core_close, sol_core_detach,
sol_core_files_info, sol_find_memory_regions,
sol_make_note_section, ignore): Delete.
(init_sol_thread_ops): Make it a thread_stratum target. Remove
unneeded callback settings.
(init_sol_core_ops): Delete.
(_initialize_sol_thread): No longer call init_sol_core_ops, set
procfs_suppress_run, or hack with core_ops.
* target.h (struct target_ops): Add a target_ops * parameter to
to_resume, to_fetch_registers, to_store_registers, to_thread_alive
and to_find_new_threads.
(target_fetch_registers, target_store_registers)
(target_thread_alive, target_find_new_threads): Redeclare as
function.
* target.c (update_current_target): Do not inherit or de_fault
to_resume, to_fetch_registers, to_store_registers,
to_thread_alive, to_find_new_threads.
(target_resume): Adjust.
(target_thread_alive, target_find_new_threads): New.
(debug_to_resume, debug_to_fetch_registers): Delete.
(target_fetch_registers): New.
(debug_to_store_registers): Delete.
(target_store_registers): New.
(debug_to_thread_alive, debug_to_find_new_threads): Delete.
(setup_target_debug): Adjust.
* gdbcore.h (core_ops): Delete declaration.
* inf-ptrace.c, linux-nat.c, remote.c, amd64-linux-nat.c,
inf-child.c, linux-thread-db.c, bsd-uthread.c, inf-ttrace.c,
i386-sol2-tdep.c, darwin-nat.c, gnu-nat.c, go32-nat.c,
hpux-thread.c, i386-linux-nat.c, i386fbsd-nat.c, monitor.c,
nto-procfs.c, remote-m32r-sdi.c, remote-mips.c, windows-nat.c,
alphabsd-nat.c, amd64bsd-nat.c, arm-linux-nat.c, armnbsd-nat.c,
bsd-kvm.c, hppa-hpux-nat.c, hppa-linux-nat.c, hppabsd-nat.c,
hppanbsd-nat.c, i386-darwin-nat.c, i386bsd-nat.c,
ia64-linux-nat.c, m32r-linux-nat.c, m68kbsd-nat.c,
m68klinux-nat.c, m88kbsd-nat.c, mips-linux-nat.c,
mips64obsd-nat.c, mipsnbsd-nat.c, ppc-linux-nat.c, ppcnbsd-nat.c,
ppcobsd-nat.c, remote-sim.c, rs6000-nat.c, s390-nat.c,
shnbsd-nat.c, sparc-nat.c, sparc-nat.h, spu-linux-nat.c,
vaxbsd-nat.c, xtensa-linux-nat.c: Adjust to target_ops changes.
* gdbarch.sh (core_pid_to_str): New gdbarch callback.
* gdbarch.h, gdbarch.c: Regenerate.
* sol2-tdep.c: Include "inferior.h".
(sol2_core_pid_to_str): New.
* sol2-tdep.h (sol2_core_pid_to_str): Declare.
* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
2009-02-23 08:03:50 +08:00
|
|
|
|
hppanbsd_fetch_registers (struct target_ops *ops,
|
|
|
|
|
struct regcache *regcache, int regnum)
|
2008-01-19 23:03:50 +08:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum))
|
|
|
|
|
{
|
|
|
|
|
struct reg regs;
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) ®s, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't get registers"));
|
|
|
|
|
|
|
|
|
|
hppanbsd_supply_gregset (regcache, ®s);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (regnum == -1 || hppanbsd_fpregset_supplies_p (regnum))
|
|
|
|
|
{
|
|
|
|
|
struct fpreg fpregs;
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't get floating point status"));
|
|
|
|
|
|
|
|
|
|
hppanbsd_supply_fpregset (regcache, &fpregs);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Store register REGNUM back into the inferior. If REGNUM is -1, do
|
|
|
|
|
this for all registers (including the floating-point registers). */
|
|
|
|
|
|
|
|
|
|
static void
|
* corelow.c (get_core_registers): Adjust.
(core_file_thread_alive): Rename to...
(core_thread_alive): ... this.
(core_pid_to_str): Try gdbarch_core_pid_to_str first.
(init_core_ops): Adjust.
(coreops_suppress_target): Delete.
(_initialize_corelow): Unconditionally add core_ops.
* procfs.c: Include "inf-child.h".
(procfs_ops): Delete.
(init_procfs_ops): Delete. Reimplement as...
(procfs_target): ... this, inheriting from inf-child.
(procfs_attach, procfs_detach, procfs_fetch_registers): Adjust.
(procfs_prepare_to_store): Delete.
(procfs_store_registers, procfs_resume): Adjust.
(procfs_open): Delete.
(procfs_suppress_run): Delete.
(procfs_can_run): Delete.
(procfs_mourn_inferior): Adjust.
(procfs_init_inferior): Add target_ops parameter. Adjust.
(procfs_create_inferior): Don't pass procfs_init_inferior to
fork_inferior. Instead call it after fork_inferior returns.
(procfs_find_new_threads): Adjust.
(_initialize_procfs): Adjust to use procfs_target instead of
init_procfs_ops.
* sol-thread.c (orig_core_ops, sol_core_ops): Delete.
(lwp_to_thread): Use target_thread_alive.
(sol_thread_open): Delete.
(sol_thread_attach): Delete.
(sol_thread_detach, sol_thread_resume, sol_thread_wait)
(sol_thread_fetch_registers, sol_thread_store_registers): Adjust
to use find_target_beneath.
(sol_thread_prepare_to_store, sol_thread_xfer_memory): Delete.
(sol_thread_xfer_partial): Adjust to use find_target_beneath.
(sol_thread_files_info, sol_thread_kill_inferior): Delete.
(check_for_thread_db): New.
(sol_thread_notice_signals, sol_thread_create_inferior): Delete.
(sol_thread_new_objfile): Call check_for_thread_db.
(sol_thread_mourn_inferior): Adjust to use find_target_beneath.
(sol_thread_can_run): Delete.
(sol_thread_alive): Adjust to use find_target_beneath.
(sol_thread_stop): Delete.
(rw_common): Use target_write_memory or target_read_memory.
(ps_lgetregs, ps_lgetfpregs): Use target_fetch_registers.
(ps_lsetregs, ps_lsetfpregs): Use target_store_registers.
(solaris_pid_to_str): Remove check for libthread_db initialization
failing.
(sol_find_new_threads): Remove check for libthread_db
initialization failing, or for an invalid inferior_ptid. Adjust
to use find_target_beneath.
(sol_core_open, sol_core_close, sol_core_detach,
sol_core_files_info, sol_find_memory_regions,
sol_make_note_section, ignore): Delete.
(init_sol_thread_ops): Make it a thread_stratum target. Remove
unneeded callback settings.
(init_sol_core_ops): Delete.
(_initialize_sol_thread): No longer call init_sol_core_ops, set
procfs_suppress_run, or hack with core_ops.
* target.h (struct target_ops): Add a target_ops * parameter to
to_resume, to_fetch_registers, to_store_registers, to_thread_alive
and to_find_new_threads.
(target_fetch_registers, target_store_registers)
(target_thread_alive, target_find_new_threads): Redeclare as
function.
* target.c (update_current_target): Do not inherit or de_fault
to_resume, to_fetch_registers, to_store_registers,
to_thread_alive, to_find_new_threads.
(target_resume): Adjust.
(target_thread_alive, target_find_new_threads): New.
(debug_to_resume, debug_to_fetch_registers): Delete.
(target_fetch_registers): New.
(debug_to_store_registers): Delete.
(target_store_registers): New.
(debug_to_thread_alive, debug_to_find_new_threads): Delete.
(setup_target_debug): Adjust.
* gdbcore.h (core_ops): Delete declaration.
* inf-ptrace.c, linux-nat.c, remote.c, amd64-linux-nat.c,
inf-child.c, linux-thread-db.c, bsd-uthread.c, inf-ttrace.c,
i386-sol2-tdep.c, darwin-nat.c, gnu-nat.c, go32-nat.c,
hpux-thread.c, i386-linux-nat.c, i386fbsd-nat.c, monitor.c,
nto-procfs.c, remote-m32r-sdi.c, remote-mips.c, windows-nat.c,
alphabsd-nat.c, amd64bsd-nat.c, arm-linux-nat.c, armnbsd-nat.c,
bsd-kvm.c, hppa-hpux-nat.c, hppa-linux-nat.c, hppabsd-nat.c,
hppanbsd-nat.c, i386-darwin-nat.c, i386bsd-nat.c,
ia64-linux-nat.c, m32r-linux-nat.c, m68kbsd-nat.c,
m68klinux-nat.c, m88kbsd-nat.c, mips-linux-nat.c,
mips64obsd-nat.c, mipsnbsd-nat.c, ppc-linux-nat.c, ppcnbsd-nat.c,
ppcobsd-nat.c, remote-sim.c, rs6000-nat.c, s390-nat.c,
shnbsd-nat.c, sparc-nat.c, sparc-nat.h, spu-linux-nat.c,
vaxbsd-nat.c, xtensa-linux-nat.c: Adjust to target_ops changes.
* gdbarch.sh (core_pid_to_str): New gdbarch callback.
* gdbarch.h, gdbarch.c: Regenerate.
* sol2-tdep.c: Include "inferior.h".
(sol2_core_pid_to_str): New.
* sol2-tdep.h (sol2_core_pid_to_str): Declare.
* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
2009-02-23 08:03:50 +08:00
|
|
|
|
hppanbsd_store_registers (struct target_ops *ops,
|
|
|
|
|
struct regcache *regcache, int regnum)
|
2008-01-19 23:03:50 +08:00
|
|
|
|
{
|
|
|
|
|
if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum))
|
|
|
|
|
{
|
|
|
|
|
struct reg regs;
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) ®s, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't get registers"));
|
|
|
|
|
|
|
|
|
|
hppanbsd_collect_gregset (regcache, ®s, regnum);
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) ®s, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't write registers"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (regnum == -1 || hppanbsd_fpregset_supplies_p (regnum))
|
|
|
|
|
{
|
|
|
|
|
struct fpreg fpregs;
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't get floating point status"));
|
|
|
|
|
|
|
|
|
|
hppanbsd_collect_fpregset (regcache, &fpregs, regnum);
|
|
|
|
|
|
|
|
|
|
if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
|
|
|
|
|
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
|
|
|
|
|
perror_with_name (_("Couldn't write floating point status"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Provide a prototype to silence -Wmissing-prototypes. */
|
|
|
|
|
void _initialize_hppanbsd_nat (void);
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_initialize_hppanbsd_nat (void)
|
|
|
|
|
{
|
|
|
|
|
struct target_ops *t;
|
|
|
|
|
|
|
|
|
|
/* Add some extra features to the ptrace target. */
|
|
|
|
|
t = inf_ptrace_target ();
|
|
|
|
|
|
|
|
|
|
t->to_fetch_registers = hppanbsd_fetch_registers;
|
|
|
|
|
t->to_store_registers = hppanbsd_store_registers;
|
|
|
|
|
|
|
|
|
|
t->to_pid_to_exec_file = nbsd_pid_to_exec_file;
|
|
|
|
|
|
|
|
|
|
add_target (t);
|
|
|
|
|
}
|