summaryrefslogtreecommitdiff
path: root/lib/libpthread/arch
diff options
context:
space:
mode:
authorDavid Leonard <d@cvs.openbsd.org>2000-01-06 07:04:37 +0000
committerDavid Leonard <d@cvs.openbsd.org>2000-01-06 07:04:37 +0000
commit51b6d2b79c35846bc706cb7acc002ee6f6ba29ab (patch)
tree7dd23a6808f75dee105baa200b5accfca8f63f00 /lib/libpthread/arch
parent8e3f6ce3201d28bbb1c095cc783f42214d552cfb (diff)
thread context setjmp code, art@
Diffstat (limited to 'lib/libpthread/arch')
-rw-r--r--lib/libpthread/arch/sparc/uthread_machdep.S35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/libpthread/arch/sparc/uthread_machdep.S b/lib/libpthread/arch/sparc/uthread_machdep.S
new file mode 100644
index 00000000000..c24fff66c07
--- /dev/null
+++ b/lib/libpthread/arch/sparc/uthread_machdep.S
@@ -0,0 +1,35 @@
+/* $OpenBSD: uthread_machdep.S,v 1.1 2000/01/06 07:04:36 d Exp $ */
+
+#include <machine/asm.h>
+#include <machine/trap.h>
+
+ENTRY(_thread_machdep_create)
+ st %o2, [%o0] /* store the new stack pointer */
+ sub %o1, 8, %o1 /* the return adress is o7 + 8 ! */
+ st %o1, [%o0+4] /* store the new pc */
+
+ retl
+ nop
+
+ENTRY(_thread_machdep_setjmp)
+ t ST_FLUSHWIN /* flush register windows */
+ st %sp, [%o0] /* store sp */
+ st %o7, [%o0+4] /* store pc */
+ retl
+ clr %o0 /* return 0 */
+
+ENTRY(_thread_machdep_longjmp)
+ t ST_FLUSHWIN /* flush register windows */
+ sub %sp, 64, %sp /* foo? */
+
+ ld [%o0+4], %o7 /* restore pc */
+ ld [%o0], %fp /* restore fp, the restore ins below will
+ * cause it to become sp */
+ /* i?i:1 - Do we need to care? it's always called with 1 */
+ tst %o1
+ be,a 0f
+ mov 1, %o1
+0:
+ retl
+ restore %o1, 0, %o0
+