From cbb6aada97409ccf45cdc24ef7f7e464906ada9a Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Thu, 25 Jul 2013 12:10:44 +0000 Subject: [PATCH] 2013-07-25 Mark Kettenis * hppa-tdep.h (enum hppa_regnum): Add members for all space registers. * hppaobsd-tdep.c (HPPAOBSD_SIZEOF_GREGS): Add comment. (HPPANBSD_SIZEOF_GREGS): New define. (hppaobsd_supply_gregset): Handle additional registers. * hppabsd-nat.c (hppabsd_gregset_supplies_p): Adjust to indicate we provide more registers now. (hppabsd_supply_gregset): Supply additional registers. (hppabsd_collect_gregset): Collect additional registers. --- gdb/ChangeLog | 11 ++++++ gdb/hppa-tdep.h | 7 ++++ gdb/hppabsd-nat.c | 82 +++++++++++++++++++++++++++++++++++++++------ gdb/hppaobsd-tdep.c | 56 +++++++++++++++++++++++++++---- 4 files changed, 139 insertions(+), 17 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0af3b6c17f6..f942217f133 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2013-07-25 Mark Kettenis + + * hppa-tdep.h (enum hppa_regnum): Add members for all space registers. + * hppaobsd-tdep.c (HPPAOBSD_SIZEOF_GREGS): Add comment. + (HPPANBSD_SIZEOF_GREGS): New define. + (hppaobsd_supply_gregset): Handle additional registers. + * hppabsd-nat.c (hppabsd_gregset_supplies_p): Adjust to indicate + we provide more registers now. + (hppabsd_supply_gregset): Supply additional registers. + (hppabsd_collect_gregset): Collect additional registers. + 2013-07-25 Mark Kettenis * hppabsd-tdep.c: Include "dwarf2-frame.h". diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h index d2ce45927e2..bee24ce75a4 100644 --- a/gdb/hppa-tdep.h +++ b/gdb/hppa-tdep.h @@ -50,6 +50,13 @@ enum hppa_regnum HPPA_ISR_REGNUM = 39, /* Interrupt Space Register */ HPPA_IOR_REGNUM = 40, /* Interrupt Offset Register */ HPPA_SR4_REGNUM = 43, /* space register 4 */ + HPPA_SR0_REGNUM = 44, /* space register 0 */ + HPPA_SR1_REGNUM = 45, /* space register 1 */ + HPPA_SR2_REGNUM = 46, /* space register 2 */ + HPPA_SR3_REGNUM = 47, /* space register 3 */ + HPPA_SR5_REGNUM = 48, /* space register 5 */ + HPPA_SR6_REGNUM = 49, /* space register 6 */ + HPPA_SR7_REGNUM = 50, /* space register 7 */ HPPA_RCR_REGNUM = 51, /* Recover Counter (also known as cr0) */ HPPA_PID0_REGNUM = 52, /* Protection ID */ HPPA_PID1_REGNUM = 53, /* Protection ID */ diff --git a/gdb/hppabsd-nat.c b/gdb/hppabsd-nat.c index dd941b76326..193fff3baec 100644 --- a/gdb/hppabsd-nat.c +++ b/gdb/hppabsd-nat.c @@ -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 diff --git a/gdb/hppaobsd-tdep.c b/gdb/hppaobsd-tdep.c index 662ae783de5..5b895c4b155 100644 --- a/gdb/hppaobsd-tdep.c +++ b/gdb/hppaobsd-tdep.c @@ -31,7 +31,8 @@ /* Core file support. */ /* Sizeof `struct reg' in . */ -#define HPPAOBSD_SIZEOF_GREGS (34 * 4) +#define HPPAOBSD_SIZEOF_GREGS (34 * 4) /* OpenBSD 5.1 and earlier. */ +#define HPPANBSD_SIZEOF_GREGS (46 * 4) /* NetBSD and OpenBSD 5.2 and later. */ /* Sizeof `struct fpreg' in . */ #define HPPAOBSD_SIZEOF_FPREGS (32 * 8) @@ -45,24 +46,65 @@ hppaobsd_supply_gregset (const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len) { + gdb_byte zero[4] = { 0 }; const gdb_byte *regs = gregs; size_t offset; int i; gdb_assert (len >= HPPAOBSD_SIZEOF_GREGS); + if (regnum == -1 || regnum == HPPA_R0_REGNUM) + regcache_raw_supply (regcache, HPPA_R0_REGNUM, &zero); for (i = HPPA_R1_REGNUM, offset = 4; i <= HPPA_R31_REGNUM; i++, offset += 4) { if (regnum == -1 || regnum == i) regcache_raw_supply (regcache, i, regs + offset); } - if (regnum == -1 || regnum == HPPA_SAR_REGNUM) - regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs); - if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM) - regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); - if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM) - regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); + if (len >= HPPANBSD_SIZEOF_GREGS) + { + if (regnum == -1 || regnum == HPPA_IPSW_REGNUM) + regcache_raw_supply (regcache, HPPA_IPSW_REGNUM, regs); + if (regnum == -1 || regnum == HPPA_SAR_REGNUM) + regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs + 32 * 4); + if (regnum == -1 || regnum == HPPA_PCSQ_HEAD_REGNUM) + regcache_raw_supply (regcache, HPPA_PCSQ_HEAD_REGNUM, regs + 33 * 4); + if (regnum == -1 || regnum == HPPA_PCSQ_TAIL_REGNUM) + regcache_raw_supply (regcache, HPPA_PCSQ_TAIL_REGNUM, regs + 34 * 4); + if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM) + regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 35 * 4); + if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM) + regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 36 * 4); + if (regnum == -1 || regnum == HPPA_SR0_REGNUM) + regcache_raw_supply (regcache, HPPA_SR0_REGNUM, regs + 37 * 4); + if (regnum == -1 || regnum == HPPA_SR1_REGNUM) + regcache_raw_supply (regcache, HPPA_SR1_REGNUM, regs + 38 * 4); + if (regnum == -1 || regnum == HPPA_SR2_REGNUM) + regcache_raw_supply (regcache, HPPA_SR2_REGNUM, regs + 39 * 4); + if (regnum == -1 || regnum == HPPA_SR3_REGNUM) + regcache_raw_supply (regcache, HPPA_SR3_REGNUM, regs + 40 * 4); + if (regnum == -1 || regnum == HPPA_SR4_REGNUM) + regcache_raw_supply (regcache, HPPA_SR4_REGNUM, regs + 41 * 4); + if (regnum == -1 || regnum == HPPA_SR5_REGNUM) + regcache_raw_supply (regcache, HPPA_SR5_REGNUM, regs + 42 * 4); + if (regnum == -1 || regnum == HPPA_SR6_REGNUM) + regcache_raw_supply (regcache, HPPA_SR6_REGNUM, regs + 43 * 4); + if (regnum == -1 || regnum == HPPA_SR7_REGNUM) + regcache_raw_supply (regcache, HPPA_SR7_REGNUM, regs + 44 * 4); + if (regnum == -1 || regnum == HPPA_CR26_REGNUM) + regcache_raw_supply (regcache, HPPA_CR26_REGNUM, regs + 45 * 4); + if (regnum == -1 || regnum == HPPA_CR27_REGNUM) + regcache_raw_supply (regcache, HPPA_CR27_REGNUM, regs + 46 * 4); + } + else + { + if (regnum == -1 || regnum == HPPA_SAR_REGNUM) + regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs); + if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM) + regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4); + if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM) + regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4); + } } /* Supply register REGNUM from the buffer specified by FPREGS and LEN -- 2.30.2