* linux-low.h (struct linux_target_ops): Replace left_pad_xfer field
authorUlrich Weigand <uweigand@de.ibm.com>
Wed, 27 Feb 2008 03:33:07 +0000 (03:33 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Wed, 27 Feb 2008 03:33:07 +0000 (03:33 +0000)
by collect_ptrace_register and supply_ptrace_register hooks.
* linux-low.c (fetch_register): Use supply_ptrace_register callback
instead of checking for the_low_target.left_pad_xfer.
(usr_store_inferior_registers): Use collect_ptrace_register callback
instead of checking for the_low_target.left_pad_xfer.

* linux-s390-low.c (s390_collect_ptrace_register): New function.
(s390_supply_ptrace_register): Likewise.
(s390_fill_gregset): Call s390_collect_ptrace_register.
(the_low_target): Update.

* linux-ppc64-low.c (ppc_collect_ptrace_register): New function.
(ppc_supply_ptrace_register): Likewise.
(the_low_target): Update.

* linux-i386-low.c (the_low_target): Update.
* linux-x86-64-low.c (the_low_target): Update.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-i386-low.c
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h
gdb/gdbserver/linux-ppc64-low.c
gdb/gdbserver/linux-s390-low.c
gdb/gdbserver/linux-x86-64-low.c

index ae63d4e6cd5edf2507c7898b351989554bce170c..d8e5c7ff2ae4546c0f4884b1959c577de6582f87 100644 (file)
@@ -1,3 +1,24 @@
+2008-02-27  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * linux-low.h (struct linux_target_ops): Replace left_pad_xfer field
+       by collect_ptrace_register and supply_ptrace_register hooks.
+       * linux-low.c (fetch_register): Use supply_ptrace_register callback
+       instead of checking for the_low_target.left_pad_xfer.
+       (usr_store_inferior_registers): Use collect_ptrace_register callback
+       instead of checking for the_low_target.left_pad_xfer.
+
+       * linux-s390-low.c (s390_collect_ptrace_register): New function.
+       (s390_supply_ptrace_register): Likewise.
+       (s390_fill_gregset): Call s390_collect_ptrace_register.
+       (the_low_target): Update.
+
+       * linux-ppc64-low.c (ppc_collect_ptrace_register): New function.
+       (ppc_supply_ptrace_register): Likewise.
+       (the_low_target): Update.
+
+       * linux-i386-low.c (the_low_target): Update.
+       * linux-x86-64-low.c (the_low_target): Update.
+
 2008-02-27  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * configure.srv [s390x-*-linux*]: Set srv_regobj to include both
index 433d0855c713814478bf2e559fbff86e19e0ee85..c3cccb663abdd6db658173b11a51a59b58ce3fd8 100644 (file)
@@ -205,6 +205,7 @@ struct linux_target_ops the_low_target = {
   NULL,
   NULL,
   NULL,
-  0,
+  NULL,
+  NULL,
   "i386"
 };
index 732aafbc80f88e263bfbc177289c4044b36e8953..1d2b422377be05b7527217b9ba2e585efc79f3d2 100644 (file)
@@ -1401,10 +1401,9 @@ fetch_register (int regno)
          goto error_exit;
        }
     }
-  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)));
+
+  if (the_low_target.supply_ptrace_register)
+    the_low_target.supply_ptrace_register (regno, buf);
   else
     supply_register (regno, buf);
 
@@ -1448,12 +1447,12 @@ usr_store_inferior_registers (int regno)
             & - sizeof (PTRACE_XFER_TYPE);
       buf = alloca (size);
       memset (buf, 0, size);
-      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)));
+
+      if (the_low_target.collect_ptrace_register)
+       the_low_target.collect_ptrace_register (regno, buf);
       else
        collect_register (regno, buf);
