* sparc-tdep.c (sparc_supply_rwindow, sparc_collect_rwindow):
authorMark Kettenis <kettenis@gnu.org>
Mon, 28 Mar 2005 13:42:49 +0000 (13:42 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 28 Mar 2005 13:42:49 +0000 (13:42 +0000)
Handle StackGhost in 64-bit code.
* sparc64-tdep.c (sparc64_frame_prev_register): Handle StackGhost.

gdb/ChangeLog
gdb/sparc-tdep.c
gdb/sparc64-tdep.c

index eb3faee3aa3b332c2c489b1d0e5ed588f9e2e7f6..88abf013cf792bfac228a1cf861a607c37dca461 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-28  Mark Kettenis  <kettenis@gnu.org>
+
+       * sparc-tdep.c (sparc_supply_rwindow, sparc_collect_rwindow):
+       Handle StackGhost in 64-bit code.
+       * sparc64-tdep.c (sparc64_frame_prev_register): Handle StackGhost.
+
 2005-03-27  Christopher Faylor  <cgf@timesys.com>
 
        * win32-nat.c (handle_exception): Treat win32 routines which check for
index f9ded35d1d0354bea0de7502fbaf7fe748b28af3..dcae0455885e9836ed09a6f7a74eaef886ec2355 100644 (file)
@@ -1272,6 +1272,16 @@ sparc_supply_rwindow (struct regcache *regcache, CORE_ADDR sp, int regnum)
          if (regnum == i || regnum == -1)
            {
              target_read_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
+
+             /* Handle StackGhost.  */
+             if (i == SPARC_I7_REGNUM)
+               {
+                 ULONGEST wcookie = sparc_fetch_wcookie ();
+                 ULONGEST i7 = extract_unsigned_integer (buf + offset, 8);
+
+                 store_unsigned_integer (buf + offset, 8, i7 ^ wcookie);
+               }
+
              regcache_raw_supply (regcache, i, buf);
            }
        }
@@ -1330,6 +1340,16 @@ sparc_collect_rwindow (const struct regcache *regcache,
          if (regnum == -1 || regnum == SPARC_SP_REGNUM || regnum == i)
            {
              regcache_raw_collect (regcache, i, buf);
+
+             /* Handle StackGhost.  */
+             if (i == SPARC_I7_REGNUM)
+               {
+                 ULONGEST wcookie = sparc_fetch_wcookie ();
+                 ULONGEST i7 = extract_unsigned_integer (buf + offset, 8);
+
+                 store_unsigned_integer (buf, 8, i7 ^ wcookie);
+               }
+
              target_write_memory (sp + ((i - SPARC_L0_REGNUM) * 8), buf, 8);
            }
        }
index f8087b409bdefb583adcc4465192be7c503148b5..6038ceb1b4ecc3921b543914b5f5e47434bfc6f8 100644 (file)
@@ -519,6 +519,29 @@ sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
       return;
     }
 
+  /* Handle StackGhost.  */
+  {
+    ULONGEST wcookie = sparc_fetch_wcookie ();
+
+    if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
+      {
+       *optimizedp = 0;
+       *lvalp = not_lval;
+       *addrp = 0;
+       *realnump = -1;
+       if (valuep)
+         {
+           CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
+           ULONGEST i7;
+
+           /* Read the value in from memory.  */
+           i7 = get_frame_memory_unsigned (next_frame, addr, 8);
+           store_unsigned_integer (valuep, 8, i7 ^ wcookie);
+         }
+       return;
+      }
+  }
+
   /* The previous frame's `local' and `in' registers have been saved
      in the register save area.  */
   if (!cache->frameless_p