|
|
1.1 root 1: LL0:
2: .data
3: .set SBR,0
4: .set SLR,1
5: .set P0BR,2
6: .set P0LR,3
7: .set P1BR,4
8: .set P1LR,5
9: .set P2BR,6
10: .set P2LR,7
11: .set IPL,8
12: .set MAPEN,9
13: .set MME,9
14: .set TBIA,10
15: .set TBIS,11
16: .set DCK,12
17: .set CCK,13
18: .set PCBB,14
19: .set KSP,19
20: .set USP,20
21: .set CPMDCB,21
22: .set PADC,25
23: .set DCR,27
24: .set DC_ON,1
25: .set DC_OFF,2
26: .set TB_ON,256
27: .set TB_OFF,512
28: .comm _Failpc,4
29: .comm _test_va,4
30: .comm _Tpsl,4
31: .text
32: .align 1
33: .globl _protect
34: _protect:
35: .word L33
36: #
37: # #include "definitions"
38: #
39: # extern long iob0, iob1, iob2, iob3, ss1;
40: # extern long unused, u0p1pt, u0p2pt, scb, savvec4, savvec5, savvec6, savvec7;
41: # extern long *p_ptr, exp_par0, exp_par1, exp_par2, exp_par3;
42: #
43: # long Failpc, test_va, Tpsl;
44: #
45: # /* This test will test access protections on PTE in TAHOE memory
46: # management scheme.
47: # The main loop of the test running in USER space, KERNEL privilege.
48: # */
49: #
50: # protect()
51: # { long *temp, pg_no, pte, saved_pte, pte_sys, pte_p0, pte_p1, pte_p2;
52: jbr L35
53: L36:
54: #
55: # if (ss1) writes("** Subtest2 : Access protection fault\n");
56: tstl _ss1
57: jeql L37
58: .data 1
59: L39:
60: .ascii "** Subtest2 : Access protection fault\12\0"
61: .text
62: pushl $L39
63: callf $8,_writes
64: # pg_no = 0;
65: L37:
66: clrl -60(fp)
67: # asm("mfpr $SBR,_savvec4");
68: mfpr $SBR,_savvec4
69: # savvec4 |= 0xc0000000;
70: orl2 $-1073741824,_savvec4
71: # asm("mtpr _savvec4,$P0BR"); /* Double map P0 into System space */
72: mtpr _savvec4,$P0BR
73: # asm("mfpr $SLR,_savvec4");
74: mfpr $SLR,_savvec4
75: # asm("mtpr _savvec4,$P0LR");
76: mtpr _savvec4,$P0LR
77: #
78: # asm("mtpr $3,$DCK");
79: mtpr $3,$DCK
80: # asm("mtpr $0,$TBIA");
81: mtpr $0,$TBIA
82: # asm("mtpr $0,$PADC");
83: mtpr $0,$PADC
84: # asm("mtpr $1,$MME");
85: mtpr $1,$MME
86: # asm("jmp *$0f"); /* Go virtual */
87: jmp *$0f
88: # asm("0:");
89: 0:
90: #
91: # /* Set up SPT */
92: # pg_no = TEST_PTESYS; /* Map 1st unused PTE to */
93: movl _unused,-60(fp)
94: # pte = IOB0; /* physical page iob0 (22) */
95: andl3 $1073740800,$_iob0,r0
96: shrl $10,r0,r0
97: andl2 $1048575,r0
98: movl r0,-64(fp)
99: # fixpfn_pte(SBR,pg_no, &pte_sys, pte);
100: pushl -64(fp)
101: subl3 $72,fp,r0
102: pushl r0
103: pushl -60(fp)
104: pushl $0
105: callf $20,_fixpfn_pte
106: #
107: # /* Set up P0PT */
108: # pg_no = TEST_PTEP0; /* Map PTE. 60 in P0PT */
109: movl $68,-60(fp)
110: # pte = IOB1; /* physical page iob1 (23) */
111: andl3 $1073740800,$_iob1,r0
112: shrl $10,r0,r0
113: andl2 $1048575,r0
114: movl r0,-64(fp)
115: # fixpfn_pte(P0BR,pg_no, &pte_p0, pte);
116: pushl -64(fp)
117: subl3 $76,fp,r0
118: pushl r0
119: pushl -60(fp)
120: pushl $2
121: callf $20,_fixpfn_pte
122: #
123: # /* Set up P1PT */
124: # temp = &u0p1pt; /* Map PTE. 0 in P1PT */
125: movl $_u0p1pt,-56(fp)
126: # *temp = IOB2; /* physical page iob2 (24) */
127: andl3 $1073740800,$_iob2,r0
128: shrl $10,r0,r0
129: andl2 $1048575,r0
130: movl r0,*-56(fp)
131: # savvec4 = ((long)temp) | SADDR;
132: orl3 $-1073741824,-56(fp),r0
133: movl r0,_savvec4
134: # asm("mtpr _savvec4,$P1BR");
135: mtpr _savvec4,$P1BR
136: # asm("mtpr $1,$P1LR");
137: mtpr $1,$P1LR
138: #
139: # /* Set up P2PT */
140: # temp = &u0p2pt; /* Map PTE. 0 in P2PT */
141: movl $_u0p2pt,-56(fp)
142: # *temp = IOB3; /* physical page iob3 (25) */
143: andl3 $1073740800,$_iob3,r0
144: shrl $10,r0,r0
145: andl2 $1048575,r0
146: movl r0,*-56(fp)
147: # savvec4 = ((long)temp) | SADDR;
148: orl3 $-1073741824,-56(fp),r0
149: movl r0,_savvec4
150: # savvec4 -= (LAST_VPGNO << 2);
151: subl2 $4194300,_savvec4
152: # asm("mtpr _savvec4, $P2BR");
153: mtpr _savvec4, $P2BR
154: # asm("mtpr $0xffffe, $P2LR"); /* Use only 1 entry */
155: mtpr $0xffffe, $P2LR
156: #
157: # /* Map test area to allow USER to execute code */
158: # asm("movab rd_access,_savvec4");
159: movab rd_access,_savvec4
160: # pg_no = (savvec4 >> PGSHIFT) & 0xfffff;
161: shar $10,_savvec4,r0
162: andl2 $1048575,r0
163: movl r0,-60(fp)
164: # fixpv_pte(SBR, pg_no, &saved_pte, PTE_UW | PTE_V);
165: pushl $-134217728
166: subl3 $68,fp,r0
167: pushl r0
168: pushl -60(fp)
169: pushl $0
170: callf $20,_fixpv_pte
171: # fixpv_pte(SBR, pg_no+1, &saved_pte, PTE_UW | PTE_V);
172: pushl $-134217728
173: subl3 $68,fp,r0
174: pushl r0
175: addl3 $1,-60(fp),r0
176: pushl r0
177: pushl $0
178: callf $20,_fixpv_pte
179: #
180: # prot(); /* Do test .. */
181: callf $4,_prot
182: #
183: # fixpv_pte(SBR, pg_no, &saved_pte, PTE_KW | PTE_V);
184: pushl $-536870912
185: subl3 $68,fp,r0
186: pushl r0
187: pushl -60(fp)
188: pushl $0
189: callf $20,_fixpv_pte
190: # fixpv_pte(SBR, pg_no+1, &saved_pte, PTE_KW | PTE_V);
191: pushl $-536870912
192: subl3 $68,fp,r0
193: pushl r0
194: addl3 $1,-60(fp),r0
195: pushl r0
196: pushl $0
197: callf $20,_fixpv_pte
198: #
199: # /* Restore original PTEs */
200: # pg_no = TEST_PTESYS;
201: movl _unused,-60(fp)
202: # pte = IOB0;
203: andl3 $1073740800,$_iob0,r0
204: shrl $10,r0,r0
205: andl2 $1048575,r0
206: movl r0,-64(fp)
207: # fixpfn_pte(SBR,pg_no, &pte_sys, pte_sys&0x3fffff);
208: andl3 $4194303,-72(fp),r0
209: pushl r0
210: subl3 $72,fp,r0
211: pushl r0
212: pushl -60(fp)
213: pushl $0
214: callf $20,_fixpfn_pte
215: # pg_no = TEST_PTEP0;
216: movl $68,-60(fp)
217: # pte = IOB1;
218: andl3 $1073740800,$_iob1,r0
219: shrl $10,r0,r0
220: andl2 $1048575,r0
221: movl r0,-64(fp)
222: # fixpfn_pte(P0BR,pg_no, &pte_p0, pte_p0&0x3fffff);
223: andl3 $4194303,-76(fp),r0
224: pushl r0
225: subl3 $76,fp,r0
226: pushl r0
227: pushl -60(fp)
228: pushl $2
229: callf $20,_fixpfn_pte
230: # pg_no = TEST_PTEP1;
231: clrl -60(fp)
232: # pte = IOB2;
233: andl3 $1073740800,$_iob2,r0
234: shrl $10,r0,r0
235: andl2 $1048575,r0
236: movl r0,-64(fp)
237: # fixpfn_pte(P1BR,pg_no, &pte_p1, pte_p1&0x3fffff);
238: andl3 $4194303,-80(fp),r0
239: pushl r0
240: subl3 $80,fp,r0
241: pushl r0
242: pushl -60(fp)
243: pushl $4
244: callf $20,_fixpfn_pte
245: # pg_no = TEST_PTEP2;
246: movl $1048575,-60(fp)
247: # pte = IOB3;
248: andl3 $1073740800,$_iob3,r0
249: shrl $10,r0,r0
250: andl2 $1048575,r0
251: movl r0,-64(fp)
252: # fixpfn_pte(P2BR,pg_no, &pte_p2, pte_p2&0x3fffff);
253: andl3 $4194303,-84(fp),r0
254: pushl r0
255: subl3 $84,fp,r0
256: pushl r0
257: pushl -60(fp)
258: pushl $6
259: callf $20,_fixpfn_pte
260: #
261: # asm("mtpr $0,$MME"); /* Back to physical */
262: mtpr $0,$MME
263: # asm("mtpr $0,$P0LR"); /* Invalidate P0BR */
264: mtpr $0,$P0LR
265: # }
266: ret
267: .set L33,0x0
268: L35:
269: subl3 $84,fp,sp
270: jbr L36
271: .data
272: .text
273: .align 1
274: .globl _prot
275: _prot:
276: .word L43
277: #
278: # prot()
279: # { long access_md, privilege, exp_int;
280: jbr L45
281: L46:
282: #
283: #
284: # /* PTE : No Access */
285: # access_md = PTE_NOACC | PTE_V;
286: movl $-2147483648,-56(fp)
287: # /* Try all privileges with R/W access on all tables */
288: # exp_int = TRUE;
289: movl $1,-64(fp)
290: # for(privilege=USER; privilege>=KERNEL; privilege--)
291: movl $1,-60(fp)
292: L49:
293: tstl -60(fp)
294: jlss L48
295: # chmaps_prot(access_md,privilege,"rw",exp_int);
296: .data 1
297: L51:
298: .ascii "rw\0"
299: .text
300: pushl -64(fp)
301: pushl $L51
302: pushl -60(fp)
303: pushl -56(fp)
304: callf $20,_chmaps_prot
305: L47:
306: decl -60(fp)
307: jbr L49
308: L48:
309: #
310: # /* PTE : Kernel Read */
311: # access_md = PTE_KR | PTE_V;
312: movl $-1073741824,-56(fp)
313: # chmaps_prot(access_md,USER,"rw",exp_int);
314: .data 1
315: L52:
316: .ascii "rw\0"
317: .text
318: pushl -64(fp)
319: pushl $L52
320: pushl $1
321: pushl -56(fp)
322: callf $20,_chmaps_prot
323: # chmaps_prot(access_md,KERNEL,"w",exp_int);
324: .data 1
325: L53:
326: .ascii "w\0"
327: .text
328: pushl -64(fp)
329: pushl $L53
330: pushl $0
331: pushl -56(fp)
332: callf $20,_chmaps_prot
333: # exp_int = FALSE;
334: clrl -64(fp)
335: # chmaps_prot(access_md,KERNEL,"r",exp_int);
336: .data 1
337: L54:
338: .ascii "r\0"
339: .text
340: pushl -64(fp)
341: pushl $L54
342: pushl $0
343: pushl -56(fp)
344: callf $20,_chmaps_prot
345: #
346: # /* PTE : Kernel Write */
347: # access_md = PTE_KW | PTE_V;
348: movl $-536870912,-56(fp)
349: # exp_int = TRUE;
350: movl $1,-64(fp)
351: # chmaps_prot(access_md,USER,"rw",exp_int);
352: .data 1
353: L55:
354: .ascii "rw\0"
355: .text
356: pushl -64(fp)
357: pushl $L55
358: pushl $1
359: pushl -56(fp)
360: callf $20,_chmaps_prot
361: # exp_int = FALSE;
362: clrl -64(fp)
363: # chmaps_prot(access_md,0,"rw",exp_int);
364: .data 1
365: L56:
366: .ascii "rw\0"
367: .text
368: pushl -64(fp)
369: pushl $L56
370: pushl $0
371: pushl -56(fp)
372: callf $20,_chmaps_prot
373: #
374: #
375: # /* PTE : User Read/Kernel Read */
376: # access_md = PTE_URKR | PTE_V;
377: movl $-805306368,-56(fp)
378: # exp_int = TRUE;
379: movl $1,-64(fp)
380: # chmaps_prot(access_md,USER,"w",exp_int);
381: .data 1
382: L57:
383: .ascii "w\0"
384: .text
385: pushl -64(fp)
386: pushl $L57
387: pushl $1
388: pushl -56(fp)
389: callf $20,_chmaps_prot
390: # chmaps_prot(access_md,KERNEL,"w",exp_int);
391: .data 1
392: L58:
393: .ascii "w\0"
394: .text
395: pushl -64(fp)
396: pushl $L58
397: pushl $0
398: pushl -56(fp)
399: callf $20,_chmaps_prot
400: # exp_int = FALSE;
401: clrl -64(fp)
402: # chmaps_prot(access_md,USER,"r",exp_int);
403: .data 1
404: L59:
405: .ascii "r\0"
406: .text
407: pushl -64(fp)
408: pushl $L59
409: pushl $1
410: pushl -56(fp)
411: callf $20,_chmaps_prot
412: # chmaps_prot(access_md,KERNEL,"r",exp_int);
413: .data 1
414: L60:
415: .ascii "r\0"
416: .text
417: pushl -64(fp)
418: pushl $L60
419: pushl $0
420: pushl -56(fp)
421: callf $20,_chmaps_prot
422: #
423: #
424: # /* PTE : User Read/ Kernel Read/Write */
425: # access_md = PTE_URKW | PTE_V;
426: movl $-268435456,-56(fp)
427: # exp_int = TRUE;
428: movl $1,-64(fp)
429: # chmaps_prot(access_md,USER,"w",exp_int);
430: .data 1
431: L61:
432: .ascii "w\0"
433: .text
434: pushl -64(fp)
435: pushl $L61
436: pushl $1
437: pushl -56(fp)
438: callf $20,_chmaps_prot
439: # exp_int = FALSE;
440: clrl -64(fp)
441: # chmaps_prot(access_md,USER,"r",exp_int);
442: .data 1
443: L62:
444: .ascii "r\0"
445: .text
446: pushl -64(fp)
447: pushl $L62
448: pushl $1
449: pushl -56(fp)
450: callf $20,_chmaps_prot
451: # chmaps_prot(access_md,KERNEL,"rw",exp_int);
452: .data 1
453: L63:
454: .ascii "rw\0"
455: .text
456: pushl -64(fp)
457: pushl $L63
458: pushl $0
459: pushl -56(fp)
460: callf $20,_chmaps_prot
461: #
462: # /* PTE : User Read/Write/ Kernel Read/Write */
463: # access_md = PTE_UW | PTE_V;
464: movl $-134217728,-56(fp)
465: # exp_int = FALSE;
466: clrl -64(fp)
467: # for(privilege=USER; privilege>=KERNEL; privilege--)
468: movl $1,-60(fp)
469: L66:
470: tstl -60(fp)
471: jlss L65
472: # chmaps_prot(access_md,privilege,"rw",exp_int);
473: .data 1
474: L67:
475: .ascii "rw\0"
476: .text
477: pushl -64(fp)
478: pushl $L67
479: pushl -60(fp)
480: pushl -56(fp)
481: callf $20,_chmaps_prot
482: L64:
483: decl -60(fp)
484: jbr L66
485: L65:
486: #
487: # }
488: ret
489: .set L43,0x0
490: L45:
491: subl3 $64,fp,sp
492: jbr L46
493: .data
494: .comm _spc_str,4
495: .text
496: .align 1
497: .globl _chmaps_prot
498: _chmaps_prot:
499: .word L69
500: #
501: # char *spc_str;
502: #
503: # chmaps_prot(access_md,priv,run_access,exp_int)
504: # long access_md, priv, exp_int;
505: # char *run_access;
506: # { long pg_table, pte_no, space;
507: jbr L71
508: L72:
509: #
510: # for (pg_table=SBR; pg_table<=P2BR; pg_table += 2)
511: clrl -56(fp)
512: L75:
513: cmpl -56(fp),$6
514: jgtr L74
515: # {
516: # if (pg_table == SBR) {
517: tstl -56(fp)
518: jneq L76
519: # pte_no = TEST_PTESYS;
520: movl _unused,-60(fp)
521: # space = SADDR; }
522: movl $-1073741824,-64(fp)
523: # if (pg_table == P0BR) {
524: L76:
525: cmpl -56(fp),$2
526: jneq L77
527: # pte_no = TEST_PTEP0;
528: movl $68,-60(fp)
529: # space = P0ADDR; }
530: clrl -64(fp)
531: # if (pg_table == P1BR) {
532: L77:
533: cmpl -56(fp),$4
534: jneq L78
535: # pte_no = TEST_PTEP1;
536: clrl -60(fp)
537: # space = P1ADDR; }
538: movl $1073741824,-64(fp)
539: # if (pg_table == P2BR) {
540: L78:
541: cmpl -56(fp),$6
542: jneq L79
543: # pte_no = TEST_PTEP2;
544: movl $1048575,-60(fp)
545: # space = P2ADDR; }
546: movl $-2147483648,-64(fp)
547: # force_flt(pg_table,pte_no,access_md,priv,run_access,space,exp_int);
548: L79:
549: pushl 16(fp)
550: pushl -64(fp)
551: pushl 12(fp)
552: pushl 8(fp)
553: pushl 4(fp)
554: pushl -60(fp)
555: pushl -56(fp)
556: callf $32,_force_flt
557: # }
558: L73:
559: addl2 $2,-56(fp)
560: jbr L75
561: L74:
562: # }
563: ret
564: .set L69,0x0
565: L71:
566: subl3 $64,fp,sp
567: jbr L72
568: .data
569: .text
570: .align 1
571: .globl _force_flt
572: _force_flt:
573: .word L81
574: #
575: # /* This routine forces protection faults with read and write access
576: # to page table specified by tbl_no . The access bits of this PTE
577: # is set to value of pte_access, the process that access this PTE
578: # is running in the mode specified by rum_mode.
579: # tbl_no : (0,1,2,3) corresponding to P0PT, P1PT, P2PT, SPT.
580: # which_pte : PTE to be accessed
581: # pte_access : valid and protection bits to be set on PTE
582: # access : "r", "rw", "w"/ "R", "RW", "W"
583: # run_mode : privilege of process when access PTE
584: # */
585: #
586: # force_flt(tbl_no, which_pte, pte_access, run_mode, access, addr_space, exp_int)
587: # long tbl_no, which_pte, pte_access, run_mode, addr_space, exp_int;
588: # char *access;
589: # {
590: jbr L83
591: L84:
592: # long *st_base, saved_vec1,saved_vec2,saved_pte,test_adr,tflag;
593: # long ix, handler_adr;
594: # char *acc_str, *pmode_str;
595: #
596: # /* Set protection bits of target PTE */
597: # fixpv_pte(tbl_no,which_pte,&saved_pte,pte_access);
598: pushl 12(fp)
599: subl3 $68,fp,r0
600: pushl r0
601: pushl 8(fp)
602: pushl 4(fp)
603: callf $20,_fixpv_pte
604: #
605: # /* Get virtual address of test location */
606: # test_adr = (which_pte<<PGSHIFT)|addr_space;
607: shll $10,8(fp),r0
608: orl2 24(fp),r0
609: movl r0,-72(fp)
610: #
611: # for(ix=0;ix<2;ix++)
612: clrl -80(fp)
613: L87:
614: cmpl -80(fp),$2
615: jgeq L86
616: # {
617: # if (access[ix]==NULL) break;
618: movl 20(fp),r0
619: movl -80(fp),r1
620: tstb (r0)[r1]
621: jneq L88
622: jbr L86
623: # /* Set handler of protection fault */
624: # if (exp_int==TRUE)
625: L88:
626: cmpl 28(fp),$1
627: jneq L89
628: # asm("movab pro_flt1,_savvec4");
629: movab pro_flt1,_savvec4
630: # else
631: jbr L90
632: L89:
633: # asm("movab pro_flt2,_savvec4");
634: movab pro_flt2,_savvec4
635: L90:
636: # handler_adr = savvec4;
637: movl _savvec4,-84(fp)
638: # set_handler(PROT_VEC,&saved_vec1,handler_adr);
639: pushl -84(fp)
640: subl3 $60,fp,r0
641: pushl r0
642: pushl $47
643: callf $16,_set_handler
644: #
645: # /* Set handler for DATA ALIGNMENT FAULT */
646: # asm("movab chmk_hd,_savvec4");
647: movab chmk_hd,_savvec4
648: # handler_adr = savvec4;
649: movl _savvec4,-84(fp)
650: # set_handler(ALIGN_FLT,&saved_vec2,handler_adr);
651: pushl -84(fp)
652: subl3 $64,fp,r0
653: pushl r0
654: pushl $53
655: callf $16,_set_handler
656: #
657: # /* Set expected parameter words */
658: # exp_par1 = exp_par2 = exp_par3 = 0;
659: clrl _exp_par3
660: movl _exp_par3,r0
661: movl r0,_exp_par2
662: movl _exp_par2,r0
663: movl r0,_exp_par1
664: # exp_par1 = test_adr;
665: movl -72(fp),_exp_par1
666: # if ((access[ix]=='r') || (access[ix]=='R'))
667: movl 20(fp),r0
668: movl -80(fp),r1
669: cmpb (r0)[r1],$114
670: jeql L9999
671: movl 20(fp),r0
672: movl -80(fp),r1
673: cmpb (r0)[r1],$82
674: jneq L92
675: L9999:
676: # { /* protection violation, read access */
677: # asm("movab rd_access,_exp_par2"); /* Expected PC */
678: movab rd_access,_exp_par2
679: # exp_par0 = 0;
680: clrl _exp_par0
681: # }
682: # else
683: jbr L93
684: L92:
685: # { /* protection violation, write access */
686: # asm("movab wr_access,_exp_par2");
687: movab wr_access,_exp_par2
688: # exp_par0 = 4;
689: movl $4,_exp_par0
690: # }
691: L93:
692: #
693: # asm("mtpr $0xbfffb3fc,$USP"); /* Set up user stack */
694: mtpr $0xbfffb3fc,$USP
695: # asm("movab (sp),_savvec5");
696: movab (sp),_savvec5
697: # savvec5 -= 40; /* KSP is 10 longword after ISP */
698: subl2 $40,_savvec5
699: # asm("mtpr _savvec5,$KSP");
700: mtpr _savvec5,$KSP
701: #
702: # /* set up to change privilege */
703: # exp_par3 = run_mode << 24;
704: shll $24,16(fp),r0
705: movl r0,_exp_par3
706: # Tpsl = exp_par3; /* PSL when force fault */
707: movl _exp_par3,_Tpsl
708: # Failpc = exp_par2; /* PC to force fault */
709: movl _exp_par2,_Failpc
710: # asm("pushl _exp_par3");
711: pushl _exp_par3
712: # asm("pushl _exp_par2"); /* Push PSL, PC on current stack */
713: pushl _exp_par2
714: #
715: # /* Change mode */
716: # test_va = savvec5 = test_adr;
717: movl -72(fp),_savvec5
718: movl _savvec5,r0
719: movl r0,_test_va
720: # asm("movl _savvec5,r0");
721: movl _savvec5,r0
722: #
723: # /* Enable false */
724: # asm("mtpr $64,$DCR");
725: mtpr $64,$DCR
726: # asm("rei"); /* Go : Amem ... */
727: rei
728: # asm("halt"); /* REI fails ... */
729: halt
730: #
731: # asm("rtn0_p0:");
732: rtn0_p0:
733: # asm("movl r0,_savvec5"); /* flag indicate where return from */
734: movl r0,_savvec5
735: # tflag = savvec5;
736: movl _savvec5,-76(fp)
737: # st_base = &scb;
738: movl $_scb,-56(fp)
739: #
740: # /* Restore Prot_fault, ALIGN_FLT vectors */
741: # *(st_base + PROT_VEC) = saved_vec1;
742: movl -56(fp),r0
743: movl -60(fp),188(r0)
744: # *(st_base + ALIGN_FLT) = saved_vec2;
745: movl -56(fp),r0
746: movl -64(fp),212(r0)
747: #
748: # if (tflag && exp_int)
749: tstl -76(fp)
750: jeql L94
751: tstl 28(fp)
752: jeql L94
753: # { /* Error : expected event did not happen */
754: # writes("** Expected protection fault didnot occured\n");
755: .data 1
756: L95:
757: .ascii "** Expected protection fault didnot occured\12\0"
758: .text
759: pushl $L95
760: callf $8,_writes
761: # ac_error1();
762: callf $4,_ac_error1
763: # asm("halt");
764: halt
765: # }
766: #
767: # /* check fault parameters pushed on stack */
768: # if ((exp_int==TRUE)&&(tflag==FALSE)) chk_fpars("");
769: L94:
770: cmpl 28(fp),$1
771: jneq L97
772: tstl -76(fp)
773: jneq L97
774: .data 1
775: L99:
776: .ascii "\0"
777: .text
778: pushl $L99
779: callf $8,_chk_fpars
780: # }
781: L97:
782: L85:
783: incl -80(fp)
784: jbr L87
785: L86:
786: #
787: # /* Restore tested PTE's */
788: # savvec5 = tbl_no;
789: movl 4(fp),_savvec5
790: # asm("mfpr _savvec5,_savvec6");
791: mfpr _savvec5,_savvec6
792: # st_base = (long *)savvec6;
793: movl _savvec6,-56(fp)
794: # st_base += which_pte;
795: shll $2,8(fp),r0
796: addl2 r0,-56(fp)
797: # *st_base = saved_pte;
798: movl -68(fp),*-56(fp)
799: # }
800: ret
801: .set L81,0x0
802: L83:
803: subl3 $92,fp,sp
804: jbr L84
805: .data
806: .text
807: .align 1
808: .globl _ptfx_handler
809: _ptfx_handler:
810: .word L101
811: #
812: #
813: # /* Handler of protection fault exception. */
814: # ptfx_handler()
815: # {
816: jbr L103
817: L104:
818: # asm(".align 2");
819: .align 2
820: # asm("pro_flt1:"); /* EXPECTED INTERRUPT */
821: pro_flt1:
822: #
823: # asm("mtpr $0x1f,$IPL");
824: mtpr $0x1f,$IPL
825: # asm("movab (sp),_savvec5"); /* set pointer to parameters */
826: movab (sp),_savvec5
827: # p_ptr = (long *)savvec5;
828: movl _savvec5,_p_ptr
829: # asm("svpctx"); /* switch back to ISP */
830: svpctx
831: # asm("clrl r0");
832: clrl r0
833: # asm("jmp rtn0_p0"); /* return to test */
834: jmp rtn0_p0
835: #
836: # asm(".align 2");
837: .align 2
838: # asm("pro_flt2:"); /* UNEXPECTED INTERRUPT */
839: pro_flt2:
840: # asm("mtpr $0x1f,$IPL");
841: mtpr $0x1f,$IPL
842: # asm("movab (sp),_savvec5"); /* set pointer to parameters */
843: movab (sp),_savvec5
844: # asm("movl fp,_saved_fp"); /* save fp */
845: movl fp,_saved_fp
846: # asm("movab (sp),fp"); /* set new frame pointer for next CALLS */
847: movab (sp),fp
848: # p_ptr = (long *)savvec5;
849: movl _savvec5,_p_ptr
850: #
851: # writes("** Unexpected protection fault\n");
852: .data 1
853: L105:
854: .ascii "** Unexpected protection fault\12\0"
855: .text
856: pushl $L105
857: callf $8,_writes
858: # ac_error1();
859: callf $4,_ac_error1
860: # prt_par("** Parameters : ",p_ptr); /* print fault parameters */
861: .data 1
862: L107:
863: .ascii "** Parameters : \0"
864: .text
865: pushl _p_ptr
866: pushl $L107
867: callf $12,_prt_par
868: # asm("svpctx"); /* switch back to ISP */
869: svpctx
870: # asm("clrl r0");
871: clrl r0
872: # asm("movl _saved_fp,fp"); /* restore fp */
873: movl _saved_fp,fp
874: # asm("halt");
875: halt
876: # asm("jmp rtn0_p0"); /* return to test */
877: jmp rtn0_p0
878: # }
879: ret
880: .set L101,0x0
881: L103:
882: jbr L104
883: .data
884: .text
885: .align 1
886: .globl _chmk_handler
887: _chmk_handler:
888: .word L109
889: #
890: # chmk_handler()
891: # {
892: jbr L111
893: L112:
894: # asm(".align 2");
895: .align 2
896: # asm("chmk_hd:"); /* Come here by causing a data not align fault */
897: chmk_hd:
898: # /* return to test */
899: # asm("mtpr $0x1f,$IPL"); /* Set IPL to HIGH */
900: mtpr $0x1f,$IPL
901: # asm("svpctx"); /* switch back to ISP */
902: svpctx
903: # asm("movl $1,r0"); /* set flag to indicate return from here */
904: movl $1,r0
905: # asm("jmp rtn0_p0");
906: jmp rtn0_p0
907: # }
908: ret
909: .set L109,0x0
910: L111:
911: jbr L112
912: .data
913: .text
914: .align 1
915: .globl _TEST_AREA
916: _TEST_AREA:
917: .word L114
918: #
919: # TEST_AREA()
920: # {
921: jbr L116
922: L117:
923: #
924: # asm("rd_access:");
925: rd_access:
926: # asm("movl (r0),r12"); /* should cause protection fault exception !! */
927: movl (r0),r12
928: #
929: # /* Get back KERNEL privilege by causing a data not align fault */
930: # asm("movl align_f,r10");
931: movl align_f,r10
932: # asm("halt"); /* otherwise HALT .... */
933: halt
934: #
935: # asm("wr_access:");
936: wr_access:
937: # asm("movl $1,(r0)"); /* should cause protection fault exception !! */
938: movl $1,(r0)
939: #
940: # /* Get back KERNEL privilege by causing a data not align fault */
941: # asm("movl align_f,r10");
942: movl align_f,r10
943: # asm("halt"); /* otherwise HALT .... */
944: halt
945: # asm(".align 1"); /* Word align */
946: .align 1
947: # asm("align_f:");
948: align_f:
949: # asm(".long 0");
950: .long 0
951: # }
952: ret
953: .set L114,0x0
954: L116:
955: jbr L117
956: .data
957: .text
958: .align 1
959: .globl _prt_par
960: _prt_par:
961: .word L118
962: #
963: # /* Print fault parameters of memory management exceptions */
964: # prt_par(str,par)
965: # char *str;
966: # long *par;
967: # {
968: jbr L120
969: L121:
970: # writes(str);
971: pushl 4(fp)
972: callf $8,_writes
973: # writeh(*par++); writes(" ");
974: movl 8(fp),r0
975: addl2 $4,8(fp)
976: pushl (r0)
977: callf $8,_writeh
978: .data 1
979: L123:
980: .ascii " \0"
981: .text
982: pushl $L123
983: callf $8,_writes
984: # writeh(*par++); writes(" ");
985: movl 8(fp),r0
986: addl2 $4,8(fp)
987: pushl (r0)
988: callf $8,_writeh
989: .data 1
990: L124:
991: .ascii " \0"
992: .text
993: pushl $L124
994: callf $8,_writes
995: # writeh(*par++); writes(" ");
996: movl 8(fp),r0
997: addl2 $4,8(fp)
998: pushl (r0)
999: callf $8,_writeh
1000: .data 1
1001: L125:
1002: .ascii " \0"
1003: .text
1004: pushl $L125
1005: callf $8,_writes
1006: # writeh(*par); writec('\n');
1007: pushl *8(fp)
1008: callf $8,_writeh
1009: pushl $10
1010: callf $8,_writec
1011: # }
1012: ret
1013: .set L118,0x0
1014: L120:
1015: jbr L121
1016: .data
1017: .text
1018: .align 1
1019: .globl _chk_fpars
1020: _chk_fpars:
1021: .word L127
1022: #
1023: # /* This routine assumes that global pointer p_ptr points to the actual
1024: # parameters pushed on the stack, and exp_par0 is the 1 of the expected
1025: # parameters.
1026: # */
1027: # chk_fpars(msg)
1028: # char *msg;
1029: # { long *pars, *e_pars;
1030: jbr L129
1031: L130:
1032: # long act_param0, act_param1, act_param2, act_param3;
1033: #
1034: # e_pars = &exp_par0; /* pointer to expected parameters */
1035: movl $_exp_par0,-60(fp)
1036: # pars = p_ptr; /* pointer to actual parameters */
1037: movl _p_ptr,-56(fp)
1038: # act_param0 = *pars++;
1039: movl *-56(fp),-64(fp)
1040: addl2 $4,-56(fp)
1041: # act_param1 = *pars++;
1042: movl *-56(fp),-68(fp)
1043: addl2 $4,-56(fp)
1044: # act_param2 = *pars++;
1045: movl *-56(fp),-72(fp)
1046: addl2 $4,-56(fp)
1047: # act_param3 = (*pars) & 0xffffffc0; /* Mask out PSW flags */
1048: andl3 $-64,*-56(fp),r0
1049: movl r0,-76(fp)
1050: # if ((exp_par0 != act_param0) || (exp_par1 != act_param1) ||
1051: # (exp_par2 != act_param2) || (exp_par3 != act_param3)) {
1052: cmpl _exp_par0,-64(fp)
1053: jneq L9998
1054: cmpl _exp_par1,-68(fp)
1055: jneq L9998
1056: cmpl _exp_par2,-72(fp)
1057: jneq L9998
1058: cmpl _exp_par3,-76(fp)
1059: jeql L131
1060: L9998:
1061: # writes(msg);
1062: pushl 4(fp)
1063: callf $8,_writes
1064: # writes("** Error in fault paramters\n");
1065: .data 1
1066: L132:
1067: .ascii "** Error in fault paramters\12\0"
1068: .text
1069: pushl $L132
1070: callf $8,_writes
1071: # ac_error1();
1072: callf $4,_ac_error1
1073: # prt_par("** Expected : ",&exp_par0);
1074: .data 1
1075: L133:
1076: .ascii "** Expected : \0"
1077: .text
1078: pushl $_exp_par0
1079: pushl $L133
1080: callf $12,_prt_par
1081: # prt_par("** Actual : ",p_ptr);
1082: .data 1
1083: L134:
1084: .ascii "** Actual : \0"
1085: .text
1086: pushl _p_ptr
1087: pushl $L134
1088: callf $12,_prt_par
1089: # asm("halt");
1090: halt
1091: # }
1092: # }
1093: L131:
1094: ret
1095: .set L127,0x0
1096: L129:
1097: subl3 $76,fp,sp
1098: jbr L130
1099: .data
1100: .text
1101: .align 1
1102: .globl _ac_error1
1103: _ac_error1:
1104: .word L135
1105: #
1106: # ac_error1()
1107: # {
1108: jbr L137
1109: L138:
1110: # writes("** PC : "); writeh(Failpc); writec('\n');
1111: .data 1
1112: L139:
1113: .ascii "** PC : \0"
1114: .text
1115: pushl $L139
1116: callf $8,_writes
1117: pushl _Failpc
1118: callf $8,_writeh
1119: pushl $10
1120: callf $8,_writec
1121: # writes("** VA : "); writeh(test_va); writec('\n');
1122: .data 1
1123: L140:
1124: .ascii "** VA : \0"
1125: .text
1126: pushl $L140
1127: callf $8,_writes
1128: pushl _test_va
1129: callf $8,_writeh
1130: pushl $10
1131: callf $8,_writec
1132: # writes("** PSL : "); writeh(Tpsl); writec('\n');
1133: .data 1
1134: L141:
1135: .ascii "** PSL : \0"
1136: .text
1137: pushl $L141
1138: callf $8,_writes
1139: pushl _Tpsl
1140: callf $8,_writeh
1141: pushl $10
1142: callf $8,_writec
1143: # prt_base(test_va);
1144: pushl _test_va
1145: callf $8,_prt_base
1146: # }
1147: ret
1148: .set L135,0x0
1149: L137:
1150: jbr L138
1151: .data
1152: #
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.