Annotation of cci/d/event/vkcall_evt.s, revision 1.1

1.1     ! root        1: 
        !             2: #
        !             3: #      *kernel call event test (virtual)
        !             4: #      *Try KCALL 3 times with different operand specifiers
        !             5: #
        !             6: #      R3 = which KCALL is testing (1,2,3)
        !             7: #      R0 = error code
        !             8: #           1 - Error in KSP after Kcall
        !             9: #               R1 = actual KSP,  R2 = expected KSP
        !            10: #           2 - Error in Kcall parameter pushed on the stack
        !            11: #               R1 = actual,  R2 = expected
        !            12: #           3 - Error in PC pushed on the stack
        !            13: #               R1 = actual,  R2 = expected
        !            14: #           4 - Error in PSL pushed on the stack
        !            15: #               R1 = actual,  R2 = expected
        !            16: #
        !            17:        .globl  _kcall_evt              
        !            18: _kcall_evt:
        !            19:        .word   0x1fff                  
        !            20: 
        !            21:        mtpr    $1,$TBIA                /* Purge Translation buffer */
        !            22:        clrl    loopcnt                 /* Try Kcall 3 times */
        !            23: #
        !            24: #      Set up user P2PT :
        !            25: #                                      
        !            26:        movl    $241,r1                 
        !            27:        movl    _unused,r2              
        !            28:        movl    $255,r3                 
        !            29: 1:
        !            30:        orl3    $(PG_V|PG_UW),r2,_u0p2pt[r1]    
        !            31:        incl    r2
        !            32:        aobleq  r3,r1,1b
        !            33: 
        !            34:        movl    $255,r2
        !            35:        andl2   $0x7fffffff,_u0p2pt[r2]   
        !            36:                                          
        !            37:        movl    $250,r2
        !            38:        andl2   $0x7fffffff,_u0p2pt[r2]   
        !            39:        decl    r2
        !            40:        andl2   $0x7fffffff,_u0p2pt[r2]   
        !            41:        movl    $244,r2
        !            42:        andl2   $0x7fffffff,_u0p2pt[r2]   
        !            43: #
        !            44: #      Set up User P0PT : Virtual page 0 to N are mapped
        !            45: #      to physical pages that contain User code. PTEs are
        !            46: #      set to valid, User/Kernel read.
        !            47: #
        !            48:        clrl    r2                      
        !            49:        andl3   $_utest,$0x3fffffff,r1  /* R1 = First addr of User code */
        !            50:        andl3   $0x000003ff,r1,r7       
        !            51:        shrl    $PGSHIFT,r1,r1          /* R1 = First page no of User code */
        !            52:        movl    $_eutest+NBPG-1,r3      /* R3 = Last VA of user code */
        !            53:        andl2   $0x3fffffff,r3
        !            54:        shrl    $PGSHIFT,r3,r3          /* R3 = Last page no of User code */
        !            55: 1:
        !            56:        orl3    $(PG_V|PG_UW),r1,_u0p0pt[r2]    /* Valid, User/Kernel write */
        !            57:        incl    r2                      /* Next page */
        !            58:        aobleq  r3,r1,1b
        !            59: 
        !            60:        movab   _pcb0,r1                /* Initialize PCB #0 */
        !            61:        movl    $0xbfffe3fc,PCB_KSP(r1)
        !            62:        movl    $0xbfffe3fc,exp_ksp
        !            63:        movl    $0xbffffbfc,PCB_USP(r1)
        !            64:        movl    r7,PCB_PC(r1)
        !            65:        movl    $0x01000000,PCB_PSL(r1) /* PCB_PSL : User mode, IPL 0 */
        !            66:        movl    $0x01000000,exp_upsl    /* Set expected PSL */
        !            67:        movl    $_u0p0pt,PCB_P0BR(r1)
        !            68:        movl    $_u0p1pt,PCB_P1BR(r1)
        !            69:        movl    $0xbfc03400,PCB_P2BR(r1)
        !            70:        movl    $3,PCB_P0LR(r1)
        !            71:        movl    $8,PCB_P1LR(r1)
        !            72:        movl    $0x000ffff0,PCB_P2LR(r1)
        !            73: 
        !            74:        movl    _scb+SYSVEC,_savvec0    /* Save original Kcall handler */
        !            75:        movab   _u0ret,_scb+SYSVEC      /* Set new Kcall handler */     
        !            76:        andl2   $0x3fffffff,r1
        !            77:        mtpr    r1,$PCBB                /* Set PCBB */
        !            78:        mtpr    $1,$TBIA                /* Purge translation buffer */
        !            79:        mtpr    $1,$PADC                /* Purge data cache */
        !            80:        movl    r13,_savvec1            /* Saved original FP */                 
        !            81: 
        !            82:        ldpctx                          /* Load user context */                 
        !            83:        rei                             /* Switch to user */
        !            84: #
        !            85: #      Kcall Handler : service on Kernel stack
        !            86: #
        !            87:        .align  2
        !            88: _u0ret:
        !            89:        mtpr    $HIGH,$IPL
        !            90:        mtpr    $1,$PADC        /* Purge data cache */
        !            91: 
        !            92:        movab   (sp),r1         /* R1 = current KSP */
        !            93:        subl3   $0xc,exp_ksp,r2 /* R2 = Expected KSP after Kcall exception */   
        !            94:        cmpl    r1,r2
        !            95:        beql    1f
        !            96:        movl    $1,r0                   
        !            97:        addl3   $1,loopcnt,r3
        !            98:        jmp     *badrtn         /* Error : too many parameters pushed on KSP */
        !            99: 1:
        !           100:        movl    (sp)+,r1        /* R1 = Parameter of Kcall */
        !           101:        movl    $DONE,r2
        !           102:        cmpl    r1,r2           /* Check Kcall parameter pushed on KSP */
        !           103:        beql    1f
        !           104:        movl    $2,r0           /* R0 = Which part is failed */ 
        !           105:        addl3   $1,loopcnt,r3
        !           106:        jmp     *badrtn         /* Error : did not receive correct parameter */
        !           107: 1:                                     
        !           108:        movl    exp_upc,r2      /* R2 = expected PC */
        !           109:        movl    (sp),r1         /* R1 = actual PC pushed */
        !           110:        cmpl    r1,r2           /* Check PC pushed on the KSP */
        !           111:        beql    1f
        !           112:        movl    $3,r0                   
        !           113:        addl3   $1,loopcnt,r3
        !           114:        jmp     *badrtn
        !           115: 1:
        !           116:        movl    exp_upsl,r2     /* R2 = expected PSL */
        !           117:        andl3   $0xfffffff0,4(sp),r1    /* R1 = actual PSL pushed */
        !           118:        cmpl    r1,r2           /* Check PSL pushed on the KSP */
        !           119:        beql    1f
        !           120:        movl    $4,r0                   
        !           121:        addl3   $1,loopcnt,r3
        !           122:        jmp     *badrtn
        !           123: 1:
        !           124:        incl    loopcnt         /* Increment counter */
        !           125:        cmpl    $3,loopcnt
        !           126:        jeql    endkct          /* If equal then end of test */
        !           127:        rei                     /* else REI back to user code */
        !           128: endkct:
        !           129:        movl    _savvec0,_scb+SYSVEC    /* Restore original Kcall handler */
        !           130:        svpctx                          /* Switch back to ISP */
        !           131:        movl    _savvec1,r13            /* Restore original FP */               
        !           132:        ret
        !           133: #
        !           134: #      ******************************************
        !           135: #      _utest = test to be mapped in user 0 space
        !           136: #      ******************************************
        !           137: #
        !           138:        .globl  _utest
        !           139: _utest:
        !           140:        movab   _kc1,exp_upc            /* expected PC after Kcall */
        !           141: _kpc1:
        !           142:        kcall   $DONE                   /* Literal */
        !           143: _kc1:
        !           144:        movab   _kc2,exp_upc            /* expected PC after Kcall */
        !           145:        movw    $DONE,r5
        !           146: _kpc2:
        !           147:        kcall   r5                      /* Register */          
        !           148: _kc2:
        !           149:        movab   _eutest,exp_upc         /* expected PC after Kcall */
        !           150:        movw    $DONE,kcpar
        !           151: _kpc3:
        !           152:        kcall   kcpar                   /* memory */            
        !           153: _eutest:
        !           154:        halt                    
        !           155: #
        !           156: #      Data area
        !           157: #
        !           158:        .align  2
        !           159: loopcnt:
        !           160:        .long   0               /* Try Kcall 3 times */         
        !           161: exp_upc:
        !           162:        .long   0               /* Expected PC after Kcall */
        !           163: exp_upsl:
        !           164:        .long   0               /* Expected PSL after Kcall */
        !           165: exp_ksp:
        !           166:        .long   0
        !           167: kcpar:
        !           168:        .long   0

unix.superglobalmegacorp.com

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