Annotation of 43BSD/contrib/icon/rt/fail.s, revision 1.1

1.1     ! root        1: #include "../h/config.h"
        !             2: /*
        !             3:  * fail returns from a C function with failure.  The boundary points
        !             4:  *  to the frame of the C function initially called so the stack
        !             5:  *  is cleared back to there.  Then, that frame itself is popped
        !             6:  *  (being sure to restore registers), and efail does the actual
        !             7:  *  failure.
        !             8:  */
        !             9: 
        !            10: Global(_efail)         /* Handle failure of expression */
        !            11: Global(_boundary)      /* Icon/C boundary address */
        !            12: Global(_fail)
        !            13: 
        !            14: #ifdef VAX
        !            15: _fail:
        !            16:        Mask    0               # Don't need to save anything because
        !            17:                                #  the frame is about to be thrown away.
        !            18:        movl    _boundary,fp    # Pop the stack back to the frame pointed
        !            19:                                #  at by the boundary.
        !            20:        clrl    _boundary       # The net result of this routine is to
        !            21:                                #  get back into an Icon environment, so
        !            22:                                #  the boundary is cleared.
        !            23:                                #
        !            24:                                # The registers in the procedure frame now
        !            25:                                #  on the top of the stack need to be
        !            26:                                #  restored.  A mask is made in r0 and the
        !            27:                                #  appropriate registers are restored using
        !            28:                                #  a popr.
        !            29:        ashl    $-16,4(fp),r0   # Shift mask field of psw stack word into
        !            30:                                #  the low order 16 bits of r0.
        !            31:        bicl2   $0xf000,r0      # Only bits 0:11 are good, turn off the
        !            32:                                #  others.
        !            33:        movab   20(fp),sp       # 20(fp) is the start of the saved registers,
        !            34:                                #  point the sp at the first one.
        !            35:        popr    r0              # Pop the registers indicated by r0
        !            36:        movl    8(fp),ap        # Get old ap
        !            37:        movl    12(fp),fp       #  and fp from procedure frame.  This
        !            38:                                #  removes all traces of the C routine
        !            39:                                #  from the stack.
        !            40:        jmp     _efail          # From here, it's just like expression
        !            41:                                #  failure, so let efail do it.
        !            42: 
        !            43: #endif VAX
        !            44: 
        !            45: #ifdef PORT
        !            46: DummyFcn(_fail)
        !            47: #endif PORT
        !            48: 
        !            49: #ifdef PDP11
        !            50: 
        !            51: / fail - return from a (C) function with failure.
        !            52: / Exit to the current boundary, and branch to efail.
        !            53: 
        !            54: Global(cret)           / return from C calling sequence
        !            55: _fail:
        !            56:        mov     _boundary,r5    / pop all procedure frames to Icon/C boundary
        !            57:        clr     _boundary
        !            58:        mov     r5,r2           / then exit that procedure frame
        !            59:        mov     -(r2),r4
        !            60:        mov     -(r2),r3
        !            61:        mov     -(r2),r2
        !            62:        mov     r5,sp
        !            63:        mov     (sp)+,r5
        !            64:        jmp     _efail
        !            65: #endif PDP11

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.