Annotation of cci/d/memman/ac_prot.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include "definitions"
                      3: 
                      4: extern long iob0, iob1, iob2, iob3, ss1;
                      5: extern long unused, u0p1pt, u0p2pt, scb, savvec4, savvec5, savvec6, savvec7;
                      6: extern long *p_ptr, exp_par0, exp_par1, exp_par2, exp_par3;
                      7: 
                      8: long Failpc, test_va, Tpsl;
                      9: 
                     10: /*  This test will test access protections on PTE in TAHOE memory
                     11:     management scheme.
                     12:     The main loop of the test running in USER space, KERNEL privilege.
                     13: */
                     14: 
                     15: protect()
                     16: {      long *temp, pg_no, pte, saved_pte, pte_sys, pte_p0, pte_p1, pte_p2;
                     17: 
                     18:        if (ss1) writes("** Subtest2 : Access protection fault\n");
                     19:        pg_no = 0;
                     20:        asm("mfpr $SBR,_savvec4");
                     21:        savvec4 |= 0xc0000000;
                     22:        asm("mtpr _savvec4,$P0BR");     /* Double map P0 into System space */
                     23:        asm("mfpr $SLR,_savvec4");
                     24:        asm("mtpr _savvec4,$P0LR");
                     25: 
                     26:        asm("mtpr $3,$DCK");
                     27:        asm("mtpr $0,$TBIA");
                     28:        asm("mtpr $0,$PADC");
                     29:        asm("mtpr $1,$MME");
                     30:        asm("jmp  *$0f");               /* Go virtual */
                     31: asm("0:");
                     32: 
                     33:        /* Set up SPT   */
                     34:        pg_no = TEST_PTESYS;            /* Map 1st unused PTE to */
                     35:        pte = IOB0;                     /* physical page iob0 (22) */
                     36:        fixpfn_pte(SBR,pg_no, &pte_sys, pte);
                     37: 
                     38:        /* Set up P0PT  */
                     39:        pg_no = TEST_PTEP0;             /* Map PTE. 60 in P0PT  */
                     40:        pte = IOB1;                     /* physical page iob1 (23) */
                     41:        fixpfn_pte(P0BR,pg_no, &pte_p0, pte);
                     42: 
                     43:        /* Set up P1PT  */
                     44:        temp = &u0p1pt;                 /* Map PTE. 0 in P1PT   */
                     45:        *temp = IOB2;                   /* physical page iob2 (24)  */
                     46:        savvec4 = ((long)temp) | SADDR;
                     47:        asm("mtpr _savvec4,$P1BR");
                     48:        asm("mtpr $1,$P1LR");
                     49: 
                     50:        /* Set up P2PT  */
                     51:        temp = &u0p2pt;                 /* Map PTE. 0 in P2PT   */
                     52:        *temp = IOB3;                   /* physical page iob3 (25) */
                     53:        savvec4 = ((long)temp) | SADDR;
                     54:        savvec4 -= (LAST_VPGNO << 2);
                     55:        asm("mtpr _savvec4, $P2BR");
                     56:        asm("mtpr $0xffffe, $P2LR");    /* Use only 1 entry */
                     57: 
                     58:        /* Map test area to allow USER to execute code */
                     59:        asm("movab rd_access,_savvec4");
                     60:        pg_no = (savvec4 >> PGSHIFT) & 0xfffff;
                     61:        fixpv_pte(SBR, pg_no, &saved_pte, PTE_UW | PTE_V);
                     62:        fixpv_pte(SBR, pg_no+1, &saved_pte, PTE_UW | PTE_V);
                     63: 
                     64:        prot();                         /* Do test .. */
                     65: 
                     66:        fixpv_pte(SBR, pg_no, &saved_pte, PTE_KW | PTE_V);
                     67:        fixpv_pte(SBR, pg_no+1, &saved_pte, PTE_KW | PTE_V);
                     68: 
                     69:        /* Restore original PTEs */
                     70:        pg_no = TEST_PTESYS;
                     71:        pte = IOB0;
                     72:        fixpfn_pte(SBR,pg_no, &pte_sys, pte_sys&0x3fffff);
                     73:        pg_no = TEST_PTEP0;
                     74:        pte = IOB1;
                     75:        fixpfn_pte(P0BR,pg_no, &pte_p0, pte_p0&0x3fffff);
                     76:        pg_no = TEST_PTEP1;
                     77:        pte = IOB2;
                     78:        fixpfn_pte(P1BR,pg_no, &pte_p1, pte_p1&0x3fffff);
                     79:        pg_no = TEST_PTEP2;
                     80:        pte = IOB3;
                     81:        fixpfn_pte(P2BR,pg_no, &pte_p2, pte_p2&0x3fffff);
                     82: 
                     83:        asm("mtpr $0,$MME");            /* Back to physical */
                     84:        asm("mtpr $0,$P0LR");           /* Invalidate P0BR */
                     85: }
                     86: 
                     87: prot()
                     88: {      long access_md, privilege, exp_int;
                     89: 
                     90: 
                     91:        /*      PTE : No Access         */
                     92:        access_md = PTE_NOACC | PTE_V;
                     93:        /* Try all privileges with R/W access on all tables */
                     94:        exp_int = TRUE;
                     95:        for(privilege=USER; privilege>=KERNEL; privilege--)
                     96:                chmaps_prot(access_md,privilege,"rw",exp_int);
                     97: 
                     98:        /*      PTE : Kernel Read       */
                     99:        access_md = PTE_KR | PTE_V;
                    100:        chmaps_prot(access_md,USER,"rw",exp_int);
                    101:        chmaps_prot(access_md,KERNEL,"w",exp_int);
                    102:        exp_int = FALSE;
                    103:        chmaps_prot(access_md,KERNEL,"r",exp_int);
                    104: 
                    105:        /*      PTE : Kernel Write      */
                    106:        access_md = PTE_KW | PTE_V;
                    107:        exp_int = TRUE;
                    108:        chmaps_prot(access_md,USER,"rw",exp_int);
                    109:        exp_int = FALSE;
                    110:        chmaps_prot(access_md,0,"rw",exp_int);
                    111: 
                    112: 
                    113:        /*      PTE : User Read/Kernel Read     */
                    114:        access_md = PTE_URKR | PTE_V;
                    115:        exp_int = TRUE;
                    116:        chmaps_prot(access_md,USER,"w",exp_int);
                    117:        chmaps_prot(access_md,KERNEL,"w",exp_int);
                    118:        exp_int = FALSE;
                    119:        chmaps_prot(access_md,USER,"r",exp_int);
                    120:        chmaps_prot(access_md,KERNEL,"r",exp_int);
                    121: 
                    122: 
                    123:        /*      PTE : User Read/ Kernel Read/Write      */
                    124:        access_md = PTE_URKW | PTE_V;
                    125:        exp_int = TRUE;
                    126:        chmaps_prot(access_md,USER,"w",exp_int);
                    127:        exp_int = FALSE;
                    128:        chmaps_prot(access_md,USER,"r",exp_int);
                    129:        chmaps_prot(access_md,KERNEL,"rw",exp_int);
                    130: 
                    131:        /*      PTE : User Read/Write/ Kernel Read/Write        */
                    132:        access_md = PTE_UW | PTE_V;
                    133:        exp_int = FALSE;
                    134:        for(privilege=USER; privilege>=KERNEL; privilege--)
                    135:                chmaps_prot(access_md,privilege,"rw",exp_int);
                    136: 
                    137: }
                    138: 
                    139: char *spc_str;
                    140: 
                    141: chmaps_prot(access_md,priv,run_access,exp_int)
                    142: long access_md, priv, exp_int;
                    143: char *run_access;
                    144: {      long pg_table, pte_no, space;
                    145: 
                    146:        for (pg_table=SBR; pg_table<=P2BR; pg_table += 2)
                    147:                {
                    148:                if (pg_table == SBR) {
                    149:                          pte_no = TEST_PTESYS;
                    150:                          space = SADDR; }
                    151:                if (pg_table == P0BR) {
                    152:                          pte_no = TEST_PTEP0;
                    153:                          space = P0ADDR;  }
                    154:                if (pg_table == P1BR) {
                    155:                          pte_no = TEST_PTEP1;
                    156:                          space = P1ADDR; }
                    157:                if (pg_table == P2BR) {
                    158:                          pte_no = TEST_PTEP2;
                    159:                          space = P2ADDR; }
                    160:           force_flt(pg_table,pte_no,access_md,priv,run_access,space,exp_int);
                    161:                }
                    162: }
                    163: 
                    164: /* This routine forces protection faults with read and write access
                    165:    to page table specified by tbl_no . The access bits of this PTE 
                    166:    is set to value of pte_access, the process that access this PTE 
                    167:    is running in the mode specified by rum_mode.
                    168:        tbl_no     : (0,1,2,3) corresponding to P0PT, P1PT, P2PT, SPT.
                    169:        which_pte  : PTE to be accessed
                    170:        pte_access : valid and protection bits to be set on PTE
                    171:        access     : "r", "rw", "w"/ "R", "RW", "W"
                    172:        run_mode   : privilege of process when access PTE
                    173: */
                    174: 
                    175: force_flt(tbl_no, which_pte, pte_access, run_mode, access, addr_space, exp_int)
                    176: long tbl_no, which_pte, pte_access, run_mode, addr_space, exp_int;
                    177: char *access;
                    178: {
                    179:        long *st_base, saved_vec1,saved_vec2,saved_pte,test_adr,tflag;
                    180:        long ix, handler_adr;
                    181:        char *acc_str, *pmode_str;
                    182: 
                    183:        /* Set protection bits of target PTE */
                    184:        fixpv_pte(tbl_no,which_pte,&saved_pte,pte_access);
                    185: 
                    186:        /* Get virtual address of test location */ 
                    187:        test_adr = (which_pte<<PGSHIFT)|addr_space;
                    188:        
                    189:        for(ix=0;ix<2;ix++)
                    190:            {
                    191:                 if (access[ix]==NULL) break;
                    192:                 /* Set handler of protection fault */
                    193:                 if (exp_int==TRUE)
                    194:                         asm("movab pro_flt1,_savvec4");
                    195:                     else 
                    196:                         asm("movab pro_flt2,_savvec4");
                    197:                 handler_adr = savvec4;
                    198:                 set_handler(PROT_VEC,&saved_vec1,handler_adr);  
                    199:         
                    200:                 /* Set handler for DATA ALIGNMENT FAULT */
                    201:                 asm("movab chmk_hd,_savvec4");
                    202:                 handler_adr = savvec4;
                    203:                 set_handler(ALIGN_FLT,&saved_vec2,handler_adr);
                    204: 
                    205:                 /* Set expected parameter words */
                    206:                 exp_par1 = exp_par2 = exp_par3 = 0;
                    207:                 exp_par1 = test_adr;
                    208:                 if ((access[ix]=='r') || (access[ix]=='R'))
                    209:                        {  /* protection violation, read access */
                    210:                        asm("movab rd_access,_exp_par2");  /* Expected PC */
                    211:                        exp_par0 = 0;
                    212:                        } 
                    213:                   else
                    214:                        {  /* protection violation, write access */
                    215:                        asm("movab wr_access,_exp_par2");  
                    216:                        exp_par0 = 4;
                    217:                        }
                    218: 
                    219:                asm("mtpr $0xbfffb3fc,$USP");   /* Set up user stack */
                    220:                asm("movab (sp),_savvec5");
                    221:                savvec5 -= 40;          /* KSP is 10 longword after ISP */
                    222:                asm("mtpr _savvec5,$KSP");
                    223: 
                    224:                /* set up to change privilege */
                    225:                exp_par3 =  run_mode << 24;
                    226:                Tpsl = exp_par3;                /* PSL when force fault */
                    227:                Failpc = exp_par2;              /* PC to force fault */
                    228:                asm("pushl _exp_par3");
                    229:                asm("pushl _exp_par2"); /* Push PSL, PC on current stack */
                    230: 
                    231:                /* Change mode */
                    232:                test_va = savvec5 = test_adr;
                    233:                asm("movl _savvec5,r0");
                    234: 
                    235:                /*      Enable false            */
                    236:                asm("mtpr $64,$DCR");
                    237:                asm("rei");                     /* Go : Amem ... */
                    238:                asm("halt");                    /* REI fails ... */
                    239: 
                    240: asm("rtn0_p0:");
                    241:                asm("movl r0,_savvec5");  /* flag indicate where return from */
                    242:                tflag = savvec5;
                    243:                st_base = &scb;
                    244: 
                    245:                /* Restore Prot_fault, ALIGN_FLT vectors */
                    246:                *(st_base + PROT_VEC) = saved_vec1;     
                    247:                *(st_base + ALIGN_FLT) = saved_vec2;    
                    248: 
                    249:                if (tflag && exp_int)
                    250:                        { /* Error : expected event did not happen */
                    251:                        writes("** Expected protection fault didnot occured\n");
                    252:                        ac_error1();
                    253:                        asm("halt");
                    254:                        }
                    255: 
                    256:                /* check fault parameters pushed on stack */
                    257:                if ((exp_int==TRUE)&&(tflag==FALSE)) chk_fpars("");
                    258:            }
                    259: 
                    260:        /* Restore tested PTE's */
                    261:        savvec5 = tbl_no;
                    262:        asm("mfpr _savvec5,_savvec6");
                    263:        st_base = (long *)savvec6;
                    264:        st_base += which_pte;
                    265:        *st_base = saved_pte;
                    266: }
                    267: 
                    268: 
                    269: /* Handler of protection fault exception.      */
                    270: ptfx_handler()
                    271: {
                    272: asm(".align 2");
                    273: asm("pro_flt1:");      /* EXPECTED INTERRUPT */
                    274: 
                    275:        asm("mtpr $0x1f,$IPL");
                    276:        asm("movab (sp),_savvec5");             /* set pointer to parameters */
                    277:        p_ptr = (long *)savvec5;
                    278:        asm("svpctx");                          /* switch back to ISP */
                    279:        asm("clrl r0");
                    280:        asm("jmp  rtn0_p0");                    /* return to test */
                    281: 
                    282: asm(".align 2");
                    283: asm("pro_flt2:");      /* UNEXPECTED INTERRUPT */
                    284:        asm("mtpr $0x1f,$IPL");
                    285:        asm("movab (sp),_savvec5");             /* set pointer to parameters */
                    286:        asm("movl fp,_saved_fp");               /* save fp */
                    287:        asm("movab (sp),fp");   /* set new frame pointer for next CALLS */
                    288:        p_ptr = (long *)savvec5;
                    289: 
                    290:        writes("** Unexpected protection fault\n");
                    291:        ac_error1();
                    292:        prt_par("** Parameters : ",p_ptr); /* print fault parameters */
                    293:        asm("svpctx");                          /* switch back to ISP */
                    294:        asm("clrl r0");
                    295:        asm("movl _saved_fp,fp");               /* restore fp */
                    296:        asm("halt");
                    297:        asm("jmp  rtn0_p0");                    /* return to test */
                    298: }
                    299: 
                    300: chmk_handler()
                    301: {
                    302: asm(".align 2");
                    303: asm("chmk_hd:");       /* Come here by causing a data not align fault */
                    304:                                                /* return to test */
                    305:        asm("mtpr $0x1f,$IPL");                 /* Set IPL to HIGH */
                    306:        asm("svpctx");                          /* switch back to ISP */
                    307:        asm("movl $1,r0");      /* set flag to indicate return from here */
                    308:        asm("jmp  rtn0_p0");
                    309: }
                    310: 
                    311: TEST_AREA()
                    312: {
                    313: 
                    314: asm("rd_access:");
                    315:        asm("movl (r0),r12");  /* should cause protection fault exception !! */
                    316: 
                    317:        /* Get back KERNEL privilege by causing a data not align fault */
                    318:        asm("movl align_f,r10");
                    319:        asm("halt");                    /* otherwise HALT .... */
                    320: 
                    321: asm("wr_access:");
                    322:        asm("movl $1,(r0)");  /* should cause protection fault exception !! */
                    323: 
                    324:        /* Get back KERNEL privilege by causing a data not align fault */
                    325:        asm("movl align_f,r10");
                    326:        asm("halt");              /* otherwise HALT .... */
                    327:        asm(".align 1");                /* Word align   */
                    328:        asm("align_f:");
                    329:        asm(".long 0");
                    330: }
                    331: 
                    332: /* Print fault parameters of memory management exceptions */
                    333: prt_par(str,par)
                    334: char *str;
                    335: long *par;
                    336: {
                    337:        writes(str);
                    338:        writeh(*par++); writes("   ");
                    339:        writeh(*par++); writes("   ");
                    340:        writeh(*par++); writes("   ");
                    341:        writeh(*par); writec('\n');
                    342: }
                    343: 
                    344: /* This routine assumes that global pointer p_ptr points to the actual
                    345:    parameters pushed on the stack, and exp_par0 is the 1 of the expected
                    346:    parameters.
                    347: */
                    348: chk_fpars(msg)
                    349: char *msg;
                    350: {      long *pars, *e_pars;
                    351:        long act_param0, act_param1, act_param2, act_param3;
                    352: 
                    353:        e_pars = &exp_par0;             /* pointer to expected parameters */
                    354:        pars = p_ptr;                   /* pointer to actual parameters */
                    355:        act_param0 = *pars++;
                    356:        act_param1 = *pars++;
                    357:        act_param2 = *pars++;
                    358:        act_param3 = (*pars) & 0xffffffc0;  /* Mask out PSW flags */
                    359:        if ((exp_par0 != act_param0) || (exp_par1 != act_param1) ||
                    360:                (exp_par2 != act_param2) || (exp_par3 != act_param3)) {
                    361:                writes(msg);
                    362:                writes("** Error in fault paramters\n");
                    363:                ac_error1();
                    364:                prt_par("** Expected  : ",&exp_par0);
                    365:                prt_par("** Actual    : ",p_ptr);
                    366:                asm("halt");
                    367:                }
                    368: }
                    369: 
                    370: ac_error1()
                    371: {
                    372:        writes("** PC   : "); writeh(Failpc); writec('\n');
                    373:        writes("** VA   : "); writeh(test_va); writec('\n');
                    374:        writes("** PSL  : "); writeh(Tpsl); writec('\n');
                    375:        prt_base(test_va);
                    376: }
                    377: 

unix.superglobalmegacorp.com

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