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

1.1     ! root        1: 
        !             2: #include "definitions"
        !             3: 
        !             4: /*     testing virtual read/write in physical mode
        !             5:        1st unused PTE in SPT is mapped to physical page iob3 (25)
        !             6:        1st PTE in P0PT is mapped to physical page iob0 (22)
        !             7:        1st PTE in P1PT is mapped to physical page iob1 (23)
        !             8:        1st PTE in P2PT is mapped to physical page iob2 (24)
        !             9: */     
        !            10: 
        !            11: extern long u0p0pt, u0p1pt, u0p2pt, ss1;
        !            12: extern long unused, iob0, iob1, iob2, iob3, Sysmap;
        !            13: extern long savvec4, savvec5, savvec6;
        !            14: char *msg1, *msg2;
        !            15: long Phys_adr, Fail_pc;
        !            16: 
        !            17: vtest()
        !            18: {
        !            19:        if (ss1)
        !            20:                writes("** Subtest1 : diagnostic virtual read/write\n");
        !            21:        Fail_pc = 0;
        !            22:        fix_maps();                     /* set up SBR,P0PT,P1PT,P2PT */
        !            23: 
        !            24:        /* Try to read/write to memory in virtual
        !            25:           mode by using the diagostic intruction
        !            26:        */
        !            27:        test1_sgl();                    /* read/write at single location */
        !            28:        test1_pg();                     /* read/write on whole page      */
        !            29:        asm("mfpr $SBR,_savvec4");      /* Set up maps to go virtual */
        !            30:        savvec4 |= 0xc0000000;
        !            31:        asm("mtpr _savvec4,$P0BR");     /* Double map P0 in System space */
        !            32:        asm("mfpr $SLR,_savvec4");      
        !            33:        asm("mtpr _savvec4,$P0LR");
        !            34:        asm("mtpr $0,$TBIA");           /* Purge all translation buffer */
        !            35:        asm("mtpr $1,$MME");            /* Enable MME */
        !            36:        asm("jmp  *$0f");               /* Go !! */
        !            37: asm("0:");
        !            38:        /* Now program is running running virtual 
        !            39:           in P0 space, Kernel privilege
        !            40:        */
        !            41:        vt1_pg();                       /* read/write on whole page */
        !            42:        asm("mtpr $0,$MME");            /* Back to physical */
        !            43:        asm("mtpr $0,$P0LR");           /* invalidate P0BR */
        !            44: }
        !            45: 
        !            46: 
        !            47: /* Test using diagnostic instruction to do virtual read from 1st location
        !            48:    and virtual write to last location in test pages of System, P0, P1, P2
        !            49:    space. Program is running in PHYSICAL mode.
        !            50: */
        !            51: test1_sgl()
        !            52: {
        !            53:        t1s_sys();      /* test SPT */
        !            54:        t1s_usr();      /* test P0PT, P1PT, P2PT */
        !            55: }
        !            56: 
        !            57: 
        !            58: /* Test using diagnostic instruction to do virtual read/write a page
        !            59:    in System, P0, P1, P2 space. Program is running in PHYSICAL mode.
        !            60: */
        !            61: test1_pg()
        !            62: {      long loc, *lptr, vaddr;
        !            63: 
        !            64:        asm("mtpr $0,$TBIA");           /* Invalidate translation buffers */
        !            65:        asm("mtpr $0,$PADC");           /* Purge data cache */
        !            66: 
        !            67:        /* 1st unused virtual page (Set by init.x) in system space
        !            68:           is mapped to physical page of _iob3.
        !            69:        */
        !            70:        lptr = &unused;                 /* 1st unused virtual page no. */
        !            71:        loc = ((*lptr)<<PGSHIFT)|SADDR;
        !            72:        t1p_diag(&iob3,loc);            /* test in system space    */
        !            73: 
        !            74:        vaddr = 0|P0ADDR;
        !            75:        t1p_diag(&iob0, vaddr);         /* test P0 space */
        !            76: 
        !            77:        vaddr = 0|P1ADDR;
        !            78:        t1p_diag(&iob1, vaddr);         /* test P1 space */
        !            79: 
        !            80:        loc = LAST_VPGNO << PGSHIFT;
        !            81:        vaddr = loc | P2ADDR;
        !            82:        t1p_diag(&iob2, vaddr);         /* test P2 space */
        !            83: }
        !            84: 
        !            85: /* This routine runs in virtual mode and try to read/write to a
        !            86:    page in System, P0, P1, P2 space.
        !            87:        System : 1st unused virtual page is mapped to the physical
        !            88:                 page of _iob3.
        !            89:        P0     : Has the same map as system. 1st virtual page is
        !            90:                 mapped to physical page of _iob0.
        !            91:        P1     : 1st virtual page is mapped the physical page of
        !            92:                 _iob1.
        !            93:        P2     : Last virtual page is mapped the physical page of
        !            94:                 _iob2.
        !            95: */
        !            96: vt1_pg()
        !            97: {
        !            98:        vt1_page(SBR,&iob3);            /* test in system space */
        !            99:        vt1_page(P0BR,&iob0);           /* test in P0 space */
        !           100:        vt1_page(P1BR,&iob1);           /* test in P1 space */
        !           101:        vt1_page(P2BR,&iob2);           /* test in P2 space */
        !           102: }
        !           103: 
        !           104: 
        !           105: /* This routine runs in virtual mode and read/write to a page.
        !           106:        Input : page = physical address of 1st longword of the page
        !           107:                       that mapped to the test (virtual) page.
        !           108:                space= Space the virtual page is in.
        !           109:    READ test : This routine first disable MME to initialize the test
        !           110:    page with value from 0 to 1023 in physical mode and then turn on
        !           111:    MME to read back virtually and check against the value 0 - 1023.
        !           112: 
        !           113:    WRITE test : The same page used in Read test is cleared in physical
        !           114:    mode. The test then turn on MME and write to the test page with 
        !           115:    value 0 -1023 and disable MME, read back the contents of the page
        !           116:    in physical mode and compare to 0-1023.
        !           117: */
        !           118: vt1_page(space, page)
        !           119: long space, page;
        !           120: {      long *lptr, pte, page_no, v_adr, old_pte, vaddr, access;
        !           121:        int ix;
        !           122: 
        !           123:        /* initialize test page with value 0-1023 */
        !           124:        page_no = arithsr(((unsigned)(page & 0x3fffffff)));
        !           125:        asm("mtpr $0,$MME");            /* Disable MME */
        !           126:        write_pg(0,page_no,0,1);
        !           127:        asm("mtpr $1,$MME");            /* Enable MME */
        !           128:        asm("mtpr $0,$PADC");           /* Purge all data cache */
        !           129: 
        !           130:        v_adr = 0;
        !           131:        if (space==SBR) {
        !           132:                    lptr = &unused;
        !           133:                    v_adr = ((*lptr)<<PGSHIFT) & 0x3ffffc00;
        !           134:                    vaddr = v_adr | SADDR;
        !           135:                }
        !           136:        if (space==P0BR) {
        !           137:                    /* Map 1st PTE in P0BR <or SBR> to iob0 */
        !           138:                    pte = arithsr(((unsigned)&iob0)) & 0xfffff;
        !           139:                    fixpfn_pte(SBR,0,&old_pte,pte);
        !           140:                    access = PTE_V | PTE_UW;
        !           141:                    fixpv_pte(SBR,0,&old_pte, access);
        !           142:                    vaddr = v_adr | P0ADDR;
        !           143:                }
        !           144:        if (space==P1BR) vaddr = v_adr | P1ADDR;
        !           145:        if (space==P2BR) {
        !           146:                    v_adr = LAST_VPGNO << PGSHIFT;
        !           147:                    vaddr = v_adr | P2ADDR;
        !           148:                }
        !           149:        vt1_read(vaddr,page);   /* This routine read virtual and compare */
        !           150: 
        !           151:        asm("mtpr $0,$MME");            /* Disable MME */
        !           152:        write_pg(0,page_no,0,0);        /* Clear test page */
        !           153:        asm("mtpr $1,$MME");            /* Enable MME */
        !           154: 
        !           155:        if (space==SBR) vt1_write(v_adr|SADDR, &iob3);
        !           156:        if (space==P0BR) {
        !           157:                vt1_write(v_adr|P0ADDR, &iob0);
        !           158:                fixpfn_pte(SBR,0,&old_pte,0);
        !           159:                fixpv_pte(SBR,0,&old_pte, PTE_V | PTE_KW);
        !           160:                }
        !           161:        if (space==P1BR) vt1_write(v_adr|P1ADDR, &iob1);
        !           162:        if (space==P2BR) vt1_write(v_adr|P2ADDR, &iob2);
        !           163: 
        !           164:        page_no = page_no;
        !           165:        asm("mtpr $0,$MME");            /* Disable MME */
        !           166:        write_pg(0,page_no,0,0);        /* Clear test page */
        !           167:        asm("mtpr $1,$MME");            /* Enable MME */
        !           168: }
        !           169: 
        !           170: 
        !           171: /* This routine runs virtual in user space ,kernel mode. It reads 
        !           172:    the contents of the test virtual page and compare to values 
        !           173:    0-1023.
        !           174:        Input : v_adr = 1st virtual address of test page
        !           175:                physadr = 1st physical address of test page
        !           176: */
        !           177: vt1_read(v_adr,physadr)
        !           178: long v_adr, physadr;
        !           179: {      long *lptr, ix, act_data;
        !           180:        register long *r12, r11;
        !           181: 
        !           182:        msg1 = "\n** fail when read whole page virtually ..\n";
        !           183:        msg2 = "";
        !           184:        asm("movab _Fpcr,_Fail_pc");
        !           185:        Phys_adr = physadr;
        !           186: 
        !           187:        lptr = (long *)v_adr;           /* 1st virtual address */
        !           188:        asm("mtpr $1,$PADC");           /* Purge all data cache */
        !           189:        for (ix=0; ix<NBPG; ix += 4)  {
        !           190:                Phys_adr += ix;         /* Phys. address of loc. to be read */
        !           191:                r12 = lptr++;
        !           192: asm("_Fpcr:");
        !           193:                r11 = *r12;
        !           194:                act_data = r11;
        !           195:                if (act_data != ix) error1(msg1,msg2,ix,act_data,lptr-1);
        !           196:                }
        !           197: }
        !           198: 
        !           199: 
        !           200: /* This routine runs virtual in user space ,kernel mode. It writes 
        !           201:    the contents of the test virtual page with values 0 - 1023,
        !           202:    then disable map,running physical, reads contents of the test
        !           203:    page back and compares to value 0-1023.
        !           204:        Input : p_adr = physical address of 1st longword of the
        !           205:                        test page.
        !           206:                v_adr = virtual address of 1st longword of the
        !           207:                        test page.
        !           208: */
        !           209: vt1_write(v_adr, p_adr)
        !           210: long v_adr, *p_adr;
        !           211: {      long act_data, *lptr;
        !           212:        register long *r12, ix;
        !           213: 
        !           214:        msg1 = "** fail when write whole page ..\n";
        !           215:        msg2 = "";
        !           216:        asm("movab Fpcw,_Fail_pc");
        !           217: 
        !           218:        lptr = (long *)v_adr;
        !           219:        for (ix=0; ix<NBPG; ix += 4) {
        !           220:                r12 = lptr++;
        !           221: asm("Fpcw:");
        !           222:                *r12 = ix;              /* write in virtual */
        !           223:                }
        !           224: 
        !           225:        asm("mtpr $0,$PADC");           /* Purge all data cache */
        !           226:        asm("mtpr $0,$MME");            /* Disable MME */
        !           227:        lptr = (long *)v_adr;
        !           228:        for (ix=0; ix<NBPG; ix += 4)    
        !           229:                {
        !           230:                Phys_adr = (long)p_adr;
        !           231:                act_data = *p_adr++;    /* Read in physical mode */
        !           232:                if (act_data != ix) error1(msg1,msg2,ix,act_data,lptr);
        !           233:                lptr++;
        !           234:                }
        !           235:        asm("mtpr $1,$MME");            /* Enable MME */
        !           236: }
        !           237: 
        !           238: 
        !           239: 
        !           240: t1s_sys()
        !           241: {      long *lptr, loc, val, exp_data, act_data;
        !           242:        register long r12;
        !           243: 
        !           244:        msg1 = " MTPR $VREAD,$DCR failed\n";
        !           245:        msg2 = " Test on single location\n";
        !           246:        asm("movab _Pcr,_Fail_pc");
        !           247: 
        !           248:        /* 1st unused virtual page in system space is mapped to
        !           249:           the physical page of _iob3. Initialize 1st longword
        !           250:           in _iob3 with pattern 0xaaaaaaaa
        !           251:        */
        !           252:        exp_data = 0xaaaaaaaa;
        !           253:        lptr = (long *)(((long)(&iob3)) & 0xfffffc00);
        !           254:        *lptr = exp_data;
        !           255:        Phys_adr = (long)lptr;
        !           256: 
        !           257:        /* Test address : 1st longword in unused virtual page */
        !           258:        loc = (unused << PGSHIFT & 0x3ffffc00) | SADDR; 
        !           259:        act_data = vread(loc);
        !           260:        if (exp_data != act_data)
        !           261:                error1(msg1,msg2,exp_data,act_data,loc);
        !           262: 
        !           263:        /* write last location in iob3 using diagnostic instruction */
        !           264:        msg1 = " MTPR $VWRITE,$DCR failed\n";
        !           265:        asm("movab _Pcw,_Fail_pc");
        !           266: 
        !           267:        exp_data = 0xbbbbbbbb;
        !           268:        Phys_adr += 0x3fc;
        !           269:        loc += 0x3fc;
        !           270:        vwrite(loc,exp_data);
        !           271:        lptr += 255;                    /* address of last longword */
        !           272:        act_data = *lptr;
        !           273:        if (exp_data != act_data)
        !           274:                error1(msg1,msg2,exp_data,act_data,loc);
        !           275: }
        !           276: 
        !           277: /* This routine running in PHYSICAL mode and try to use the diagnostic
        !           278:    instruction to do virtual read/write to a page.
        !           279:        Input : v_adr   = Virtual address of the 1st longword in the 
        !           280:                          test page.
        !           281:                test_pg = Physical address of the 1st longword in the
        !           282:                          page that is mapped to the test page
        !           283:    READ test : Each location in the test page is initialized with its 
        !           284:    unique physical address and then read back virtually using the 
        !           285:    diagnostic instruction to check against the physical addresses. 
        !           286: 
        !           287:    WRITE test : The same page used in Read test is cleared in physical
        !           288:    mode and then using the diagnostic instruction to write virtually
        !           289:    to each location with its unique address. Each location in this page
        !           290:    is then read back in physical mode and check against its the physical
        !           291:    address.
        !           292: */
        !           293: 
        !           294: t1p_diag(test_pg, v_adr)
        !           295: long test_pg, v_adr;
        !           296: {      long page_no, *lptr, loc, val, exp_data, act_data;
        !           297:        int ix;
        !           298: 
        !           299:        /* TEST VIRTUAL READ USING DIAGNOSTIC INSTRUCTION */
        !           300:        msg1 = "\n MTPR $VREAD,$DCR failed \n";
        !           301:        msg2 = " Test with whole page\n";
        !           302:        asm("movab _Pcr,_Fail_pc");
        !           303: 
        !           304:        /* initialize each location in test page with its address */
        !           305:        page_no = arithsr(((unsigned)((long)test_pg & 0x3fffffff)));
        !           306:        write_pg(0,page_no,test_pg,1);
        !           307: 
        !           308:        loc = v_adr;
        !           309:        for(exp_data=test_pg; exp_data<test_pg+NBPG; exp_data+=4)
        !           310:                { act_data = vread(loc);
        !           311:                  Phys_adr = exp_data;
        !           312:                  if (exp_data != act_data)
        !           313:                        error1(msg1,msg2,exp_data,act_data,loc);
        !           314:                      else  loc += 4;
        !           315:                }
        !           316:        /* TEST VIRTUAL WRITE USING DIAGNOSTIC INSTRUCTION */
        !           317:        msg1 = "\n MTPR $VWRITE,$DCR failed \n";
        !           318:        asm("movab _Pcw,_Fail_pc");
        !           319: 
        !           320:        write_pg(0,page_no,0,0);                /* clear test page */
        !           321:        loc = v_adr;
        !           322: 
        !           323:        /* write to each location its physical address */       
        !           324:        for(exp_data=test_pg; exp_data<test_pg+NBPG; exp_data+=4)
        !           325:                {
        !           326:                vwrite(loc,exp_data);   /* virtual write in system mode */
        !           327:                loc += 4;  }
        !           328:        loc = v_adr;                    /* virtual location */  
        !           329:        lptr = (long *)test_pg;         /* mapped to this physical loc */
        !           330:        for(exp_data=test_pg; exp_data<test_pg+NBPG; exp_data+=4)
        !           331:                {
        !           332:                Phys_adr = (long)lptr;
        !           333:                act_data = *lptr++;
        !           334:                if (exp_data != act_data)
        !           335:                        error1(msg1,msg2,exp_data,act_data,loc);
        !           336:                loc += 4;
        !           337:                }
        !           338: }
        !           339: 
        !           340: /* Routine using the diagnostic instruction to read/write single
        !           341:    locations in P0, P1, P2 space.
        !           342: */
        !           343: t1s_usr()
        !           344: {      long  *lptr, exp_data, loc, val, act_data;
        !           345:        long phys0, phys1, phys2;
        !           346: 
        !           347:        /* Virtual Page 0 of P0 is mapped to _iob0, initialize 
        !           348:           1st longword in _iob0 with pattern 0xaaaaaaaa */
        !           349:        exp_data = 0xaaaaaaaa;
        !           350:        lptr = (long *)(((long)(&iob0)) & 0xfffffc00);
        !           351:        *lptr = exp_data;
        !           352:        phys0 = (long)lptr;             /* Physical addr of test location */
        !           353: 
        !           354:        /* Virtual Page 0 of P1 is mapped to _iob1, initialize 
        !           355:           1st longword in _iob1 with pattern 0xbbbbbbbb */
        !           356:        exp_data = 0xbbbbbbbb;
        !           357:        lptr = (long *)(((long)(&iob1)) & 0xfffffc00);
        !           358:        *lptr = exp_data;
        !           359:        phys1 = (long)lptr;             /* Physical addr of test location */
        !           360: 
        !           361:        /* Last Virtual Page of P2 is mapped to _iob2, initialize 
        !           362:           1st longword in _iob2 with pattern 0xcccccccc */
        !           363:        exp_data = 0xcccccccc;
        !           364:        lptr = (long *)(((long)(&iob2)) & 0xfffffc00);
        !           365:        *lptr = exp_data;
        !           366:        phys2 = (long)lptr;             /* Physical addr of test location */
        !           367: 
        !           368:        /* now use diagnostic inst. to read them in virtual mode */
        !           369:        msg1 = "\n MTPR $VREAD,$DCR failed \n";
        !           370:        msg2 = " Test on single location\n";
        !           371:        asm("movab _Pcr,_Fail_pc");
        !           372:        Phys_adr = phys0;               /* Physical addr of test location */
        !           373: 
        !           374:        loc = 0|P0ADDR;
        !           375:        act_data = 0;
        !           376:        act_data = vread(loc);          /* read in P0 space */
        !           377:        exp_data = 0xaaaaaaaa;
        !           378:        if (exp_data != act_data)
        !           379:                error1(msg1,msg2,exp_data,act_data,loc);
        !           380: 
        !           381:        Phys_adr = phys1;               /* Physical addr of test location */
        !           382:        loc = 0|P1ADDR;
        !           383:        act_data = 0;
        !           384:        act_data = vread(loc);          /* read in P1 space */
        !           385:        exp_data = 0xbbbbbbbb;
        !           386:        if (exp_data != act_data)
        !           387:                error1(msg1,msg2,exp_data,act_data,loc);
        !           388: 
        !           389:        Phys_adr = phys2;               /* Physical addr of test location */
        !           390:        loc = (LAST_VPGNO << PGSHIFT) | P2ADDR;
        !           391:        act_data = 0;
        !           392:        act_data = vread(loc);          /* read in P2 space */
        !           393:        exp_data = 0xcccccccc;
        !           394:        if (exp_data != act_data)
        !           395:                error1(msg1,msg2,exp_data,act_data,loc);
        !           396: 
        !           397:        /* Virtual Page 0 of P0 is mapped to _iob0, try to use 
        !           398:           the diagnostic instruction to write to last longword
        !           399:           in _iob0 with pattern 0x11111111.
        !           400:        */      
        !           401:        asm("movab _Pcw,_Fail_pc");
        !           402:        msg1 = " MTPR $VWRITE,$DCR failed\n";
        !           403: 
        !           404:        exp_data = 0x11111111;          /* Write last location in P0 */
        !           405:        lptr = (long *)((((long)(&iob0)) & 0xfffffc00) + 0x3fc);
        !           406:        Phys_adr = (long)lptr;          /* Physical addr of test location */
        !           407:        loc = (0 | P0ADDR) + 0x3fc;     /* equivalent virtual address */
        !           408:        vwrite(loc,exp_data);
        !           409:        act_data = *lptr;
        !           410:        if (exp_data != act_data)
        !           411:                error1(msg1,msg2,exp_data,act_data,loc);
        !           412: 
        !           413:        /* Virtual Page 0 of P1 is mapped to _iob1, try to use 
        !           414:           the diagnostic instruction to write to last longword
        !           415:           in _iob1 with pattern 0x22222222.
        !           416:        */      
        !           417:        exp_data = 0x22222222;          /* Write last location in P1 */
        !           418:        lptr = (long *)((((long)(&iob1)) & 0xfffffc00) + 0x3fc);
        !           419:        Phys_adr = (long)lptr;          /* Physical addr of test location */
        !           420:        loc = (0 | P1ADDR) + 0x3fc;     /* equivalent virtual address */
        !           421:        vwrite(loc,exp_data);
        !           422:        act_data = *lptr;
        !           423:        if (exp_data != act_data)
        !           424:                error1(msg1,msg2,exp_data,act_data,loc);
        !           425: 
        !           426:        /* Virtual Page 0 of P2 is mapped to _iob2, try to use 
        !           427:           the diagnostic instruction to write to last longword
        !           428:           in _iob2 with pattern 0x33333333.
        !           429:        */      
        !           430:        exp_data = 0x33333333;          /* Write last location in P2 */
        !           431:        lptr = (long *)((((long)(&iob2)) & 0xfffffc00) + 0x3fc);
        !           432:        Phys_adr = (long)lptr;          /* Physical addr of test location */
        !           433:        loc = ( (LAST_VPGNO << PGSHIFT) | P2ADDR) + 0x3fc;
        !           434:        vwrite(loc,exp_data);
        !           435:        act_data = *lptr;
        !           436:        if (exp_data != act_data)
        !           437:                error1(msg1,msg2,exp_data,act_data,loc);
        !           438: }
        !           439: 
        !           440: /*     This routine fix SBR, P0PT, P1PT, P2PT as follow :
        !           441:        SBR : map 1st unused virtual page in System map to
        !           442:              the physica page of _iob3.
        !           443:        P0PT: map virtual page 0 of P0 space to the physical
        !           444:              page of _iob0
        !           445:        P1PT: map virtual page 0 of P1 space to the physical
        !           446:              page of _iob1
        !           447:        P2PT: map last virtual page of P2 space to the physical
        !           448:              page of _iob2
        !           449: */
        !           450: fix_maps()
        !           451: {
        !           452:        long *temp, pte, pfn, lx;
        !           453:        long *lptr, pte_no, old_pte0, old_pte1, access;
        !           454: 
        !           455:        /* Fix up System Page Table */
        !           456:        lptr = &unused;
        !           457:        pte_no = *lptr;
        !           458:        pte = arithsr(((unsigned)&iob3)) & 0xfffff;
        !           459:        fixpfn_pte(SBR,pte_no,&old_pte0,pte);
        !           460:        access = PTE_V | PTE_KW;
        !           461:        fixpv_pte(SBR,pte_no,&old_pte1, access);
        !           462: 
        !           463:        /* Set up P0PT */
        !           464:        lx = arithsr(((unsigned)(&iob0) & 0x3ffffc00)) ;
        !           465:        pfn = lx & 0xfffff;
        !           466:        pte = pfn | (PTE_V | PTE_UW);
        !           467:        temp = &u0p0pt;
        !           468:        *temp = pte;            /* 1st page in P0 mapped to IOB0 */
        !           469:        savvec4 = ((long)temp) | SADDR;         /* system virtual address */
        !           470:        asm("mtpr _savvec4,$P0BR");
        !           471:        asm("mtpr $1,$P0LR");
        !           472: 
        !           473:        /* Set up P1PT */
        !           474:        lx = arithsr(((unsigned)(&iob1) & 0x3ffffc00)) ;
        !           475:        pfn = lx & 0xfffff;
        !           476:        pte = pfn | (PTE_V | PTE_UW);
        !           477:        temp = &u0p1pt;
        !           478:        *temp = pte;            /* 1st page in P1 mapped to IOB1 */
        !           479:        savvec4 = ((long)temp) | SADDR;
        !           480:        asm("mtpr _savvec4,$P1BR");
        !           481:        asm("mtpr $1,$P1LR");
        !           482: 
        !           483:        /* Set up P2PT */
        !           484:        lx = arithsr(((unsigned)(&iob2) & 0x3ffffc00)) ;
        !           485:        pfn = lx & 0xfffff;
        !           486:        pte = pfn | (PTE_V | PTE_UW);
        !           487:        temp = &u0p2pt;
        !           488:        *temp = pte;            /* 1st PTE in P2 mapped to IOB2 */
        !           489:        savvec4 = ((long)temp) | SADDR;
        !           490:        savvec4 -= (LAST_VPGNO << 2);           /* This is how P2BR works !! */
        !           491:        asm("mtpr _savvec4 ,$P2BR");
        !           492:        asm("mtpr $0xffffe,$P2LR");             /* use only 1 entry */
        !           493:        asm("mtpr $0,$TBIA");           /* invalidate all cache */
        !           494: }
        !           495: 
        !           496: extern long dummy;
        !           497: 
        !           498: arithsr(num)
        !           499: long num;
        !           500: {
        !           501:        asm("shar  $10,4(fp),_dummy");
        !           502:        return(dummy);
        !           503: }
        !           504: 
        !           505: error1(mss1,mss2,exp,act,loc)
        !           506: char *mss1, *mss2;
        !           507: long exp, act, loc;
        !           508: {      register long r12;
        !           509: 
        !           510:        writes(mss1); writes(mss2); 
        !           511: 
        !           512:        writes("** PC   : "); writeh(Fail_pc); writec('\n');
        !           513:        writes("** VA of test loc.    : "); writeh(loc); writec('\n');
        !           514:        writes("** PA of test loc.    : "); writeh(Phys_adr); writec('\n');
        !           515:        writes("** Expected data      : "); writeh(exp); writec('\n');
        !           516:        writes("** Actual data        : "); writeh(act); writec('\n');
        !           517: 
        !           518:        prt_base(loc);          /* Print base registers */
        !           519:        asm("halt");
        !           520: }
        !           521: 
        !           522: 
        !           523: /*     THESE FOLLOWING ROUTINES USE THE DIANOSTIC CONTROL REGISTER
        !           524:        TO DO VIRTUAL READ/WRITE WHILE RUNNING IN PHYSICAL MODE
        !           525: */
        !           526: 
        !           527: int vread(loc) /* virtual read in user mode */
        !           528: long loc;
        !           529: {
        !           530:        savvec5 = loc;
        !           531:        asm("movl _savvec5,r0");        /* R0 : virtual address to read */
        !           532: asm("_Pcr:");
        !           533:        asm("mtpr $4,$DCR");            /* 4  : Read opcode */
        !           534:        asm("movl r1,_savvec5");        /* R1 : read data */
        !           535:        return(savvec5);
        !           536: }
        !           537: 
        !           538: 
        !           539: vwrite(loc,val)        /* virtual write in user mode */
        !           540: long loc, val;
        !           541: {
        !           542:        savvec5 = loc;
        !           543:        savvec6 = val;
        !           544:        asm("movl _savvec5,r0");        /* R0 : virtual address to write */
        !           545:        asm("movl _savvec6,r1");        /* R1 : data to write */
        !           546: asm("_Pcw:");
        !           547:        asm("mtpr $8,$DCR");            /* 8  : Write opcode */
        !           548: }
        !           549: 
        !           550: prt_base(va)
        !           551: long va;
        !           552: {      register long r12;
        !           553: 
        !           554:        asm("mfpr $MME,r12");
        !           555:        writes("** MME  : "); writeh(r12); writec('\n');
        !           556:        asm("mfpr $SBR,r12");
        !           557:        writes("** SBR  : "); writeh(r12); writec('\n');
        !           558:        asm("mfpr $SLR,r12");
        !           559:        writes("** SLR  : "); writeh(r12); writec('\n');
        !           560:        if ((va&0xc0000000)==0) {
        !           561:                asm("mfpr $P0BR,r12");
        !           562:                writes("** P0BR : "); writeh(r12); writec('\n');
        !           563:                asm("mfpr $P0LR,r12");
        !           564:                writes("** P0LR : "); writeh(r12); writec('\n');
        !           565:                }
        !           566:        if ((va&0xc0000000)==0x40000000) {
        !           567:                asm("mfpr $P1BR,r12");
        !           568:                writes("** P1BR : "); writeh(r12); writec('\n');
        !           569:                asm("mfpr $P1LR,r12");
        !           570:                writes("** P1LR : "); writeh(r12); writec('\n');
        !           571:                }
        !           572:        if ((va&0xc0000000)==0x80000000) {
        !           573:                asm("mfpr $P2BR,r12");
        !           574:                writes("** P2BR : "); writeh(r12); writec('\n');
        !           575:                asm("mfpr $P2LR,r12");
        !           576:                writes("** P2LR : "); writeh(r12); writec('\n');
        !           577:                }
        !           578: }
        !           579: 

unix.superglobalmegacorp.com

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