diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/ia64-linux-nat.c | 28 |
2 files changed, 29 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d3ae4f2..b2385c1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-02-25 Joel Brobecker <brobecker@adacore.com> + + * ia64-linux-nat.c (ia64_linux_xfer_partial): Add function + documentation. Adjust prototype to match the target_ops + to_xfer_partial method. Adjust implementation accordingly. + 2014-02-25 Hui Zhu <hui@codesourcery.com> * target.h (target_ops): Fix TARGET_DEFAULT_RETURN of diff --git a/gdb/ia64-linux-nat.c b/gdb/ia64-linux-nat.c index ccd55b2..c057b55 100644 --- a/gdb/ia64-linux-nat.c +++ b/gdb/ia64-linux-nat.c @@ -838,18 +838,36 @@ ia64_linux_store_registers (struct target_ops *ops, static target_xfer_partial_ftype *super_xfer_partial; -static LONGEST +/* Implement the to_xfer_partial target_ops method. */ + +static enum target_xfer_status ia64_linux_xfer_partial (struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, - ULONGEST offset, ULONGEST len) + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) { - if (object == TARGET_OBJECT_UNWIND_TABLE && writebuf == NULL && offset == 0) - return syscall (__NR_getunwind, readbuf, len); + if (object == TARGET_OBJECT_UNWIND_TABLE && readbuf != NULL) + { + gdb_byte *tmp_buf = alloca (offset + len); + ULONGEST xfered; + + xfered = syscall (__NR_getunwind, readbuf, offset + len); + if (xfered <= 0) + return TARGET_XFER_E_IO; + else if (xfered <= offset) + return TARGET_XFER_EOF; + else + { + memcpy (readbuf, tmp_buf + offset, xfered - offset); + *xfered_len = xfered - offset; + return TARGET_XFER_OK; + } + } return super_xfer_partial (ops, object, annex, readbuf, writebuf, - offset, len); + offset, len, xfered_len); } /* For break.b instruction ia64 CPU forgets the immediate value and generates |