|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that this notice is preserved and that due credit is given ! 7: * to the University of California at Berkeley. The name of the University ! 8: * may not be used to endorse or promote products derived from this ! 9: * software without specific written prior permission. This software ! 10: * is provided ``as is'' without express or implied warranty. ! 11: */ ! 12: ! 13: #if defined(SYSLIBC_SCCS) && !defined(lint) ! 14: _sccsid:.asciz "@(#)setjmp.s 5.7 (Berkeley) 5/25/88" ! 15: #endif /* SYSLIBC_SCCS and not lint */ ! 16: ! 17: /* ! 18: * C library -- setjmp, longjmp ! 19: * ! 20: * longjmp(a,v) ! 21: * will generate a "return(v)" from ! 22: * the last call to ! 23: * setjmp(a) ! 24: * by restoring registers from the stack, ! 25: * and a struct sigcontext, see <signal.h> ! 26: */ ! 27: ! 28: #include "DEFS.h" ! 29: ! 30: ENTRY(setjmp, R6) ! 31: movl 4(ap),r6 # construct sigcontext ! 32: subl2 $8,sp # space for current struct sigstack ! 33: pushl sp # get current values ! 34: pushl $0 # no new values ! 35: calls $3,_sigstack # pop args plus signal stack value ! 36: movl (sp)+,(r6)+ # save onsigstack status of caller ! 37: pushl $0 ! 38: calls $1,_sigblock # get signal mask ! 39: movl r0,(r6)+ # save signal mask of caller ! 40: movl (ap),r0 ! 41: moval 4(ap)[r0],(r6)+ # save sp of caller ! 42: movl 12(fp),(r6)+ # save frame pointer of caller ! 43: movl 8(fp),(r6)+ # save argument pointer of caller ! 44: movl 16(fp),(r6)+ # save pc of caller ! 45: movpsl (r6) # save psl of caller ! 46: movw 4(fp),(r6) ! 47: clrl r0 ! 48: ret ! 49: ! 50: ENTRY(longjmp, 0) ! 51: movl 8(ap),r0 # return(v) ! 52: movl 4(ap),r1 # fetch buffer ! 53: tstl 12(r1) ! 54: beql botch ! 55: loop: ! 56: cmpl 12(r1),fp # are we there yet? ! 57: beql done ! 58: blssu botch ! 59: moval 20(fp),r2 ! 60: blbc 6(fp),1f # was r0 saved? ! 61: movl r0,(r2)+ ! 62: 1: ! 63: bbc $1,6(fp),2f # was r1 saved? ! 64: movl r1,(r2) ! 65: 2: ! 66: movl $loop,16(fp) ! 67: ret # pop another frame ! 68: ! 69: done: ! 70: pushl r1 # pointer to sigcontext ! 71: calls $1,_sigreturn # restore previous context ! 72: # we should never return ! 73: botch: ! 74: calls $0,_longjmperror ! 75: halt
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.