Index: gdb/hppabsd-nat.c |
diff --git a/gdb/hppabsd-nat.c b/gdb/hppabsd-nat.c |
index c9b4e599364985700bf28b9ee5e626bc01d0d21d..181754ecc09785482f733e328f03dc12014d5ada 100644 |
--- a/gdb/hppabsd-nat.c |
+++ b/gdb/hppabsd-nat.c |
@@ -1,6 +1,6 @@ |
/* Native-dependent code for HP PA-RISC BSD's. |
- Copyright (C) 2004-2005, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2004-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -32,7 +32,7 @@ |
static int |
hppabsd_gregset_supplies_p (int regnum) |
{ |
- return (regnum >= HPPA_R0_REGNUM && regnum <= HPPA_PCOQ_TAIL_REGNUM); |
+ return (regnum >= HPPA_R0_REGNUM && regnum <= HPPA_CR27_REGNUM); |
} |
static int |
@@ -46,15 +46,39 @@ hppabsd_fpregset_supplies_p (int regnum) |
static void |
hppabsd_supply_gregset (struct regcache *regcache, const void *gregs) |
{ |
+ gdb_byte zero[4] = { 0 }; |
const char *regs = gregs; |
int regnum; |
+ regcache_raw_supply (regcache, HPPA_R0_REGNUM, &zero); |
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); |
- regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); |
- regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); |
+ if (sizeof(struct reg) >= 46 * 4) |
+ { |
+ regcache_raw_supply (regcache, HPPA_IPSW_REGNUM, regs); |
+ 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_SR0_REGNUM, regs + 37 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR1_REGNUM, regs + 38 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR2_REGNUM, regs + 39 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR3_REGNUM, regs + 40 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR4_REGNUM, regs + 41 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR5_REGNUM, regs + 42 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR6_REGNUM, regs + 43 * 4); |
+ regcache_raw_supply (regcache, HPPA_SR7_REGNUM, regs + 44 * 4); |
+ regcache_raw_supply (regcache, HPPA_CR26_REGNUM, regs + 45 * 4); |
+ regcache_raw_supply (regcache, HPPA_CR27_REGNUM, regs + 46 * 4); |
+ } |
+ else |
+ { |
+ regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs); |
+ regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); |
+ regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); |
+ } |
} |
/* Supply the floating-point registers stored in FPREGS to REGCACHE. */ |
@@ -89,12 +113,50 @@ hppabsd_collect_gregset (const struct regcache *regcache, |
regcache_raw_collect (regcache, i, regs + i * 4); |
} |
- if (regnum == -1 || regnum == HPPA_SAR_REGNUM) |
- regcache_raw_collect (regcache, HPPA_SAR_REGNUM, regs); |
- if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM) |
- regcache_raw_collect (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); |
- if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM) |
- regcache_raw_collect (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); |
+ if (sizeof(struct reg) >= 46 * 4) |
+ { |
+ if (regnum == -1 || regnum == HPPA_IPSW_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_IPSW_REGNUM, regs); |
+ 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_SR0_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR0_REGNUM, regs + 37 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR1_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR1_REGNUM, regs + 38 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR2_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR2_REGNUM, regs + 39 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR3_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR3_REGNUM, regs + 40 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR4_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR4_REGNUM, regs + 41 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR5_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR5_REGNUM, regs + 42 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR6_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR6_REGNUM, regs + 43 * 4); |
+ if (regnum == -1 || regnum == HPPA_SR7_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SR7_REGNUM, regs + 44 * 4); |
+ if (regnum == -1 || regnum == HPPA_CR26_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_CR26_REGNUM, regs + 45 * 4); |
+ if (regnum == -1 || regnum == HPPA_CR27_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_CR27_REGNUM, regs + 46 * 4); |
+ } |
+ else |
+ { |
+ if (regnum == -1 || regnum == HPPA_SAR_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_SAR_REGNUM, regs); |
+ if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); |
+ if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM) |
+ regcache_raw_collect (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); |
+ } |
} |
/* Collect the floating-point registers from REGCACHE and store them |
@@ -129,7 +191,7 @@ hppabsd_fetch_registers (struct target_ops *ops, |
{ |
struct reg regs; |
- if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) ®s, 0) == -1) |
perror_with_name (_("Couldn't get registers")); |
@@ -140,7 +202,7 @@ hppabsd_fetch_registers (struct target_ops *ops, |
{ |
struct fpreg fpregs; |
- if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1) |
perror_with_name (_("Couldn't get floating point status")); |
@@ -159,13 +221,13 @@ hppabsd_store_registers (struct target_ops *ops, |
{ |
struct reg regs; |
- if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) ®s, 0) == -1) |
perror_with_name (_("Couldn't get registers")); |
hppabsd_collect_gregset (regcache, ®s, regnum); |
- if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) ®s, 0) == -1) |
perror_with_name (_("Couldn't write registers")); |
} |
@@ -174,13 +236,13 @@ hppabsd_store_registers (struct target_ops *ops, |
{ |
struct fpreg fpregs; |
- if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1) |
perror_with_name (_("Couldn't get floating point status")); |
hppabsd_collect_fpregset (regcache, &fpregs, regnum); |
- if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), |
+ if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), |
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1) |
perror_with_name (_("Couldn't write floating point status")); |
} |