X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Flinux-nat-trad.c;h=9776a209c7fa68c1c99c6fd4612a8c94a0dd438e;hb=e2e31f1039e614b11277f5f1acc4182cd7fd3f2c;hp=066d15a352b6a69254432fc61004567390018e50;hpb=f6ac5f3d63e03a81c4ff3749aba234961cc9090e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/linux-nat-trad.c b/gdb/linux-nat-trad.c index 066d15a352..9776a209c7 100644 --- a/gdb/linux-nat-trad.c +++ b/gdb/linux-nat-trad.c @@ -29,9 +29,10 @@ void linux_nat_trad_target::fetch_register (struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = regcache->arch (); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR addr; + gdb_byte *buf; size_t size; - PTRACE_TYPE_RET *buf; pid_t pid; int i; @@ -40,29 +41,32 @@ linux_nat_trad_target::fetch_register (struct regcache *regcache, int regnum) if (addr == (CORE_ADDR)-1 || gdbarch_cannot_fetch_register (gdbarch, regnum)) { - regcache_raw_supply (regcache, regnum, NULL); + regcache->raw_supply (regnum, NULL); return; } - pid = get_ptrace_pid (regcache_get_ptid (regcache)); + pid = get_ptrace_pid (regcache->ptid ()); size = register_size (gdbarch, regnum); - gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); - buf = (PTRACE_TYPE_RET *) alloca (size); + buf = (gdb_byte *) alloca (size); /* Read the register contents from the inferior a chunk at a time. */ - for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) + for (i = 0; i < size; i += sizeof (PTRACE_TYPE_RET)) { + size_t chunk = std::min (sizeof (PTRACE_TYPE_RET), size - i); + PTRACE_TYPE_RET val; + errno = 0; - buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0); + val = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3) (uintptr_t) addr, 0); if (errno != 0) error (_("Couldn't read register %s (#%d): %s."), gdbarch_register_name (gdbarch, regnum), regnum, safe_strerror (errno)); + store_unsigned_integer (buf + i, chunk, byte_order, val); addr += sizeof (PTRACE_TYPE_RET); } - regcache_raw_supply (regcache, regnum, buf); + regcache->raw_supply (regnum, buf); } /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this @@ -87,9 +91,10 @@ linux_nat_trad_target::store_register (const struct regcache *regcache, int regnum) { struct gdbarch *gdbarch = regcache->arch (); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR addr; size_t size; - PTRACE_TYPE_RET *buf; + gdb_byte *buf; pid_t pid; int i; @@ -99,18 +104,21 @@ linux_nat_trad_target::store_register (const struct regcache *regcache, || gdbarch_cannot_store_register (gdbarch, regnum)) return; - pid = get_ptrace_pid (regcache_get_ptid (regcache)); + pid = get_ptrace_pid (regcache->ptid ()); size = register_size (gdbarch, regnum); - gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0); - buf = (PTRACE_TYPE_RET *) alloca (size); + buf = (gdb_byte *) alloca (size); /* Write the register contents into the inferior a chunk at a time. */ - regcache_raw_collect (regcache, regnum, buf); - for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++) + regcache->raw_collect (regnum, buf); + for (i = 0; i < size; i += sizeof (PTRACE_TYPE_RET)) { + size_t chunk = std::min (sizeof (PTRACE_TYPE_RET), size - i); + PTRACE_TYPE_RET val; + + val = extract_unsigned_integer (buf + i, chunk, byte_order); errno = 0; - ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]); + ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3) (uintptr_t) addr, val); if (errno != 0) error (_("Couldn't write register %s (#%d): %s."), gdbarch_register_name (gdbarch, regnum),