|
|
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 _trans_excpt,4
29: .text
30: .align 1
31: .globl _pv_test
32: _pv_test:
33: .word L40
34: #
35: # #include "definitions"
36: #
37: #
38: # extern long iob0, iob1, iob2, iob3, ss1;
39: # extern long unused, u0p1pt, u0p2pt, scb, savvec4, savvec5, savvec6, savvec7;
40: # extern long *p_ptr, ret_adr, exp_par0, exp_par1, exp_par2, exp_par3;
41: # extern long act_par0, act_par1, act_par2, act_par3, saved_psl;
42: # extern long Failpc, Tpsl , test_va;
43: #
44: # /* The purpose of this test is to validate that TAHOE will check access
45: # protection bits before checking the valid of the PTE .
46: # This test run in user P0 space ,KERNEL privilege and try to access
47: # system and P1 space which have corresponding PTE set as :
48: # Protection bits : Kernel read only
49: # Valid bit : Off
50: # */
51: #
52: #
53: # long trans_excpt;
54: #
55: # pv_test()
56: # { long *pt_ptr;
57: jbr L42
58: L43:
59: #
60: # if (ss1)
61: tstl _ss1
62: jeql L44
63: # writes("** Subtest5 : order of memory management exceptions\n");
64: .data 1
65: L46:
66: .ascii "** Subtest5 : order of memory management exceptions\12\0"
67: .text
68: pushl $L46
69: callf $8,_writes
70: # pt_ptr = (long *)0;
71: L44:
72: clrl -56(fp)
73: # asm("mfpr $SBR,_savvec4");
74: mfpr $SBR,_savvec4
75: # savvec4 |= 0xc0000000; /* Make it system virtual address */
76: orl2 $-1073741824,_savvec4
77: # asm("mtpr _savvec4,$P0BR");
78: mtpr _savvec4,$P0BR
79: # asm("mfpr $SLR,_savvec4");
80: mfpr $SLR,_savvec4
81: # asm("mtpr _savvec4,$P0LR");
82: mtpr _savvec4,$P0LR
83: #
84: # asm("mtpr $4,$DCK");
85: mtpr $4,$DCK
86: # asm("mtpr $0,$TBIA");
87: mtpr $0,$TBIA
88: # asm("mtpr $0,$PADC");
89: mtpr $0,$PADC
90: # asm("mtpr $1,$MME"); /* Enable MME */
91: mtpr $1,$MME
92: # asm("jmp *$0f"); /* Go virtual .. */
93: jmp *$0f
94: # asm("0:");
95: 0:
96: #
97: # vp_tst(IOB0, SBR, SADDR);
98: pushl $-1073741824
99: pushl $0
100: andl3 $1073740800,$_iob0,r0
101: shrl $10,r0,r0
102: andl2 $1048575,r0
103: pushl r0
104: callf $16,_vp_tst
105: #
106: # /* Set up P1PT */
107: # pt_ptr = &u0p1pt;
108: movl $_u0p1pt,-56(fp)
109: # *pt_ptr = IOB1; /* 1st PTE of P1 mapped to IOB1 */
110: andl3 $1073740800,$_iob1,r0
111: shrl $10,r0,r0
112: andl2 $1048575,r0
113: movl r0,*-56(fp)
114: # savvec4 = ((long)pt_ptr) | SADDR;
115: orl3 $-1073741824,-56(fp),r0
116: movl r0,_savvec4
117: # asm("mtpr _savvec4,$P1BR");
118: mtpr _savvec4,$P1BR
119: # asm("mtpr $1,$P1LR");
120: mtpr $1,$P1LR
121: # vp_tst(TEST_PTEP1, P1BR, P1ADDR);
122: pushl $1073741824
123: pushl $4
124: pushl $0
125: callf $16,_vp_tst
126: #
127: # asm("mtpr $0,$MME"); /* Back to physical */
128: mtpr $0,$MME
129: # asm("mtpr $0,$P0LR"); /* Invalidate P0 space */
130: mtpr $0,$P0LR
131: # }
132: ret
133: .set L40,0x0
134: L42:
135: subl3 $56,fp,sp
136: jbr L43
137: .data
138: .text
139: .align 1
140: .globl _vp_tst
141: _vp_tst:
142: .word L48
143: #
144: #
145: # vp_tst(test_pte, pg_tbl, space)
146: # long test_pte, pg_tbl, space;
147: # {
148: jbr L50
149: L51:
150: # long lgword, pfn, saved_vec1, saved_pte, test_adr, access_md;
151: # long *scb_base0, *scb_base1, saved_vec2, tflag;
152: # char *msg1, *msg2;
153: #
154: # trans_excpt = tflag = 0;
155: clrl -92(fp)
156: movl -92(fp),_trans_excpt
157: # /* Set v and protection bits of target PTE in SPT */
158: # access_md = PTE_NOACC;
159: clrl -76(fp)
160: # fixpv_pte(pg_tbl,test_pte,&saved_pte,access_md);
161: pushl -76(fp)
162: subl3 $68,fp,r0
163: pushl r0
164: pushl 4(fp)
165: pushl 8(fp)
166: callf $20,_fixpv_pte
167: #
168: # /* Set expected parameter words */
169: # exp_par0 = 4; /* protection violation, write access */
170: movl $4,_exp_par0
171: # test_adr = ( (test_pte) << PGSHIFT) | space;
172: shll $10,4(fp),r0
173: orl2 12(fp),r0
174: movl r0,-72(fp)
175: # test_va = exp_par1 = test_adr;
176: movl -72(fp),_exp_par1
177: movl _exp_par1,r0
178: movl r0,_test_va
179: # asm("movab sys_wr,_exp_par2"); /* PC at faulting instruction */
180: movab sys_wr,_exp_par2
181: # Failpc = exp_par2;
182: movl _exp_par2,_Failpc
183: # exp_par3 = 0;
184: clrl _exp_par3
185: #
186: # /* Set handler of protection fault */
187: # scb_base0 = scb_base1 = &scb;
188: movl $_scb,-84(fp)
189: movl -84(fp),-80(fp)
190: # scb_base0 += PROT_VEC;
191: addl2 $188,-80(fp)
192: # saved_vec1 = *scb_base0; /* Save original vector */
193: movl *-80(fp),-64(fp)
194: # asm("movab prot_flt4,_savvec4");
195: movab prot_flt4,_savvec4
196: # *scb_base0 = savvec4; /* Set new vector */
197: movl _savvec4,*-80(fp)
198: #
199: # /* Set handler of translation fault */
200: # scb_base1 += TRANS_VEC;
201: addl2 $192,-84(fp)
202: # saved_vec2 = *scb_base1; /* Save original vector */
203: movl *-84(fp),-88(fp)
204: # asm("movab trans_flt4,_savvec4");
205: movab trans_flt4,_savvec4
206: # *scb_base1 = savvec4; /* Set new vector */
207: movl _savvec4,*-84(fp)
208: #
209: # asm("movpsl _exp_par3"); /* Set expected PSL */
210: movpsl _exp_par3
211: # exp_par3 &= 0xffffffc0; /* Mask out PSW flags */
212: andl2 $-64,_exp_par3
213: # Tpsl = exp_par3;
214: movl _exp_par3,_Tpsl
215: # asm("movl _exp_par1,r0");
216: movl _exp_par1,r0
217: # asm("sys_wr:");
218: sys_wr:
219: # asm("movl $1,(r0)"); /* Should cause exception right here */
220: movl $1,(r0)
221: # tflag++;
222: incl -92(fp)
223: # writes("** Expected protection fault did not occur when write\n");
224: .data 1
225: L53:
226: .ascii "** Expected protection fault did not occur when write\12\0"
227: .text
228: pushl $L53
229: callf $8,_writes
230: # if (space==SADDR)
231: cmpl 12(fp),$-1073741824
232: jneq L54
233: # writes(" to a page in SPT that is No_access and V_bit off\n");
234: .data 1
235: L55:
236: .ascii " to a page in SPT that is No_access and V_bit off\12\0"
237: .text
238: pushl $L55
239: callf $8,_writes
240: # else
241: jbr L56
242: L54:
243: # writes(" to a page in P1PT that is No_access and V_bit off\n");
244: .data 1
245: L57:
246: .ascii " to a page in P1PT that is No_access and V_bit off\12\0"
247: .text
248: pushl $L57
249: callf $8,_writes
250: L56:
251: # ac_error1();
252: callf $4,_ac_error1
253: # asm("halt");
254: halt
255: # asm("jmp vp_retpc");
256: jmp vp_retpc
257: #
258: # asm("at_flt:")
259: at_flt:
260: # tflag++;
261: incl -92(fp)
262: # writes("** Translation fault occured when write to a page \n");
263: .data 1
264: L59:
265: .ascii "** Translation fault occured when write to a page \12\0"
266: .text
267: pushl $L59
268: callf $8,_writes
269: # if (space==SADDR)
270: cmpl 12(fp),$-1073741824
271: jneq L60
272: # writes(" in SPT that is No_access and V_bit off\n");
273: .data 1
274: L61:
275: .ascii " in SPT that is No_access and V_bit off\12\0"
276: .text
277: pushl $L61
278: callf $8,_writes
279: # else
280: jbr L62
281: L60:
282: # writes(" in P1PT that is No_access and V_bit off\n");
283: .data 1
284: L63:
285: .ascii " in P1PT that is No_access and V_bit off\12\0"
286: .text
287: pushl $L63
288: callf $8,_writes
289: L62:
290: # ac_error1();
291: callf $4,_ac_error1
292: # asm("halt");
293: halt
294: #
295: # asm("vp_retpc:");
296: vp_retpc:
297: # *scb_base0 = saved_vec1; /* Restore original vector */
298: movl -64(fp),*-80(fp)
299: # *scb_base1 = saved_vec2;
300: movl -88(fp),*-84(fp)
301: # access_md = saved_pte & 0xf8000000; /* Restore test PTE in SPT */
302: andl3 $-134217728,-68(fp),r0
303: movl r0,-76(fp)
304: # pfn = saved_pte & 0x3fffff;
305: andl3 $4194303,-68(fp),r0
306: movl r0,-60(fp)
307: # fixpfn_pte(SBR,test_pte,&saved_pte,pfn);
308: pushl -60(fp)
309: subl3 $68,fp,r0
310: pushl r0
311: pushl 4(fp)
312: pushl $0
313: callf $20,_fixpfn_pte
314: # fixpv_pte(SBR,test_pte,&saved_pte,access_md);
315: pushl -76(fp)
316: subl3 $68,fp,r0
317: pushl r0
318: pushl 4(fp)
319: pushl $0
320: callf $20,_fixpv_pte
321: #
322: # if (tflag==0)
323: tstl -92(fp)
324: jneq L65
325: # chk_fpars("");
326: .data 1
327: L67:
328: .ascii "\0"
329: .text
330: pushl $L67
331: callf $8,_chk_fpars
332: # }
333: L65:
334: ret
335: .set L48,0x0
336: L50:
337: subl3 $100,fp,sp
338: jbr L51
339: .data
340: .text
341: .align 1
342: .globl _ptf_handler
343: _ptf_handler:
344: .word L69
345: #
346: #
347: #
348: #
349: # ptf_handler()
350: # {
351: jbr L71
352: L72:
353: # asm(".align 2");
354: .align 2
355: # /* Handler of protection fault exception. */
356: # asm("prot_flt4:");
357: prot_flt4:
358: # asm("movab _act_par0,_p_ptr"); /* Set pointer to fault parameters */
359: movab _act_par0,_p_ptr
360: # asm("movl (sp)+,_act_par0");
361: movl (sp)+,_act_par0
362: # asm("movl (sp)+,_act_par1");
363: movl (sp)+,_act_par1
364: # asm("movl (sp)+,_act_par2");
365: movl (sp)+,_act_par2
366: # asm("movl (sp)+,_act_par3");
367: movl (sp)+,_act_par3
368: #
369: # /* return to test */
370: # if (trans_excpt==0)
371: tstl _trans_excpt
372: jneq L73
373: # asm("jmp vp_retpc");
374: jmp vp_retpc
375: # else
376: jbr L74
377: L73:
378: # asm("jmp at_flt");
379: jmp at_flt
380: L74:
381: #
382: # asm(".align 2");
383: .align 2
384: # /* Handler of translation not valid fault. */
385: # asm("trans_flt4:");
386: trans_flt4:
387: # trans_excpt++; /* Set flag */
388: incl _trans_excpt
389: # asm("jmp prot_flt4");
390: jmp prot_flt4
391: # }
392: ret
393: .set L69,0x0
394: L71:
395: jbr L72
396: .data
397: #
398: #
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.