diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | stdlib/tst-setcontext.c | 13 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/getcontext.S | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/setcontext.S | 11 |
4 files changed, 29 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog index 1432224007..31f632a560 100644 --- 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. diff --git a/stdlib/tst-setcontext.c b/stdlib/tst-setcontext.c index 6ee1b514a6..ed53f9e288 100644 --- a/stdlib/tst-setcontext.c +++ b/stdlib/tst-setcontext.c @@ -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) diff --git a/sysdeps/unix/sysv/linux/ia64/getcontext.S b/sysdeps/unix/sysv/linux/ia64/getcontext.S index 2669a2b85f..1a0ca915ab 100644 --- a/sysdeps/unix/sysv/linux/ia64/getcontext.S +++ b/sysdeps/unix/sysv/linux/ia64/getcontext.S @@ -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 diff --git a/sysdeps/unix/sysv/linux/ia64/setcontext.S b/sysdeps/unix/sysv/linux/ia64/setcontext.S index 0d6e9a0bce..3964ed397a 100644 --- a/sysdeps/unix/sysv/linux/ia64/setcontext.S +++ b/sysdeps/unix/sysv/linux/ia64/setcontext.S @@ -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 |