|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.