1*ea952cb8Sskrll/* $NetBSD: __setjmp14.S,v 1.6 2023/10/11 09:12:21 skrll Exp $ */ 2b09fbb02Smatt 3cf88c389Smatt#include "SYS.h" 4cf88c389Smatt#include "assym.h" 5b09fbb02Smatt 6b09fbb02Smatt#if defined(LIBC_SCCS) 7*ea952cb8Sskrll__RCSID("$NetBSD: __setjmp14.S,v 1.6 2023/10/11 09:12:21 skrll 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(__setjmp14) 21b09fbb02Smatt mr %r6,%r3 22*ea952cb8Sskrll li %r3,0 # how is ignored 23*ea952cb8Sskrll li %r4,0 # set = NULL 24cf88c389Smatt addi %r5,%r6,4*(1+24) # &sigmask 25cf88c389Smatt _DOSYSCALL(__sigprocmask14) # assume no error XXX 26b09fbb02Smatt mflr %r11 27b09fbb02Smatt mfcr %r12 28b09fbb02Smatt mr %r10,%r1 29b09fbb02Smatt mr %r9,%r2 30b09fbb02Smatt stmw %r8,4(%r6) # save r8-r31 31b09fbb02Smatt li %r3,0 32b09fbb02Smatt blr 33cf88c389SmattEND(__setjmp14) 34b09fbb02Smatt 35b09fbb02SmattENTRY(__longjmp14) 36b09fbb02Smatt lmw %r8,4(%r3) # load r8-r31 37b09fbb02Smatt mr %r6,%r4 38b09fbb02Smatt mtlr %r11 39b09fbb02Smatt mtcr %r12 40b09fbb02Smatt mr %r2,%r9 41b09fbb02Smatt mr %r1,%r10 42cf88c389Smatt addi %r4,%r3,4*(1+24) # &sigmask 43cf88c389Smatt li %r3,SIG_SETMASK 44b09fbb02Smatt li %r5,0 45cf88c389Smatt _DOSYSCALL(__sigprocmask14) # assume no error XXX 46b09fbb02Smatt or. %r3,%r6,%r6 47b09fbb02Smatt bnelr 48b09fbb02Smatt li %r3,1 49b09fbb02Smatt blr 50cf88c389SmattEND(__longjmp14) 51