1*dfb9c876Sross/* $NetBSD: _setjmp.S,v 1.2 2006/07/05 18:06:47 ross Exp $ */ 2d48f1466Sross 3d48f1466Sross#include <machine/asm.h> 4d48f1466Sross 5d48f1466Sross#if defined(LIBC_SCCS) 6d48f1466Sross .text 7*dfb9c876Sross .asciz "$NetBSD: _setjmp.S,v 1.2 2006/07/05 18:06:47 ross Exp $" 8d48f1466Sross#endif 9d48f1466Sross 10d48f1466Sross/* 11d48f1466Sross * C library -- _setjmp, _longjmp 12d48f1466Sross * 13d48f1466Sross * _longjmp(a,v) 14d48f1466Sross * will generate a "return(v?v:1)" from the last call to 15d48f1466Sross * _setjmp(a) 16d48f1466Sross * by restoring registers from the stack. 17d48f1466Sross * The previous signal state is NOT restored. 18d48f1466Sross */ 19d48f1466Sross 20d48f1466SrossENTRY(_setjmp) 21d48f1466Sross mflr %r11 /* save return address */ 22d48f1466Sross mfcr %r12 /* save condition register */ 23d48f1466Sross mr %r10,%r1 /* save stack pointer */ 24d48f1466Sross mr %r9,%r2 /* save GPR2 (not needed) */ 25*dfb9c876Sross i = 0 26*dfb9c876Sross .rept 32-9 27*dfb9c876Sross std 9+i,i*8+16(%r3) 28*dfb9c876Sross i = i + 1 29*dfb9c876Sross .endr 30d48f1466Sross li %r3,0 /* indicate success */ 31d48f1466Sross blr /* return */ 32d48f1466Sross 33d48f1466SrossENTRY(_longjmp) 34*dfb9c876Sross i = 0 35*dfb9c876Sross .rept 32-9 36*dfb9c876Sross ld 9+i,i*8+16(%r3) 37*dfb9c876Sross i = i + 1 38*dfb9c876Sross .endr 39d48f1466Sross mtlr %r11 /* restore LR */ 40d48f1466Sross mtcr %r12 /* restore CR */ 41d48f1466Sross mr %r2,%r9 /* restore GPR2 (not needed) */ 42d48f1466Sross mr %r1,%r10 /* restore stack */ 43d48f1466Sross or. %r3,%r4,%r4 /* get return value */ 44d48f1466Sross bnelr /* return if not 0 */ 45d48f1466Sross li %r3,1 /* what's the point? */ 46d48f1466Sross blr /* return */ 47