gdb/s390: Fill guess_tracepoint_registers hook.
authorMarcin Kościelnicki <koriakin@0x04.net>
Sat, 23 Jan 2016 22:53:41 +0000 (23:53 +0100)
committerMarcin Kościelnicki <koriakin@0x04.net>
Thu, 18 Feb 2016 16:53:00 +0000 (17:53 +0100)
gdb/ChangeLog:

* s390-linux-tdep.c (s390_guess_tracepoint_registers): New function.
(s390_gdbarch_init): Fill guess_tracepoint_registers hook.

gdb/ChangeLog
gdb/s390-linux-tdep.c

index 6fee07b4bebb4d0374ce0e2b4aa71f08a31860ff..274d98b0f0fe1d0422679b8964e8840eb73cfedb 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-18  Marcin Kościelnicki  <koriakin@0x04.net>
+
+       * s390-linux-tdep.c (s390_guess_tracepoint_registers): New function.
+       (s390_gdbarch_init): Fill guess_tracepoint_registers hook.
+
 2016-02-18  Walfred Tedeschi  <walfred.tedeschi@intel.com>
 
        * NEWS: Add entry for bound violation.
index e827684cdd5c2f727065bb526509dd77aa8eb278..57e25b43177be564729ea0b1a2ee72b78fe3c8d4 100644 (file)
@@ -167,6 +167,40 @@ s390_write_pc (struct regcache *regcache, CORE_ADDR pc)
     regcache_cooked_write_unsigned (regcache, S390_SYSTEM_CALL_REGNUM, 0);
 }
 
+/* The "guess_tracepoint_registers" gdbarch method.  */
+
+static void
+s390_guess_tracepoint_registers (struct gdbarch *gdbarch,
+                                struct regcache *regcache,
+                                CORE_ADDR addr)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int sz = register_size (gdbarch, S390_PSWA_REGNUM);
+  gdb_byte *reg = (gdb_byte *) alloca (sz);
+  ULONGEST pswm, pswa;
+
+  /* Set PSWA from the location and a default PSWM (the only part we're
+     unlikely to get right is the CC).  */
+  if (tdep->abi == ABI_LINUX_S390)
+    {
+      /* 31-bit PSWA needs high bit set (it's very unlikely the target
+        was in 24-bit mode).  */
+      pswa = addr | 0x80000000UL;
+      pswm = 0x070d0000UL;
+    }
+  else
+    {
+      pswa = addr;
+      pswm = 0x0705000180000000ULL;
+    }
+
+  store_unsigned_integer (reg, sz, gdbarch_byte_order (gdbarch), pswa);
+  regcache_raw_supply (regcache, S390_PSWA_REGNUM, reg);
+
+  store_unsigned_integer (reg, sz, gdbarch_byte_order (gdbarch), pswm);
+  regcache_raw_supply (regcache, S390_PSWM_REGNUM, reg);
+}
+
 
 /* DWARF Register Mapping.  */
 
@@ -7857,6 +7891,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
                                            s390_iterate_over_regset_sections);
   set_gdbarch_cannot_store_register (gdbarch, s390_cannot_store_register);
   set_gdbarch_write_pc (gdbarch, s390_write_pc);
+  set_gdbarch_guess_tracepoint_registers (gdbarch, s390_guess_tracepoint_registers);
   set_gdbarch_pseudo_register_read (gdbarch, s390_pseudo_register_read);
   set_gdbarch_pseudo_register_write (gdbarch, s390_pseudo_register_write);
   set_tdesc_pseudo_register_name (gdbarch, s390_pseudo_register_name);