From 475109d8708bdc9c9a4667c0e460a1c395fdd8fd Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Tue, 25 Feb 2014 09:58:25 -0500 Subject: [PATCH] Adjust ia64_linux_xfer_partial following to_xfer_partial API change. ia64-linux-nat.c no longer compiles because ia64_linux_xfer_partial no longer matches the to_xfer_partial prototype. This patch fixes the problem by adjusting it accordingly. gdb/ChangeLog: * 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. --- gdb/ChangeLog | 6 ++++++ gdb/ia64-linux-nat.c | 28 +++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d3ae4f2b113..b2385c18368 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-02-25 Joel Brobecker + + * 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 * target.h (target_ops): Fix TARGET_DEFAULT_RETURN of diff --git a/gdb/ia64-linux-nat.c b/gdb/ia64-linux-nat.c index ccd55b29673..c057b55f813 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 -- 2.30.2