121431Sdist/* 2*61225Sbostic * Copyright (c) 1983, 1993 3*61225Sbostic * The Regents of the University of California. All rights reserved. 434480Sbostic * 542637Sbostic * %sccs.include.redist.c% 621431Sdist */ 713419Sroot 834819Sbostic#if defined(LIBC_SCCS) && !defined(lint) 9*61225Sbostic .asciz "@(#)setjmp.s 8.1 (Berkeley) 06/04/93" 1034819Sbostic#endif /* LIBC_SCCS and not lint */ 1121431Sdist 1213419Sroot/* 1313419Sroot * C library -- setjmp, longjmp 1413419Sroot * 1513419Sroot * longjmp(a,v) 1613419Sroot * will generate a "return(v)" from 1713419Sroot * the last call to 1813419Sroot * setjmp(a) 1913419Sroot * by restoring registers from the stack, 2018292Smckusick * and a struct sigcontext, see <signal.h> 2113419Sroot */ 2213419Sroot 2313419Sroot#include "DEFS.h" 2413419Sroot 2518715SmckusickENTRY(setjmp, R6) 2618715Smckusick movl 4(ap),r6 # construct sigcontext 2718292Smckusick subl2 $8,sp # space for current struct sigstack 2818292Smckusick pushl sp # get current values 2918292Smckusick pushl $0 # no new values 3018292Smckusick calls $3,_sigstack # pop args plus signal stack value 3124300Smckusick movl (sp)+,(r6)+ # save onsigstack status of caller 3213419Sroot pushl $0 3313419Sroot calls $1,_sigblock # get signal mask 3418715Smckusick movl r0,(r6)+ # save signal mask of caller 3518292Smckusick movl (ap),r0 3618715Smckusick moval 4(ap)[r0],(r6)+ # save sp of caller 3718715Smckusick movl 12(fp),(r6)+ # save frame pointer of caller 3818715Smckusick movl 8(fp),(r6)+ # save argument pointer of caller 3918715Smckusick movl 16(fp),(r6)+ # save pc of caller 4018715Smckusick movpsl (r6) # save psl of caller 4118715Smckusick movw 4(fp),(r6) 4213419Sroot clrl r0 4313419Sroot ret 4413419Sroot 4517329SsamENTRY(longjmp, 0) 4613419Sroot movl 8(ap),r0 # return(v) 4713419Sroot movl 4(ap),r1 # fetch buffer 4818292Smckusick tstl 12(r1) 4913419Sroot beql botch 5013419Srootloop: 5118292Smckusick cmpl 12(r1),fp # are we there yet? 5218292Smckusick beql done 5318292Smckusick blssu botch 5418292Smckusick moval 20(fp),r2 5518292Smckusick blbc 6(fp),1f # was r0 saved? 5618292Smckusick movl r0,(r2)+ 5713419Sroot1: 5818292Smckusick bbc $1,6(fp),2f # was r1 saved? 5918292Smckusick movl r1,(r2) 6013419Sroot2: 6113419Sroot movl $loop,16(fp) 6213419Sroot ret # pop another frame 6313419Sroot 6413419Srootdone: 6518292Smckusick pushl r1 # pointer to sigcontext 6618292Smckusick calls $1,_sigreturn # restore previous context 6718292Smckusick # we should never return 6813419Srootbotch: 6925784Smckusick calls $0,_longjmperror 7013419Sroot halt 71