Adjust ia64_linux_xfer_partial following to_xfer_partial API change.
authorJoel Brobecker <brobecker@adacore.com>
Tue, 25 Feb 2014 14:58:25 +0000 (09:58 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Tue, 25 Feb 2014 16:21:55 +0000 (11:21 -0500)
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
gdb/ia64-linux-nat.c

index d3ae4f2b11374465b94d5ea72d4fb46dd431cbea..b2385c183681a29bc399612efad45dbbaf664ac6 100644 (file)
@@ -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
index ccd55b296737c03045f1870b1fb7533b1e652083..c057b55f8131464eb72d62252f457bce90981753 100644 (file)
@@ -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