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

1.1     ! root        1: #include "../h/config.h"
        !             2: /*
        !             3:  * suspend suspends from a built-in procedure (a C function).
        !             4:  *  The function calling suspend is suspending and the value to
        !             5:  *  suspend is contained in arg0 of its argument list.  The generator
        !             6:  *  or expression frame immediately containing the frame of the
        !             7:  *  suspending procedure is duplicated.
        !             8:  *
        !             9:  * suspend returns through the duplicated procedure frame and the
        !            10:  *  arg0 descriptor of the suspending function is left on the
        !            11:  *  top of the stack.  When an alternative is needed, efail causes
        !            12:  *  a return through the original procedure frame which was created
        !            13:  *  by the original call to the built-in procedure.
        !            14:  */ 
        !            15: Global(_boundary)      /* Icon/C boundary address */
        !            16: Global(_file)          /* Current file name */
        !            17: Global(_k_level)       /* Value of &level */
        !            18: Global(_line)          /* Current line number */
        !            19: 
        !            20: Global(_suspend)
        !            21: #ifdef VAX
        !            22: _suspend:
        !            23: /*
        !            24:  * Construct the generator frame
        !            25:  */
        !            26:        Mask    0x0fc0          # Start new generator frame by saving
        !            27:                                #  registers upon entry to suspend.
        !            28:        movl    _boundary,r6    # Establish new boundary value and
        !            29:        pushl   r6              #  save it in the new generator frame.
        !            30:        movl    sp,gfp          # Point gfp at boundary word in new frame
        !            31:        pushl   _k_level        # Push &level,
        !            32:        pushl   _line           #  line number,
        !            33:        pushl   _file           #   and file name to complete the frame.
        !            34: /*
        !            35:  * Determine region to be duplicated and copy it.  This is just
        !            36:  *  like it's done in psusp.
        !            37:  */
        !            38:        movl    12(fp),r7       # Low word of region to copy is the
        !            39:                                #  low word of procedure frame of suspending
        !            40:                                #  procedure.
        !            41:        movl    8(fp),r2        # Get ap of suspending procedure in r2
        !            42:        movl    -8(r2),r4       # Get gfp from procedure frame of suspending
        !            43:                                #  procedure.
        !            44:        bneq    f1              # If it is zero,
        !            45:        movl    -4(r2),r4       #  get saved efp and
        !            46:        subl2   $8,r4           #  use efp - 8.
        !            47:        jmp     f2
        !            48: f1:                            # gfp is not zero,
        !            49:        subl2   $12,r4          #  use gfp - 12.
        !            50: 
        !            51: /*
        !            52:  * Copy region to be duplicated to top of stack.
        !            53:  */
        !            54:                                # r7 points at the low word of the region
        !            55:                                #  to be copied.  r4 points at the high end
        !            56:                                #  of the region.  (i.e. r4 is the first
        !            57:                                #  word not_ to copy.)
        !            58: f2:
        !            59:        subl2   r7,r4           # r4 = r4 - r7, giving r4 number of bytes
        !            60:                                #  in region.
        !            61:        subl2   r4,sp           # Move stack pointer down to make space
        !            62:                                #  for region.
        !            63:        movc3   r4,(r7),(sp)    # Copy the region by moving r4 bytes starting
        !            64:                                #  at r7 to the top of the stack.
        !            65: /*
        !            66:  * Return from suspending function; resumption will return from suspend.
        !            67:  */
        !            68:        subl3   12(fp),8(fp),r0 # Calculate distance between fp and ap
        !            69:                                #  in suspender's frame, specifically,
        !            70:                                #  r0 = ap - fp
        !            71:        addl2   sp,r0           # sp points at the first word of the
        !            72:                                #  duplicated procedure frame on the
        !            73:                                #  stack.  By adding it to r0, r0 points
        !            74:                                #  at nwords word in argument list of
        !            75:                                #  duplicated frame.  That is, r0 is
        !            76:                                #  serving as a pseudo ap.
        !            77:        subl2   $8,r0           # Point r0 at location of saved gfp
        !            78:                                #  in duplicated frame.
        !            79:        movl    gfp,(r0)        # Replace saved gfp with new gfp value
        !            80: 
        !            81:        movl    sp,fp           # Point fp at duplicated procedure frame
        !            82:                                #  in preparation for return through it.
        !            83:        clrl    _boundary       # Clear the boundary since control is
        !            84:                                #  going back into Icon code.
        !            85:        ret                     # Return through duplicated frame.  This
        !            86:                                #  looks like a return from the original
        !            87:                                #  call to the built-in function.
        !            88: 
        !            89: #endif VAX
        !            90: 
        !            91: #ifdef PORT
        !            92: DummyFcn(_suspend)
        !            93: #endif PORT
        !            94: 
        !            95: #ifdef PDP11
        !            96: / suspend - Suspend from a (C) function.
        !            97: / Duplicates the most recent generator frame outside the
        !            98: / current boundary.  Suspend does not return directly.
        !            99: / The caller is reactivated when an alternative is needed;
        !           100: / the return actually comes from efail.
        !           101: 
        !           102: / Register usage:
        !           103: /   r0:    pointer to top of stack region to be copied,
        !           104: /           which is just above the procedure descriptor (arg0) of the
        !           105: /           suspending procedure
        !           106: /   r2:    suspending procedure frame pointer
        !           107: /   r3:    new generator frame pointer
        !           108: /   r4:           old generator frame pointer, indexed down to r0 during copy
        !           109: /   r5:    current procedure frame pointer
        !           110: 
        !           111: _suspend:
        !           112:        mov     r5,-(sp)        / create new procedure frame
        !           113:        mov     sp,r5
        !           114:        mov     r4,-(sp)        / save registers
        !           115:        mov     r3,-(sp)
        !           116:        mov     r2,-(sp)
        !           117:        mov     _boundary,r2    / r2 <- pointer to suspending procedure frame
        !           118:        mov     r2,-(sp)        / save Icon/C boundary address
        !           119: 
        !           120: / Calculate addresses of new generator frame.
        !           121: 
        !           122:        mov     sp,r3           / r3 <- pointer to new generator frame
        !           123:        mov     _k_level,-(sp)  / save &level
        !           124:        mov     _line,-(sp)     / save current line number
        !           125:        mov     _file,-(sp)     /   and file name
        !           126:        mov     4(r2),r0        / r0 <- pointer to top of region to be copied
        !           127:        asl     r0              /       (= r2 + 10 + 4*nargs)
        !           128:        asl     r0
        !           129:        add     r2,r0
        !           130:        add     $10.,r0
        !           131:        mov     -4(r2),r4       / r4 <- generator frame pointer from caller
        !           132:        bne     1f              /   use saved r3 (gfp) - 6 if non-zero,
        !           133:        mov     -2(r2),r4       /   else use saved r4 (efp) - 4
        !           134:        cmp     -(r4),-(r4)
        !           135:        br      2f
        !           136: 1:
        !           137:        sub     $6,r4
        !           138:        br      2f
        !           139: 
        !           140: / Copy surrounding expression frame.
        !           141: 
        !           142: 1:
        !           143:        mov     -(r4),-(sp)
        !           144: 2:
        !           145:        cmp     r4,r0           / stop at end of frame
        !           146:        bhi     1b
        !           147: 
        !           148: / Copy return value of suspending function.
        !           149: 
        !           150:        mov     -(r4),-(sp)
        !           151:        mov     -(r4),-(sp)
        !           152: 
        !           153: / Return from suspending function; reactivation will return from suspend.
        !           154: 
        !           155:        mov     2(r2),r1        / r1 <- return pc
        !           156:        mov     (r2),r5         / restore old registers
        !           157:        mov     -(r2),r4
        !           158:        tst     -(r2)           /   except generator frame pointer
        !           159:        mov     -(r2),r2
        !           160:        clr     _boundary       / returning to Icon code
        !           161:        jmp     (r1)            / this really suspends
        !           162: #endif PDP11

unix.superglobalmegacorp.com

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