X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/df02a9f3bd2e363d51a4e3fee137fb06ef730647..95f51977ddc18faa2e212f30c00a39540b39f325:/usr/src/lib/libc/vax/gen/setjmp.s diff --git a/usr/src/lib/libc/vax/gen/setjmp.s b/usr/src/lib/libc/vax/gen/setjmp.s index 7f1c4ad3e5..b3f3d9a2ec 100644 --- a/usr/src/lib/libc/vax/gen/setjmp.s +++ b/usr/src/lib/libc/vax/gen/setjmp.s @@ -1,4 +1,12 @@ -/* setjmp.s 4.4 83/07/02 */ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + */ + +#ifdef LIBC_SCCS + .asciz "@(#)setjmp.s 5.5 (Berkeley) 3/9/86" +#endif LIBC_SCCS /* * C library -- setjmp, longjmp @@ -8,74 +16,76 @@ * the last call to * setjmp(a) * by restoring registers from the stack, - * previous signal mask, and doing a return. - * - * BUG: always restores onsigstack state to 0 + * and a struct sigcontext, see */ #include "DEFS.h" -ENTRY(setjmp) +ENTRY(setjmp, R6) + movl 4(ap),r6 # construct sigcontext + subl2 $8,sp # space for current struct sigstack + pushl sp # get current values + pushl $0 # no new values + calls $3,_sigstack # pop args plus signal stack value + movl (sp)+,(r6)+ # save onsigstack status of caller pushl $0 calls $1,_sigblock # get signal mask - movl r0,r1 - movl 4(ap),r0 - movl 12(fp),(r0) # save frame pointer of caller - movl 16(fp),4(r0) # save pc of caller - movl r1,8(r0) # save signal mask - clrl 12(r0) # XXX (should be onsigstack) XXX + movl r0,(r6)+ # save signal mask of caller + movl (ap),r0 + moval 4(ap)[r0],(r6)+ # save sp of caller + movl 12(fp),(r6)+ # save frame pointer of caller + movl 8(fp),(r6)+ # save argument pointer of caller + movl 16(fp),(r6)+ # save pc of caller + movpsl (r6) # save psl of caller + movw 4(fp),(r6) clrl r0 ret -ENTRY(longjmp) +ENTRY(longjmp, 0) movl 8(ap),r0 # return(v) movl 4(ap),r1 # fetch buffer - tstl (r1) + tstl 12(r1) beql botch loop: - bitw $1,6(fp) # r0 saved? - beql 1f - movl r0,20(fp) - bitw $2,6(fp) # was r1 saved? - beql 2f - movl r1,24(fp) - brb 2f -1: - bitw $2,6(fp) # was r1 saved? - beql 2f - movl r1,20(fp) -2: - cmpl (r1),12(fp) + cmpl 12(r1),fp # are we there yet? beql done blssu botch + moval 20(fp),r2 + blbc 6(fp),1f # was r0 saved? + movl r0,(r2)+ +1: + bbc $1,6(fp),2f # was r1 saved? + movl r1,(r2) +2: movl $loop,16(fp) ret # pop another frame done: - cmpb *16(fp),reiins # returning to an "rei"? - bneq 1f - movab 3f,16(fp) # do return w/ psl-pc pop - brw 2f -1: - movab 4f,16(fp) # do standard return -2: - ret # unwind stack before signals enabled + +#ifndef NOCOMPAT +/* + * This code checks to see if it can use the new sigreturn. + * If it finds that sigtramp is using the new system call, + * it will also use it. Otherwise it uses the old system call + * to preserve compatibility. + */ +#include +#define U (0x80000000-UPAGES*NBPG) +#define PCB_SIGC 0x6c +#define CHMKINS 7 + cmpl 3f,U+PCB_SIGC+CHMKINS # check to see how sigtramp returns + beql 4f # sigtramp uses the new system call + pushl r1 # must use the old signal return + chmk $139 # restore previous context + jmp *20(r1) # done, return 3: - addl2 $8,sp # compensate for PSL-PC push + chmk $103 # the new system call for sigreturn 4: - pushl 8(r1) # old signal mask - pushl 12(r1) # old onsigstack - chmk $139 # restore previous signal context - jmp *4(r1) # done, return.... +#endif NOCOMPAT + pushl r1 # pointer to sigcontext + calls $1,_sigreturn # restore previous context + # we should never return botch: - pushl $msgend-msg - pushl $msg - pushl $2 - calls $3,_write + calls $0,_longjmperror halt - - .data -msg: .ascii "longjmp botch\n" -msgend: -reiins: rei