* linux-low.c (fetch_register, usr_store_inferior_registers): Handle
authorDaniel Jacobowitz <drow@false.org>
Wed, 13 Jul 2005 14:48:58 +0000 (14:48 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 13 Jul 2005 14:48:58 +0000 (14:48 +0000)
left-padded registers.
* linux-low.h (struct linux_target_ops): Add left_pad_xfer.
* linux-ppc64-low.c (the_low_target): Set left_pad_xfer.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h
gdb/gdbserver/linux-ppc64-low.c

index 71a799d..19d5e52 100644 (file)
@@ -1,3 +1,10 @@
+2005-07-13  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * linux-low.c (fetch_register, usr_store_inferior_registers): Handle
+       left-padded registers.
+       * linux-low.h (struct linux_target_ops): Add left_pad_xfer.
+       * linux-ppc64-low.c (the_low_target): Set left_pad_xfer.
+
 2005-07-01  Steve Ellcey  <sje@cup.hp.com>
 
        * configure.ac (BFD_NEED_DECLARATION): Replace with AC_CHECK_DECLS.
index fbc3033..904ff6b 100644 (file)
@@ -1126,7 +1126,12 @@ fetch_register (int regno)
          goto error_exit;
        }
     }
-  supply_register (regno, buf);
+  if (the_low_target.left_pad_xfer
+      && register_size (regno) < sizeof (PTRACE_XFER_TYPE))
+    supply_register (regno, (buf + sizeof (PTRACE_XFER_TYPE)
+                            - register_size (regno)));
+  else
+    supply_register (regno, buf);
 
 error_exit:;
 }
@@ -1168,7 +1173,12 @@ usr_store_inferior_registers (int regno)
             & - sizeof (PTRACE_XFER_TYPE);
       buf = alloca (size);
       memset (buf, 0, size);
-      collect_register (regno, buf);
+      if (the_low_target.left_pad_xfer
+         && register_size (regno) < sizeof (PTRACE_XFER_TYPE))
+       collect_register (regno, (buf + sizeof (PTRACE_XFER_TYPE)
+                                 - register_size (regno)));
+      else
+       collect_register (regno, buf);
       for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
        {
          errno = 0;
index 22ed57d..79b1bb7 100644 (file)
@@ -64,6 +64,9 @@ struct linux_target_ops
   int (*stopped_by_watchpoint) (void);
   CORE_ADDR (*stopped_data_address) (void);
 
+  /* Whether to left-pad registers for PEEKUSR/POKEUSR if they are smaller
+     than an xfer unit.  */
+  int left_pad_xfer;
 };
 
 extern struct linux_target_ops the_low_target;
index 6a8c17d..00374e7 100644 (file)
@@ -109,4 +109,9 @@ struct linux_target_ops the_low_target = {
   NULL,
   0,
   ppc_breakpoint_at,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  1
 };