diff options
author | David Leonard <d@cvs.openbsd.org> | 2000-01-06 07:04:37 +0000 |
---|---|---|
committer | David Leonard <d@cvs.openbsd.org> | 2000-01-06 07:04:37 +0000 |
commit | 51b6d2b79c35846bc706cb7acc002ee6f6ba29ab (patch) | |
tree | 7dd23a6808f75dee105baa200b5accfca8f63f00 /lib/libc_r | |
parent | 8e3f6ce3201d28bbb1c095cc783f42214d552cfb (diff) |
thread context setjmp code, art@
Diffstat (limited to 'lib/libc_r')
-rw-r--r-- | lib/libc_r/arch/sparc/uthread_machdep.S | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/libc_r/arch/sparc/uthread_machdep.S b/lib/libc_r/arch/sparc/uthread_machdep.S new file mode 100644 index 00000000000..c24fff66c07 --- /dev/null +++ b/lib/libc_r/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 + |