+
       for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
        {
          errno = 0;
index 698a1b07f6d802fa8d22e6d4e1bd5f2c86b87c07..ccbeb254f7c8732304ba0f4fb53b36a5ab54feab 100644 (file)
@@ -69,9 +69,10 @@ 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;
+  /* Hooks to reformat register data for PEEKUSR/POKEUSR (in particular
+     for registers smaller than an xfer unit).  */
+  void (*collect_ptrace_register) (int regno, char *buf);
+  void (*supply_ptrace_register) (int regno, const char *buf);
 
   /* What string to report to GDB when it asks for the architecture,
      or NULL not to answer.  */
index 3897d73b1025a70a7266fa5f6cb54da5717db98f..f216e9dc7b875ed490e2d8ca3318d2729c67f4d1 100644 (file)
@@ -64,6 +64,26 @@ ppc_cannot_fetch_register (int regno)
   return 0;
 }
 
+static void
+ppc_collect_ptrace_register (int regno, char *buf)
+{
+  int size = register_size (regno);
+  if (size < sizeof (long))
+    collect_register (regno, buf + sizeof (long) - size);
+  else
+    collect_register (regno, buf);
+}
+
+static void
+ppc_supply_ptrace_register (int regno, const char *buf)
+{
+  int size = register_size (regno);
+  if (size < sizeof (long))
+    supply_register (regno, buf + sizeof (long) - size);
+  else
+    supply_register (regno, buf);
+}
+
 static CORE_ADDR
 ppc_get_pc (void)
 {
@@ -187,5 +207,6 @@ struct linux_target_ops the_low_target = {
   NULL,
   NULL,
   NULL,
-  1
+  ppc_collect_ptrace_register,
+  ppc_supply_ptrace_register,
 };
index d6739ab1be88e86bc01a2ed8b257e2e5a6bf0f08..090ef275a2d27728eed4b1eef4e6e95ec35bb740 100644 (file)
@@ -79,6 +79,45 @@ s390_cannot_store_register (int regno)
   return 0;
 }
 
+static void
+s390_collect_ptrace_register (int regno, char *buf)
+{
+  int size = register_size (regno);
+  if (size < sizeof (long))
+    {
+      memset (buf, 0, sizeof (long));
+
+      if (regno == find_regno ("pswa")
+         || (regno >= find_regno ("r0") && regno <= find_regno ("r15")))
+       collect_register (regno, buf + sizeof (long) - size);
+      else
+       collect_register (regno, buf);
+
+      /* When debugging a 32-bit inferior on a 64-bit host, make sure
+        the 31-bit addressing mode bit is set in the PSW mask.  */
+      if (regno == find_regno ("pswm"))
+       buf[size] |= 0x80;
+    }
+  else
+    collect_register (regno, buf);
+}
+
+static void
+s390_supply_ptrace_register (int regno, const char *buf)
+{
+  int size = register_size (regno);
+  if (size < sizeof (long))
+    {
+      if (regno == find_regno ("pswa")
+         || (regno >= find_regno ("r0") && regno <= find_regno ("r15")))
+       supply_register (regno, buf + sizeof (long) - size);
+      else
+       supply_register (regno, buf);
+    }
+  else
+    supply_register (regno, buf);
+}
+
 /* Provide only a fill function for the general register set.  ps_lgetregs
    will use this for NPTL support.  */
 
@@ -87,7 +126,7 @@ static void s390_fill_gregset (void *buf)
   int i;
 
   for (i = 0; i < 34; i++)
-    collect_register (i, (char *) buf + s390_regmap[i]);
+    s390_collect_ptrace_register (i, (char *) buf + s390_regmap[i]);
 }
 
 struct regset_info target_regsets[] = {
@@ -179,5 +218,11 @@ struct linux_target_ops the_low_target = {
   NULL,
   s390_breakpoint_len,
   s390_breakpoint_at,
+  NULL,
+  NULL,
+  NULL,
+  NULL,
+  s390_collect_ptrace_register,
+  s390_supply_ptrace_register,
 };
 
index 80f5c6dbc389690b35e067e618ae07962a092cb5..b4a2f6be594ddadf3879c73c23dc063df48d5a7e 100644 (file)
@@ -179,6 +179,7 @@ struct linux_target_ops the_low_target = {
   NULL,
   NULL,
   NULL,
-  0,
+  NULL,
+  NULL,
   "i386:x86-64",
 };