Annotation of cci/d/event/vksnv_evt.s, revision 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.