aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/linux-s390-low.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2008-02-27 03:33:07 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2008-02-27 03:33:07 +0000
commitee1a7ae44068868a9351a2eef5d4be107bb8d024 (patch)
treeac345b39e9b1a50b027026edd9bd32f93e9734e9 /gdb/gdbserver/linux-s390-low.c
parentd61ddec43526d69a4625f46671b2c1b5bea9fa88 (diff)
downloadgdb-ee1a7ae44068868a9351a2eef5d4be107bb8d024.zip
gdb-ee1a7ae44068868a9351a2eef5d4be107bb8d024.tar.gz
gdb-ee1a7ae44068868a9351a2eef5d4be107bb8d024.tar.bz2
* 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.
Diffstat (limited to 'gdb/gdbserver/linux-s390-low.c')
-rw-r--r--gdb/gdbserver/linux-s390-low.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/gdb/gdbserver/linux-s390-low.c b/gdb/gdbserver/linux-s390-low.c
index d6739ab..090ef27 100644
--- a/gdb/gdbserver/linux-s390-low.c
+++ b/gdb/gdbserver/linux-s390-low.c
@@ -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,
};