diff options
author | marcel <marcel@FreeBSD.org> | 2004-07-27 03:54:16 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-07-27 03:54:16 +0000 |
commit | b413f385c81e169d0604caa622d20bd19b4a6bd4 (patch) | |
tree | 17aad43117a909e7911314e7fafe99fba3fad427 /contrib/gdb | |
parent | 8a38bc6b2ce7980dbddef0dc33bfba51ec5d3824 (diff) | |
download | FreeBSD-src-b413f385c81e169d0604caa622d20bd19b4a6bd4.zip FreeBSD-src-b413f385c81e169d0604caa622d20bd19b4a6bd4.tar.gz |
Various improvements for ia64:
o s/TARGET_XFER_DIRTY/NATIVE_XFER_DIRTY/g to be conformant,
o Handle TARGET_OBJECT_DIRTY for core files. Required on Linux,
o Replace ia64_fbsd_supply_fpregs() and ia64_fbsd_supply_gregs()
with supply_fpregset() and supply_gregset() resp. Needed to
support libthread_db.
o For target_read_partial(), pass the address of bspstore as the
annex instead of bspstore itself. This fixes crossbuilds. The
annex is a pointer, while bspstore is a ULONGEST.
o In ia64_frame_prev_register(), handle dirty stacked registers.
Diffstat (limited to 'contrib/gdb')
-rw-r--r-- | contrib/gdb/gdb/config/ia64/nm-fbsd.h | 2 | ||||
-rw-r--r-- | contrib/gdb/gdb/corelow.c | 17 | ||||
-rw-r--r-- | contrib/gdb/gdb/ia64-fbsd-nat.c | 12 | ||||
-rw-r--r-- | contrib/gdb/gdb/ia64-fbsd-tdep.c | 42 | ||||
-rw-r--r-- | contrib/gdb/gdb/ia64-tdep.c | 34 | ||||
-rw-r--r-- | contrib/gdb/gdb/inftarg.c | 6 |
6 files changed, 66 insertions, 47 deletions
diff --git a/contrib/gdb/gdb/config/ia64/nm-fbsd.h b/contrib/gdb/gdb/config/ia64/nm-fbsd.h index 71edb0f..bdac67f 100644 --- a/contrib/gdb/gdb/config/ia64/nm-fbsd.h +++ b/contrib/gdb/gdb/config/ia64/nm-fbsd.h @@ -17,7 +17,7 @@ #include "target.h" -#define TARGET_XFER_DIRTY ia64_fbsd_xfer_dirty +#define NATIVE_XFER_DIRTY ia64_fbsd_xfer_dirty extern LONGEST ia64_fbsd_xfer_dirty(struct target_ops *, enum target_object, const char *, void *, const void *, ULONGEST, LONGEST); diff --git a/contrib/gdb/gdb/corelow.c b/contrib/gdb/gdb/corelow.c index 403cfa3..9e201cc 100644 --- a/contrib/gdb/gdb/corelow.c +++ b/contrib/gdb/gdb/corelow.c @@ -525,10 +525,10 @@ core_xfer_partial (struct target_ops *ops, enum target_object object, { case TARGET_OBJECT_MEMORY: if (readbuf) - return (*ops->to_xfer_memory) (offset, readbuf, len, 0/*write*/, + return (*ops->to_xfer_memory) (offset, readbuf, len, 0/*read*/, NULL, ops); if (writebuf) - return (*ops->to_xfer_memory) (offset, readbuf, len, 1/*write*/, + return (*ops->to_xfer_memory) (offset, writebuf, len, 1/*write*/, NULL, ops); return -1; @@ -564,6 +564,19 @@ core_xfer_partial (struct target_ops *ops, enum target_object object, } return -1; + case TARGET_OBJECT_DIRTY: + { + ULONGEST addr; + addr = *(ULONGEST*)annex + offset; + if (readbuf) + return (*ops->to_xfer_memory) (addr, readbuf, len, 0/*read*/, + NULL, ops); + if (writebuf) + return (*ops->to_xfer_memory) (addr, writebuf, len, 1/*write*/, + NULL, ops); + return -1; + } + default: if (ops->beneath != NULL) return ops->beneath->to_xfer_partial (ops->beneath, object, annex, diff --git a/contrib/gdb/gdb/ia64-fbsd-nat.c b/contrib/gdb/gdb/ia64-fbsd-nat.c index 462dfd5..c201864 100644 --- a/contrib/gdb/gdb/ia64-fbsd-nat.c +++ b/contrib/gdb/gdb/ia64-fbsd-nat.c @@ -49,10 +49,6 @@ typedef struct fpreg fpregset_t; #define FPREG_SUPPLIES(r) ((r) >= IA64_FR0_REGNUM && (r) <= IA64_FR127_REGNUM) #define GREG_SUPPLIES(r) (!FPREG_SUPPLIES(r)) -/* XXX need to go away. */ -void ia64_fbsd_supply_fpregs (void *, int); -void ia64_fbsd_supply_gregs (void *, int); - void fetch_inferior_registers (int regno) { @@ -66,9 +62,7 @@ fetch_inferior_registers (int regno) if (ptrace (PT_GETREGS, PIDGET(inferior_ptid), (PTRACE_ARG3_TYPE)®s.r, 0) == -1) perror_with_name ("Couldn't get registers"); - ia64_fbsd_supply_gregs (®s.r, regno); - if (regno != -1) - return; + supply_gregset (®s.r); } if (regno == -1 || FPREG_SUPPLIES(regno)) @@ -76,9 +70,7 @@ fetch_inferior_registers (int regno) if (ptrace (PT_GETFPREGS, PIDGET(inferior_ptid), (PTRACE_ARG3_TYPE)®s.fpr, 0) == -1) perror_with_name ("Couldn't get FP registers"); - ia64_fbsd_supply_fpregs (®s.fpr, regno); - if (regno != -1) - return; + supply_fpregset (®s.fpr); } } diff --git a/contrib/gdb/gdb/ia64-fbsd-tdep.c b/contrib/gdb/gdb/ia64-fbsd-tdep.c index 2c2a71f..4bf8918 100644 --- a/contrib/gdb/gdb/ia64-fbsd-tdep.c +++ b/contrib/gdb/gdb/ia64-fbsd-tdep.c @@ -107,8 +107,18 @@ ia64_fbsd_regcache_collect (struct regcache *regcache, int regno, return; ofs = reg_offset[regno]; - if (ofs >= 0) - regcache_raw_collect (regcache, regno, (char*)regs + ofs); + if (regno == IA64_BSP_REGNUM) + { + uint64_t bsp, bspstore; + regcache_raw_collect (regcache, regno, &bsp); + regcache_raw_collect (regcache, IA64_BSPSTORE_REGNUM, &bspstore); + *(uint64_t *)((char *)regs + ofs) = bsp - bspstore; + } + else + { + if (ofs >= 0) + regcache_raw_collect (regcache, regno, (char*)regs + ofs); + } } static void @@ -178,17 +188,11 @@ fill_gregset (void *gregs, int regno) } void -ia64_fbsd_supply_fpregs (const void *fpregs, int regno) +supply_fpregset (const void *fpregs) { - if (regno == -1) - { - for (regno = 0; regno < NUM_REGS; regno++) - { - if (FPREG_SUPPLIES(regno)) - ia64_fbsd_regcache_supply (current_regcache, regno, fpregs); - } - } - else + int regno; + + for (regno = 0; regno < NUM_REGS; regno++) { if (FPREG_SUPPLIES(regno)) ia64_fbsd_regcache_supply (current_regcache, regno, fpregs); @@ -196,17 +200,11 @@ ia64_fbsd_supply_fpregs (const void *fpregs, int regno) } void -ia64_fbsd_supply_gregs (const void *gregs, int regno) +supply_gregset (const void *gregs) { - if (regno == -1) - { - for (regno = 0; regno < NUM_REGS; regno++) - { - if (GREG_SUPPLIES(regno)) - ia64_fbsd_regcache_supply (current_regcache, regno, gregs); - } - } - else + int regno; + + for (regno = 0; regno < NUM_REGS; regno++) { if (GREG_SUPPLIES(regno)) ia64_fbsd_regcache_supply (current_regcache, regno, gregs); diff --git a/contrib/gdb/gdb/ia64-tdep.c b/contrib/gdb/gdb/ia64-tdep.c index af59a6b..d326749 100644 --- a/contrib/gdb/gdb/ia64-tdep.c +++ b/contrib/gdb/gdb/ia64-tdep.c @@ -667,7 +667,7 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, regnum), reg); } else target_read_partial (¤t_target, TARGET_OBJECT_DIRTY, - (void*)bspstore, buf, reg_addr - bspstore, + (void*)&bspstore, buf, reg_addr - bspstore, register_size (current_gdbarch, regnum)); } else @@ -718,7 +718,7 @@ ia64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, else { char natbuf[8]; target_read_partial (¤t_target, TARGET_OBJECT_DIRTY, - (void*)bspstore, natbuf, + (void*)&bspstore, natbuf, nat_addr - bspstore, register_size (current_gdbarch, regnum)); nat_collection = *((uint64_t*)natbuf); @@ -795,7 +795,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, write_memory (reg_addr, (void *)buf, 8); else target_write_partial (¤t_target, TARGET_OBJECT_DIRTY, - (void*)bspstore, buf, reg_addr - bspstore, + (void*)&bspstore, buf, reg_addr - bspstore, register_size (current_gdbarch, regnum)); } } @@ -859,7 +859,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, else { char natbuf[8]; target_read_partial (¤t_target, TARGET_OBJECT_DIRTY, - (void*)bspstore, natbuf, + (void*)&bspstore, natbuf, nat_addr - bspstore, register_size (current_gdbarch, regnum)); nat_collection = *((uint64_t*)natbuf); @@ -875,7 +875,7 @@ ia64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, write_memory (nat_addr, nat_buf, 8); else target_write_partial (¤t_target, TARGET_OBJECT_DIRTY, - (void*)bspstore, nat_buf, + (void*)&bspstore, nat_buf, nat_addr - bspstore, register_size (current_gdbarch, regnum)); } @@ -1828,6 +1828,8 @@ ia64_frame_prev_register (struct frame_info *next_frame, void **this_cache, CORE_ADDR r_addr; CORE_ADDR prev_cfm, prev_bsp, prev_bof; CORE_ADDR addr = 0; + ULONGEST bspstore; + if (regnum >= V32_REGNUM) regnum = IA64_GR32_REGNUM + (regnum - V32_REGNUM); ia64_frame_prev_register (next_frame, this_cache, IA64_CFM_REGNUM, @@ -1839,10 +1841,24 @@ ia64_frame_prev_register (struct frame_info *next_frame, void **this_cache, prev_bof = rse_address_add (prev_bsp, -(prev_cfm & 0x7f)); addr = rse_address_add (prev_bof, (regnum - IA64_GR32_REGNUM)); - /* XXX marcel */ - *lvalp = lval_memory; - *addrp = addr; - read_memory (addr, valuep, register_size (current_gdbarch, regnum)); + + /* Figure out if the register was already flushed or is dirty. + If the register was flushed already we can return the address + on the backingstore for it. */ + regcache_cooked_read_unsigned (current_regcache, IA64_BSPSTORE_REGNUM, + &bspstore); + if (addr < bspstore) + { + *lvalp = lval_memory; + *addrp = addr; + read_memory (addr, valuep, register_size (current_gdbarch, regnum)); + } + else + { + target_read_partial (¤t_target, TARGET_OBJECT_DIRTY, + (void*)&bspstore, valuep, addr - bspstore, + register_size (current_gdbarch, regnum)); + } } } else diff --git a/contrib/gdb/gdb/inftarg.c b/contrib/gdb/gdb/inftarg.c index 260c245..bbd7f22 100644 --- a/contrib/gdb/gdb/inftarg.c +++ b/contrib/gdb/gdb/inftarg.c @@ -593,10 +593,10 @@ child_xfer_partial (struct target_ops *ops, enum target_object object, offset, len); case TARGET_OBJECT_DIRTY: -#ifndef TARGET_XFER_DIRTY -#define TARGET_XFER_DIRTY(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1) +#ifndef NATIVE_XFER_DIRTY +#define NATIVE_XFER_DIRTY(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1) #endif - return TARGET_XFER_DIRTY (ops, object, annex, readbuf, writebuf, + return NATIVE_XFER_DIRTY (ops, object, annex, readbuf, writebuf, offset, len); default: |