Annotation of 43BSD/contrib/icon/rt/fail.s, revision 1.1.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.