Annotation of cci/d/event/vksnv_evt.s, revision 1.1.1.1

1.1       root        1: 
                      2:  #
                      3:  #     Kernel stack not valid event test. 
                      4:  #     This test is entered in Kernel mode, running virtual on ISP.
                      5:  #     The test then REI to USER which will execute a KCALL with an
                      6:  #     invalid Kernel stack. Kernel stack not valid fault is expected
                      7:  #     to occure.
                      8:  #
                      9:  #     R0 = error code
                     10:  #          1 - Did not generate Kernel stack not valid when executing
                     11:  #              Kcall with a invalid KSP
                     12:  #              R1 = KSP after Kcall exception,  R2 = P2BR,  R3 = P2LR
                     13:  #          2 - Too many parameters pushed on ISP
                     14:  #              R1 = ISP after KSP not valid exception
                     15:  #          3 - ISP is not correct after KSP not valid exception
                     16:  #              R1 = actual,  R2 = expected
                     17:  #          4 - Current PSL is not correct after KSP not valid exception
                     18:  #              R1 = actual,  R2 = expected
                     19:  #          5 - PC pushed on ISP is not correct after KSP not valid exception
                     20:  #              R1 = actual,  R2 = expected
                     21:  #          6 - PSL pushed on ISP is not correct after KSP not valid exception
                     22:  #              R1 = actual,  R2 = expected
                     23:  #
                     24:        .set   LAST_VPGNO,0xfffff       /* Last virtual page no         */
                     25:        .set   TST_PTEP2,LAST_VPGNO
                     26:        .set   P2ADDR,0x80000000
                     27:        .set   EXP_UPSL,0x01000000      /* User mode, IPL = 0 */
                     28: 
                     29:        .globl  _ksnv_evt               
                     30: _ksnv_evt:
                     31:        .word   0x1fff                  /* Save r0-r12                  */
                     32: 
                     33:        mtpr    $0x1f,$IPL
                     34:        movl    $1,tst_cnt
                     35: 
                     36:  #     Set up P2PT :   2 entries
                     37:  #     PTE 0  : Physical page 254, PTE_V off, Kernel R/W
                     38:  #     PTE 1  : Physical page 255, PTE_V off, Kernel R/W
                     39:  #
                     40:        movab   _u0p2pt,r10             /* System virtual addr of P2PT  */
                     41:        orl3    $254,$PG_KW,(r10)       /* PTE 0 : Kernel write, V bit off */
                     42:        orl3    $255,$PG_KW,4(r10)      /* PTE 1 : Kernel write, V bit off */
                     43:        subl3   $((LAST_VPGNO - 1) << 2),r10,r11
                     44:                                        /* Virtual address of P2BR */
                     45: 
                     46:  #     Set up P0PT
                     47:  #     virtual page 0 = physical page of routine _uxtest
                     48:  #
                     49:        clrl    r2
                     50:        andl3   $_uxtest,$0x3fffffff,r1
                     51:        andl3   $0x000003ff,r1,r7       /* R7 : offset to 1st instruction */
                     52:        shrl    $PGSHIFT,r1,r1          /* Page no. of _uxtest          */
                     53:        andl3   $_eutest+NBPG-1,$0x3fffffff,r3
                     54:        shrl    $PGSHIFT,r3,r3          /* Last page no. of _uxtest     */
                     55: 1:     orl3    $PG_V|PG_URKW,r1,_u0p0pt[r2]
                     56:        incl    r2
                     57:        aoblss  r3,r1,1b
                     58: 
                     59:        movl    $_pcb0,r1               /* Initialize PCB slightly      */
                     60:        movl    $((LAST_VPGNO<<PGSHIFT)|0x8|P2ADDR),PCB_KSP(r1) 
                     61:                                        /* Set up KSP   */
                     62:        movl    r7,PCB_PC(r1)           /* Set PCB_PC */
                     63:        movl    $EXP_UPSL,PCB_PSL(r1)   /* Set PCB_PSL : User   */
                     64:        movab   _u0p0pt,PCB_P0BR(r1)    /* Set PCB_P0BR */
                     65:        movl    $2,PCB_P0LR(r1)         /* Set PCB_P0LR : 2 PTEs */
                     66:        movl    r11,PCB_P2BR(r1)        /* Set PCB_P2BR */
                     67:        movl    $0xffffd,PCB_P2LR(r1)   /* Two PTE for P2PT     */
                     68:        andl2   $0x3fffffff,r1
                     69:        mtpr    r1,$PCBB                /* Init PCBB                    */
                     70: 
                     71:                                        /* Set expected parameters      */
                     72:        movab   fpc0,exp_pc             /* expected PC pushed on ISP */
                     73:        movpsl  r1
                     74:        andl3   $0xfbfffff0,r1,exp_psl  /* Exp. PSL pushed on ISP : IS off */
                     75:        movl    $0x41f0000,exp_cpsl     /* Expected PSL after fault : */
                     76:                                /* Mode : Kernel, IS : on, IPL => 0x1f.  */
                     77:                                /* the rest are screwed up on Kstack not */
                     78:                                /* valid exception ! */
                     79:        movl    $-1,-(sp)               /* Set marker for ISP           */
                     80:        movab   (sp),r8
                     81:        subl3   $0x8,r8,exp_isp         /* Expected ISP after fault     */
                     82: 
                     83:        movl    fp,sfp                  /* Save FP */
                     84: more:  movl    _scb+SYSVEC,_savvec0    /* Save current syscall vector  */
                     85:        movl    _scb+KSPVEC,_savvec1
                     86:        movab   _u0ret,_scb+SYSVEC      /* New vector for KCALL         */
                     87:        movab   _ksnotvalid,_scb+KSPVEC /* New vector for Kstack not valid */   
                     88:        mtpr    $0,$TBIA        
                     89: fpc0:  ldpctx                  /* Save ISP, Switch context to user, should */
                     90:                                /* Cause Kstack not valid fault !!      */
                     91:        rei
                     92:        halt
                     93: #
                     94: #
                     95: /*     KCALL handler           */
                     96:        .align  2
                     97: _u0ret:                
                     98:                /* Error -- did not receive kernel stack not valid      */
                     99:                /* fault during KCALL which try to push 3 parameters on */
                    100:                /* an invalid Kernel stack.                             */
                    101:        mtpr    $HIGH,$IPL
                    102:        movl    _savvec0,_scb+SYSVEC    /* Restore original vectors     */
                    103:        movl    _savvec1,_scb+KSPVEC
                    104:        movl    $1,r0
                    105:        movab   (sp),r1                 /* Kernel stack pointer         */
                    106:        mfpr    $P2BR,r2                /* P2 page table base           */
                    107:        mfpr    $P2LR,r3                /* P2 page table base           */
                    108:        jmp     *badrtn
                    109: 
                    110: 
                    111: /*     Kernel stack not valid event handler; serviced on ISP   */
                    112:        .align  2               
                    113: _ksnotvalid:
                    114:        movl    _savvec1,_scb+KSPVEC    /* Restore original vectors     */
                    115:        movl    _savvec0,_scb+SYSVEC
                    116: 
                    117:        movab   (sp),r1                 /* actual ISP */
                    118:        addl3   $8,r1,r7
                    119:        cmpl    $-1,(r7)                /* Check marker on ISP */
                    120:        jeql    1f
                    121:        movl    $2,r0
                    122:        jmp     *badrtn                 /* Too many params. pushed on ISP */
                    123: 1:
                    124:        movl    exp_isp,r2
                    125:        cmpl    r1,r2                   /* Make sure ISP is correct     */
                    126:        beql    0f
                    127:        movl    $3,r0
                    128:        jmp     *badrtn
                    129: 
                    130: 0:     movpsl  r1                      /* Check  current PSL           */
                    131:        andl2   $0xfffffff0,r1
                    132:        movl    exp_cpsl,r2             /* Expected PSL after fault     */
                    133:        cmpl    r1,r2
                    134:        beql    1f
                    135:        movl    $4,r0           /* Error code = 2                       */
                    136:        jmp     *badrtn         /* PSL not right after kernel stack not */
                    137:                                /* valid fault; r1 = actual; r2 = expected */
                    138: 1:
                    139:        movl    exp_pc,r2       /* Get expected PC                      */
                    140:        movl    (sp),r1         /* Pop actual PC from ISP               */
                    141:        cmpl    r1,r2
                    142:        beql    1f
                    143:        movl    $5,r0           /* Error : incorrect PC on ISP          */
                    144:        jmp     *badrtn         /* Error code r0 = 3                    */
                    145: 1:             
                    146:        movl    4(sp),r1        /* Pop actual PSL on ISP                */
                    147:        andl3   $0xffffffff0,4(sp),r1   
                    148:        movl    exp_psl,r2      /* R2 : expected PSL    */
                    149:        cmpl    r1,r2
                    150:        beql    1f
                    151:        movl    $6,r0           /* Error : incorrect PSL                */
                    152:        jmp     *badrtn         /* Error code r0 = 4                    */
                    153: 1:
                    154:        andl3   $_kc_flt,$0x3ff,exp_pc  /* Set expected PC */
                    155:        movl    $0x41d0000,exp_cpsl     /* IPL should raised to 0x1d    */
                    156:        movl    $EXP_UPSL,exp_psl       /* Expected PSL pushed on ISP */
                    157: 
                    158:        movab   _u0p2pt,r10             /* System virtual addr of P2PT  */
                    159:        orl2    $0x80000000,4(r10)      /* Set V_bit of PTE1 On */
                    160:        movl    $0,r0
                    161:        mtpr    $1,$TBIA
                    162: endt:  
                    163:        movl    (sp)+,r12       /* Pop PC, PSL out of ISP */
                    164:        movl    (sp)+,r12
                    165:        decl    tst_cnt         /* decrement test count */
                    166:        blss    0f              /* branch if less than 0 */
                    167:        movab   _u0ret,_scb+SYSVEC      /* New vector for KCALL         */
                    168:        movab   _ksnotvalid,_scb+KSPVEC /* New vector for Kstack not valid */   
                    169:        jmp     fpc0            /* restart LDPCTX : Should be O.K */
                    170: 0:
                    171:        movl    (sp)+,r0        /* Pop marker off ISP */
                    172:        movl    sfp,fp          /* Restore FP */
                    173:        ret                     /* Done !! return to monitor            */
                    174: #
                    175: #
                    176: #
                    177:        .globl  _uxtest
                    178: _uxtest:
                    179:        clrl    r0
                    180: _kc_flt:
                    181:        kcall   $DONE   /* KCALL should cause Kernel stack not valid fault */
                    182:                        /* when try to push the 3rd paramater on Kstack    */
                    183: _eutest:       
                    184:        halt
                    185: 
                    186:        .align  2
                    187: exp_pc:
                    188:        .long   0
                    189: exp_psl:
                    190:        .long   0
                    191: exp_cpsl:
                    192:        .long   0               /* Expected current PSL */
                    193: exp_isp:
                    194:        .long   0       /* expected ISP while in Kstack not valid handler */
                    195: sfp:
                    196:        .long   0               /* saved FP */
                    197: tst_cnt:
                    198:        .long   0

unix.superglobalmegacorp.com

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