summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libc/ia64/gen/_setjmp.S8
-rw-r--r--lib/libc_r/uthread/pthread_private.h1
-rw-r--r--sys/ia64/include/setjmp.h3
3 files changed, 8 insertions, 4 deletions
diff --git a/lib/libc/ia64/gen/_setjmp.S b/lib/libc/ia64/gen/_setjmp.S
index a48e5f1..8e3ba12 100644
--- a/lib/libc/ia64/gen/_setjmp.S
+++ b/lib/libc/ia64/gen/_setjmp.S
@@ -171,10 +171,11 @@ ENTRY(_setjmp, 1)
mov r3 = b4
;;
st8 [r11] = r2, J_B5-J_B3
- st8 [r10] = r3
+ st8 [r10] = r3, J_GP-J_B4
mov r2 = b5
;;
st8 [r11] = r2
+ st8 [r10] = r1
;;
//
// return
@@ -290,11 +291,12 @@ ENTRY(___longjmp, 2)
mov b1 = r2
mov b2 = r3
ld8 r2 = [r10], J_B5-J_B3
- ld8 r3 = [r11],
+ ld8 r3 = [r11], J_GP-J_B4
;;
mov b3 = r2
- mov b4 = r3
+ mov b4 = r3
ld8 r2 = [r10]
+ ld8 r1 = [r11]
ld8 r21 = [r31] // get user unat
;;
mov b5 = r2
diff --git a/lib/libc_r/uthread/pthread_private.h b/lib/libc_r/uthread/pthread_private.h
index b2f7a61..143772d 100644
--- a/lib/libc_r/uthread/pthread_private.h
+++ b/lib/libc_r/uthread/pthread_private.h
@@ -109,6 +109,7 @@
#define SET_RETURN_ADDR_JB(jb, ra) \
do { \
*((unsigned long*)JMPBUF_ADDR_OF(jb,J_B0)) = ((long*)(ra))[0]; \
+ *((unsigned long*)JMPBUF_ADDR_OF(jb,J_GP)) = ((long*)(ra))[1]; \
*((unsigned long*)JMPBUF_ADDR_OF(jb,J_PFS)) &= ~0x1FFFFFFFFFUL; \
} while (0)
#define SET_STACK_JB(jb, stk, sz) \
diff --git a/sys/ia64/include/setjmp.h b/sys/ia64/include/setjmp.h
index 208e072..6f4fab9 100644
--- a/sys/ia64/include/setjmp.h
+++ b/sys/ia64/include/setjmp.h
@@ -88,10 +88,11 @@
#define J_B5 0x1d0
#define J_SIGMASK 0x1d8
#define J_SIGSET 0x1e0
+#define J_GP 0x1f0
#endif /* __BSD_VISIBLE */
/*
- * We have 16 bytes left for future use, but it's a nice round,
+ * We have 8 bytes left for future use, but it's a nice round,
* but above all large number. Size is in bytes.
*/
#define _JMPBUFSZ 0x200
OpenPOWER on IntegriCloud