BSD 4_3 release
[unix-history] / usr / src / lib / libc / vax / gen / setjmp.s
index 8fb18b8..b3f3d9a 100644 (file)
@@ -1,4 +1,12 @@
-/*     setjmp.s        4.6     84/11/01        */
+/*
+ * 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
 
 /*
  * C library -- setjmp, longjmp
  * the last call to
  *     setjmp(a)
  * by restoring registers from the stack,
  * 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 <signal.h>
  */
 
 #include "DEFS.h"
 
  */
 
 #include "DEFS.h"
 
-ENTRY(setjmp, 0)
+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
        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, 0)
        movl    8(ap),r0                # return(v)
        movl    4(ap),r1                # fetch buffer
        clrl    r0
        ret
 
 ENTRY(longjmp, 0)
        movl    8(ap),r0                # return(v)
        movl    4(ap),r1                # fetch buffer
-       tstl    (r1)
+       tstl    12(r1)
        beql    botch
 loop:
        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
        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:
        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 <vax/machparam.h>
+#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:
 3:
-       addl2   $8,sp                   # compensate for PSL-PC push
+       chmk    $103                    # the new system call for sigreturn
 4:
 4:
-       pushl   sp                      # old stack pointer
-       pushl   8(r1)                   # old signal mask
-       pushl   12(r1)                  # old onsigstack
-       pushl   sp                      # pointer to sigcontext
-       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:
 botch:
-       pushl   $msgend-msg
-       pushl   $msg
-       pushl   $2
-       calls   $3,_write
+       calls   $0,_longjmperror
        halt
        halt
-
-       .data
-msg:   .ascii  "longjmp botch\n"
-msgend:
-reiins:        rei