|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifdef LIBC_SCCS ! 8: .asciz "@(#)setjmp.s 5.5 (Berkeley) 3/9/86" ! 9: #endif LIBC_SCCS ! 10: ! 11: /* ! 12: * C library -- setjmp, longjmp ! 13: * ! 14: * longjmp(a,v) ! 15: * will generate a "return(v)" from ! 16: * the last call to ! 17: * setjmp(a) ! 18: * by restoring registers from the stack, ! 19: * and a struct sigcontext, see <signal.h> ! 20: */ ! 21: ! 22: #include "DEFS.h" ! 23: ! 24: ENTRY(setjmp, R6) ! 25: movl 4(ap),r6 # construct sigcontext ! 26: subl2 $8,sp # space for current struct sigstack ! 27: pushl sp # get current values ! 28: pushl $0 # no new values ! 29: calls $3,_sigstack # pop args plus signal stack value ! 30: movl (sp)+,(r6)+ # save onsigstack status of caller ! 31: pushl $0 ! 32: calls $1,_sigblock # get signal mask ! 33: movl r0,(r6)+ # save signal mask of caller ! 34: movl (ap),r0 ! 35: moval 4(ap)[r0],(r6)+ # save sp of caller ! 36: movl 12(fp),(r6)+ # save frame pointer of caller ! 37: movl 8(fp),(r6)+ # save argument pointer of caller ! 38: movl 16(fp),(r6)+ # save pc of caller ! 39: movpsl (r6) # save psl of caller ! 40: movw 4(fp),(r6) ! 41: clrl r0 ! 42: ret ! 43: ! 44: ENTRY(longjmp, 0) ! 45: movl 8(ap),r0 # return(v) ! 46: movl 4(ap),r1 # fetch buffer ! 47: tstl 12(r1) ! 48: beql botch ! 49: loop: ! 50: cmpl 12(r1),fp # are we there yet? ! 51: beql done ! 52: blssu botch ! 53: moval 20(fp),r2 ! 54: blbc 6(fp),1f # was r0 saved? ! 55: movl r0,(r2)+ ! 56: 1: ! 57: bbc $1,6(fp),2f # was r1 saved? ! 58: movl r1,(r2) ! 59: 2: ! 60: movl $loop,16(fp) ! 61: ret # pop another frame ! 62: ! 63: done: ! 64: ! 65: #ifndef NOCOMPAT ! 66: /* ! 67: * This code checks to see if it can use the new sigreturn. ! 68: * If it finds that sigtramp is using the new system call, ! 69: * it will also use it. Otherwise it uses the old system call ! 70: * to preserve compatibility. ! 71: */ ! 72: #include <vax/machparam.h> ! 73: #define U (0x80000000-UPAGES*NBPG) ! 74: #define PCB_SIGC 0x6c ! 75: #define CHMKINS 7 ! 76: cmpl 3f,U+PCB_SIGC+CHMKINS # check to see how sigtramp returns ! 77: beql 4f # sigtramp uses the new system call ! 78: pushl r1 # must use the old signal return ! 79: chmk $139 # restore previous context ! 80: jmp *20(r1) # done, return ! 81: 3: ! 82: chmk $103 # the new system call for sigreturn ! 83: 4: ! 84: #endif NOCOMPAT ! 85: ! 86: pushl r1 # pointer to sigcontext ! 87: calls $1,_sigreturn # restore previous context ! 88: # we should never return ! 89: botch: ! 90: calls $0,_longjmperror ! 91: halt
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.