Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 6 Apr 2001 21:58:34 +0000 (21:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 6 Apr 2001 21:58:34 +0000 (21:58 +0000)
2001-04-06  David Mosberger  <davidm@hpl.hp.com>

* stdlib/tst-setcontext.c: Move st2[] to global scope.
(f2): Verify that stack pointer is inside st2[].

* sysdeps/unix/sysv/linux/ia64/getcontext.S: It helps to save r12.
* sysdeps/unix/sysv/linux/ia64/setcontext.S: It helps to restore r12.

ChangeLog
stdlib/tst-setcontext.c
sysdeps/unix/sysv/linux/ia64/getcontext.S
sysdeps/unix/sysv/linux/ia64/setcontext.S

index 1432224..31f632a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2001-04-06  David Mosberger  <davidm@hpl.hp.com>
+
+       * stdlib/tst-setcontext.c: Move st2[] to global scope.
+       (f2): Verify that stack pointer is inside st2[].
+
+       * sysdeps/unix/sysv/linux/ia64/getcontext.S: It helps to save r12.
+       * sysdeps/unix/sysv/linux/ia64/setcontext.S: It helps to restore r12.
+
 2001-04-06  Ulrich Drepper  <drepper@redhat.com>
 
        * timezone/antarctica: Update from tzdata2001b.
index 6ee1b51..ed53f9e 100644 (file)
@@ -26,6 +26,8 @@ static ucontext_t ctx[3];
 static int was_in_f1;
 static int was_in_f2;
 
+static char st2[8192];
+
 static void
 f1 (long a0, long a1, long a2, long a3)
 {
@@ -49,7 +51,17 @@ f1 (long a0, long a1, long a2, long a3)
 static void
 f2 (void)
 {
+  char on_stack[1];
+
   puts ("start f2");
+
+  printf ("&on_stack=%p\n", on_stack);
+  if (on_stack < st2 || on_stack >= st2 + sizeof (st2))
+    {
+      printf ("%s: memory stack is not where it belongs!", __FUNCTION__);
+      exit (1);
+    }
+
   if (swapcontext (&ctx[2], &ctx[1]) != 0)
     {
       printf ("%s: swapcontext: %m\n", __FUNCTION__);
@@ -63,7 +75,6 @@ int
 main (void)
 {
   char st1[8192];
-  char st2[8192];
 
   puts ("making contexts");
   if (getcontext (&ctx[1]) != 0)
index 2669a2b..1a0ca91 100644 (file)
@@ -61,12 +61,11 @@ ENTRY(__getcontext)
        mov.i rPFS = ar.pfs
        ;;
 .mem.offset 0,0; st8.spill [r2] = r5, 16
-.mem.offset 8,0; st8.spill [r3] = r6
-       add r3 = (SC_FR+3*16-(SC_GR+6*8)), r3
+.mem.offset 8,0; st8.spill [r3] = r6, 48
+       and rTMP = ~0x3, rRSC
        ;;
        st8.spill [r2] = r7, (SC_FR+2*16-(SC_GR+7*8))
-       nop 0
-       and rTMP = ~0x3, rRSC
+       st8.spill [r3] = sp, (SC_FR+3*16-(SC_GR+12*8))
        ;;
        mov.m ar.rsc = rTMP             // put RSE into enforced lazy mode
        mov.m rNAT = ar.unat
index 0d6e9a0..3964ed3 100644 (file)
@@ -87,9 +87,12 @@ ENTRY(__setcontext)
        ld8.fill r5 = [r3], 16
        mov b0 = rB0
        ;;
-       ld8.fill r6 = [r2]
+       ld8.fill r6 = [r2], 48
        ld8.fill r7 = [r3], (SC_FR+2*16-(SC_GR+7*8))
-       adds r2 = (SC_FR+3*16-(SC_GR+6*8)), r2
+       ;;
+       ld8.fill sp = [r2], (SC_FR+3*16-(SC_GR+12*8))
+       mov.m ar.fpsr = rFPSR
+       mov.i ar.pfs = rPFS
        ;;
        ldf.fill f3 = [r2], 16
        ldf.fill f2 = [r3], 48
@@ -132,10 +135,8 @@ ENTRY(__setcontext)
        mov pr = rPR, -1
        ;;
        mov.m ar.rsc = rTMP             // put RSE into enforced lazy mode
-       mov.m ar.fpsr = rFPSR
-       mov.i ar.pfs = rPFS
        ;;
-       loadrs                          // drop dirty partition is empty
+       loadrs                          // drop dirty partition
        ;;
        mov.m ar.bspstore = rBSP
        mov.m ar.unat = rUNAT