Annotation of cci/d/memman/vbit_limit.c, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: #include "definitions"
        !             4: 
        !             5: extern long iob0, iob1, iob2, iob3, ss1;
        !             6: extern long unused, u0p1pt, u0p2pt, scb, savvec4, savvec5, savvec6, savvec7;
        !             7: extern long *p_ptr, ret_adr, exp_par0, exp_par1, exp_par2, exp_par3;
        !             8: extern long savvec3 ,act_par0, act_par1, act_par2, act_par3;
        !             9: extern long Failpc, test_va, Tpsl;
        !            10: 
        !            11: vl_test()
        !            12: {      long *temp;
        !            13: 
        !            14:        if (ss1) writes("** Subtest3 : Limit and translation fault\n");
        !            15:        temp = (long *)0;
        !            16:        asm("mfpr $SBR,_savvec4");
        !            17:        savvec4 |= 0xc0000000;
        !            18:        asm("mtpr _savvec4,$P0BR");     /* Double map P0 into System space */
        !            19:        asm("mfpr $SLR,_savvec4");
        !            20:        asm("mtpr _savvec4,$P0LR");
        !            21: 
        !            22:        /* Set up P1PT  */
        !            23:        temp = &u0p1pt;
        !            24:        *temp = IOB2;           /* 1st PTE in P1 map to IOB2 */
        !            25:        savvec4 = ((long)temp) | SADDR;
        !            26:        asm("mtpr _savvec4,$P1BR");
        !            27:        asm("mtpr $1,$P1LR");
        !            28: 
        !            29:        /* Set up P2PT  */
        !            30:        temp = &u0p2pt;
        !            31:        *temp = IOB3;           /* 1st PTE in P2 map to IOB3 */
        !            32:        savvec4 = ((long)temp) | SADDR;
        !            33:        savvec4 -= (LAST_VPGNO << 2);
        !            34:        asm("mtpr _savvec4, $P2BR");
        !            35:        asm("mtpr $0xffffe, $P2LR");    /* Use only 1 entry */
        !            36: 
        !            37:        asm("mtpr $0,$TBIA");
        !            38:        asm("mtpr $0,$PADC");
        !            39:        asm("mtpr $1,$MME");
        !            40:        asm("jmp  *$0f");               /* Go virtual */
        !            41: asm("0:");
        !            42:        limit_chk();            /* Limit test */
        !            43:        vbit_chk();             /* valid bit test */
        !            44: 
        !            45:        asm("mtpr $0,$MME");    /* back to physical */
        !            46:        asm("mtpr $0,$P0LR");   /* Invalidate P0 space */
        !            47: }
        !            48: 
        !            49: 
        !            50: limit_chk()
        !            51: /* this test will validate that TAHOE will detect any off limit
        !            52:    access to SPT, P0PT, P1PT, P2PT.
        !            53: */
        !            54: { 
        !            55:        long sys_vadr, fault_vadr, pte_ref, fault_type;
        !            56: 
        !            57:        length_chk(SLR, SADDR);                 /* Test on SPT */
        !            58:        length_chk(P0LR, P0ADDR);               /* Test on P0PT */
        !            59:        length_chk(P1LR, P1ADDR);               /* Test on P1PT */
        !            60:        length_chk(P2LR, P2ADDR);               /* Test on P2PT */
        !            61: 
        !            62:        /* Check limit fault on SPT when access P1 space */
        !            63:        asm("mfpr $P1LR,_savvec7");     /* save P1LR */
        !            64:        asm("mtpr $0x1ffff,$P1LR");     /* set P1LR to very large value */
        !            65: 
        !            66:        asm("mfpr $SLR,_savvec4");
        !            67:        sys_vadr = ((savvec4+1) << PGSHIFT) | SADDR;
        !            68:        asm("mfpr $P1BR,_savvec4");
        !            69:        fault_vadr = (((unsigned)(sys_vadr-savvec4) >> 2) << PGSHIFT) | P1ADDR;
        !            70:        pte_ref = TRUE;
        !            71:        fault_type = LENGTH;
        !            72:        lmt_fault(fault_vadr, pte_ref, fault_type);
        !            73: 
        !            74:        /* restore original SLR, P1LR */
        !            75:        asm("mtpr _savvec7,$P1LR");
        !            76: }
        !            77: 
        !            78: length_chk(table, space)
        !            79: long table, space;
        !            80: {      long fault_vadr, pte_ref, fault_type;
        !            81: 
        !            82:        savvec6 = table;
        !            83:        asm("mfpr  _savvec6,_savvec4");         /* Get length of table */
        !            84:        if (table==P2LR) savvec4--;
        !            85:                else savvec4++;
        !            86:        fault_vadr = (savvec4<<PGSHIFT)|space;
        !            87:        fault_type = LENGTH;
        !            88:        pte_ref = FALSE;
        !            89:        lmt_fault(fault_vadr, pte_ref, fault_type);
        !            90: 
        !            91: }
        !            92: 
        !            93: 
        !            94: vbit_chk()
        !            95: /* This test force translation not valid fault on SPT, P0PT,
        !            96:    P1PT, P2PT.
        !            97: */
        !            98: {
        !            99:        long fault_vadr, t_pgno, *pt_base, fault_type, pte_ref;
        !           100:        long saved_p1lr;
        !           101: 
        !           102:        valid_chk(SBR, TEST_PTESYS, SADDR);             /* Test on SPT */
        !           103:        valid_chk(P0BR, TEST_PTEP0, P0ADDR);            /* Test on P0PT */
        !           104:        valid_chk(P1BR, TEST_PTEP1, P1ADDR);            /* Test on P1PT */
        !           105:        valid_chk(P2BR, TEST_PTEP2, P2ADDR);            /* Test on P2PT */
        !           106: 
        !           107:        /* Check translation not valid fault on SPT when access P1 space */
        !           108: 
        !           109:        asm("mfpr $P1LR,_savvec5");     
        !           110:        saved_p1lr = savvec5;                   /* save P1LR */
        !           111:        asm("mtpr $768,$P1LR");         /* Set P1LR to have 768 PTEs which */
        !           112:                                        /* is 3 page long.                 */
        !           113:        /* Virtual addr used to force the fault will need PTE #512 in P1PT */
        !           114:        fault_vadr = (long)((512<<PGSHIFT)|P1ADDR);
        !           115:        /* invalidate PTE in SPT which map 3rd page of P1PT */
        !           116:        asm("mfpr $SBR,_savvec5");
        !           117:        pt_base = (long *)savvec5;
        !           118:        t_pgno = (U0_P1PT) + 2;
        !           119:        pt_base += t_pgno;              /* address of PTE in SPT that  */
        !           120:                                        /* mapped the 3rd page of P1PT */
        !           121:        *pt_base = *pt_base & 0x7fffffff;       /* Turn off valid bit */
        !           122: 
        !           123:        fault_type = VALID;
        !           124:        pte_ref = TRUE;
        !           125:        lmt_fault(fault_vadr, pte_ref, fault_type);
        !           126: 
        !           127:        /* restore original SLR, P1LR */
        !           128:        *pt_base = *pt_base | 0x80000000;       /* Turn on valid bit */
        !           129:        savvec5 = saved_p1lr;
        !           130:        asm("mtpr _savvec5,$P1LR");
        !           131: }
        !           132: 
        !           133: valid_chk(table, test_pte, space)
        !           134: long table, test_pte, space;
        !           135: {      long *pt_base, saved_pte, fault_vadr, pte_ref, fault_type;
        !           136: 
        !           137:        savvec6 = table;
        !           138:        asm("mfpr _savvec6,_savvec5");
        !           139:        pt_base = (long *)savvec5;
        !           140:        pt_base += test_pte;                    /* address of test PTE */
        !           141:        fault_vadr = (test_pte<<PGSHIFT)|space;
        !           142:        saved_pte = *pt_base;                   /* save  original PTE */
        !           143:        /* Turn off valid bit and set access to User,Kernel R/W */
        !           144:        *pt_base = (*pt_base & 0x7ffffff) | PTE_UW;     
        !           145:        fault_type = VALID;
        !           146:        pte_ref = FALSE;
        !           147:        lmt_fault(fault_vadr, pte_ref, fault_type);
        !           148:        *pt_base = saved_pte;                   /* Restore original PTE */
        !           149: }
        !           150: 
        !           151: 
        !           152: /* Force limit and valid fault */
        !           153: 
        !           154: lmt_fault(fault_vadr, pte_ref, fault_type)
        !           155: long fault_vadr, pte_ref, fault_type;
        !           156: {
        !           157:        long saved_vec, *scb_base, lx, *lptr, access;
        !           158: 
        !           159:        scb_base = &scb; 
        !           160:        if (fault_type == LENGTH)
        !           161:                {
        !           162:                scb_base += PROT_VEC;
        !           163: 
        !           164:                /* Make new PTE  : If this logic "mkpte" is taken out */
        !           165:                /* and this test passed that imply TAHOE will generate */
        !           166:                /* limit fault before access prot. and translation not */
        !           167:                /* valid fault.                                         */
        !           168: 
        !           169:                if (pte_ref==FALSE) mkpte(fault_vadr);
        !           170:                }
        !           171:            else scb_base += TRANS_VEC;
        !           172: 
        !           173:        saved_vec = *scb_base;          /* save old protection fault vector */
        !           174:        asm("movab handler1,_savvec4");
        !           175: 
        !           176:        exp_par1 = fault_vadr;          /* Set up expect fault parameters */
        !           177:        test_va = exp_par1;
        !           178:        asm("movpsl _exp_par3");        /* PSL at time of fault */
        !           179:        exp_par3 &= 0xffffffc0;         /* Mask out PSW flags   */
        !           180:        Tpsl = exp_par3;
        !           181:        asm("movab okret,_ret_adr");
        !           182:        for (access = READ; access <= WRITE; access++)
        !           183:                {
        !           184:                /* length ,R/W violation   */
        !           185:                if (fault_type == LENGTH)
        !           186:                        exp_par0 = 1 | (access<<2) | (pte_ref<<1);
        !           187:                    else
        !           188:                        exp_par0 = (access<<2) | (pte_ref<<1);
        !           189:                *scb_base = savvec4;            /* Set new handler */
        !           190:                asm("movl _exp_par1,r0");
        !           191:                if (access==WRITE)
        !           192:                        {
        !           193:                        asm("movab pc_fault1,_exp_par2");   /* PC at fault */
        !           194:                        Failpc = exp_par2;
        !           195:                        asm("pc_fault1:");
        !           196:                        asm("movl $0,(r0)");    /* Try with write access */
        !           197:                        }
        !           198:                    else
        !           199:                        {
        !           200:                        asm("movab pc_fault2,_exp_par2");   /* PC at fault */
        !           201:                        Failpc = exp_par2;
        !           202:                        asm("pc_fault2:");
        !           203:                        asm("movl (r0),r12");   /* Try with read access */
        !           204:                        }
        !           205:                /* Error if program comes to this point */
        !           206:                if (fault_type == LENGTH)
        !           207:                        writes("** Expected limit fault didnot happen\n");
        !           208:                   else
        !           209:                        writes("** Expected translation fault didnot happen\n");
        !           210:                ac_error1();
        !           211:                *scb_base = saved_vec;          /* Restore ILL_ACCESS vector */
        !           212:                asm("halt");
        !           213: asm("okret:");
        !           214:                *scb_base = saved_vec;          /* Restore ILL_ACCESS vector */
        !           215:                if (fault_type == LENGTH)
        !           216:                        chk_fpars("** Page Table Limit exception\n");
        !           217:                     else
        !           218:                        chk_fpars("** Translation not valid exception\n");
        !           219:                }
        !           220: }
        !           221: 
        !           222: mkpte(flt_vadr)
        !           223: long flt_vadr;
        !           224: {      long space, oldpte, pteno, regno;
        !           225: 
        !           226:        space = (flt_vadr >> 30) & 0x3;
        !           227:        pteno = (flt_vadr >> PGSHIFT) & 0xfffff;
        !           228:        if (space==3) regno = SBR;      /* System */
        !           229:        if (space==2) { regno = P2BR;   /* P2     */
        !           230:                        pteno = LAST_VPGNO - 2; }
        !           231:        if (space==1) regno = P1BR;     /* P1 */
        !           232:        if (space==0) regno = P0BR;     /* P0 */
        !           233: 
        !           234:        /* All access, V_BIT on */
        !           235:        fixpv_pte(regno,pteno,&oldpte,PTE_KW | PTE_V);
        !           236:                
        !           237: }
        !           238: 
        !           239: prot_handler()
        !           240: {
        !           241: asm(".align 2");
        !           242: asm("handler1:");
        !           243:        asm("movab _act_par0,_p_ptr");  /* Set pointer to fault parameters */
        !           244:        asm("movl  (sp)+,_act_par0");
        !           245:        asm("movl  (sp)+,_act_par1");
        !           246:        asm("movl  (sp)+,_act_par2");
        !           247:        asm("movl  (sp)+,_act_par3");
        !           248:        asm("jmp *_ret_adr");
        !           249: }
        !           250: 

unix.superglobalmegacorp.com

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