1*cf88c389Smatt/* $NetBSD: compat_setjmp.S,v 1.2 2011/01/15 07:31:13 matt Exp $ */ 2b09fbb02Smatt 3*cf88c389Smatt#include "SYS.h" 4*cf88c389Smatt#include "assym.h" 5b09fbb02Smatt 6b09fbb02Smatt#if defined(LIBC_SCCS) 7*cf88c389Smatt__RCSID("$NetBSD: compat_setjmp.S,v 1.2 2011/01/15 07:31:13 matt Exp $") 8b09fbb02Smatt#endif 9b09fbb02Smatt 10b09fbb02Smatt/* 11b09fbb02Smatt * C library -- _setjmp, _longjmp 12b09fbb02Smatt * 13b09fbb02Smatt * longjmp(a,v) 14b09fbb02Smatt * will generate a "return(v?v:1)" from the last call to 15b09fbb02Smatt * setjmp(a) 16b09fbb02Smatt * by restoring registers from the stack. 17b09fbb02Smatt * The previous signal state is restored. 18b09fbb02Smatt */ 19b09fbb02Smatt 20b09fbb02SmattENTRY(setjmp) 21b09fbb02Smatt mr %r6,%r3 22*cf88c389Smatt li %r3,SIG_BLOCK 23b09fbb02Smatt li %r4,0 24*cf88c389Smatt _DOSYSCALL(compat_13_sigprocmask13) # assume no error XXX 25b09fbb02Smatt mflr %r11 26b09fbb02Smatt mfcr %r12 27b09fbb02Smatt mr %r10,%r1 28b09fbb02Smatt mr %r9,%r2 29b09fbb02Smatt mr %r8,%r3 30b09fbb02Smatt stmw %r8,4(%r6) 31b09fbb02Smatt li %r3,0 32b09fbb02Smatt blr 33*cf88c389SmattEND(setjmp) 34b09fbb02Smatt 35b09fbb02SmattENTRY(longjmp) 36b09fbb02Smatt lmw %r8,4(%r3) 37b09fbb02Smatt mr %r6,%r4 38b09fbb02Smatt mtlr %r11 39b09fbb02Smatt mtcr %r12 40b09fbb02Smatt mr %r2,%r9 41b09fbb02Smatt mr %r1,%r10 42b09fbb02Smatt mr %r4,%r8 43*cf88c389Smatt li %r3,SIG_SETMASK 44*cf88c389Smatt _DOSYSCALL(compat_13_sigprocmask13) # assume no error XXX 45b09fbb02Smatt or. %r3,%r6,%r6 46b09fbb02Smatt bnelr 47b09fbb02Smatt li %r3,1 48b09fbb02Smatt blr 49*cf88c389SmattEND(longjmp) 50