|
|
1.1 root 1:
2: #include "definitions"
3: #include "data.h"
4:
5:
6: extern long iob0, iob1, ret_adr, savvec4, savvec5, savvec6, savvec7;
7: extern long *p_ptr, saved_sp, saved_fp, pcb0;
8: long reipc, exp_pc, act_pc, exp_sp, act_sp, exp_psl, act_psl, act_fvadr;
9:
10:
11: /* Demand paging with register mode
12: This test run virtual in P0 space,Kernel Privilege on Interrupt stack.
13: Boundery of virtual Page IOB0 and IOB1 are used in this test. Opcode of
14: the "clrl r5" instruction is moved to last byte in page IOB0 and operand
15: specifier is moved to 1st byte in page IOB1. PTE of Page IOB1 is then set
16: to invalid.
17: */
18:
19: dmp2()
20: {
21: asm("mfpr $SBR,_savvec4");
22: savvec4 |= (savvec4 | SADDR); /* Make it system address */
23: asm("mtpr _savvec4,$P0BR"); /* Double map P0PT to SPT */
24: asm("mfpr $SLR,_savvec4");
25: asm("mtpr _savvec4,$P0LR");
26:
27: asm("mtpr $6,$DCK");
28: asm("mtpr $0,$TBIA");
29: asm("mtpr $0,$PADC");
30: asm("mtpr $1,$MME"); /* Enable MME */
31: asm("jmp *$0f"); /* Go virtual */
32: asm("0:");
33: clrlr5();
34: asm("mtpr $0,$MME"); /* Back to physical */
35: asm("mtpr $0,$P0LR");
36: }
37:
38:
39: clrlr5()
40: { char *byte_ptr, *msg1, *msg2;
41: long ix, hdr_adr, pc_err, saved_pte, saved_vec1, saved_vec2;
42: long dummy, exp_fvadr;
43:
44: savvec4 = (long)&pcb0;
45: asm("mtpr _savvec4,$PCBB");
46:
47: /* Move code to boundery of test page */
48: exp_pc = ((TEST_PG-1)<<PGSHIFT)|(NBPG-1);
49: exp_fvadr = exp_pc + 1; /* fault at next byte */
50: byte_ptr = (char *)exp_pc;
51: for(ix=0;ix<I0;ix++) *byte_ptr++ = CLRL0[ix];
52: *byte_ptr++ = KCALL[0]; /* move KCALL instruction */
53: *byte_ptr = KCALL[1];
54:
55: fixpv_pte(P0BR,(TEST_PG-1),&saved_pte,(PTE_V|PTE_UW));
56: fixpv_pte(P0BR,TEST_PG,&saved_pte,PTE_UW); /* Invalid test page */
57: asm("movab trans_f0,_savvec4"); /* new exception handlers */
58: set_handler(TRANS_VEC,&saved_vec1,savvec4);
59:
60: asm("movab (sp),_savvec4");
61: savvec4 -= 16; /* KSP is 4 words below ISP */
62: asm("mtpr _savvec4,$KSP");
63: /* Set up to execute REI */
64: exp_psl = PSL_USR; /* PSL : user mode */
65: asm("pushl _exp_psl"); /* Push PSL on stack */
66: asm("pushl _exp_pc"); /* Push PC on stack */
67:
68: /* Use REI to switch to user mode */
69: asm("mtpr $1,$PACC"); /* Purge all code cache */
70: asm("d0rei:");
71: asm("rei");
72: asm("halt");
73: asm(".align 2");
74: asm("rtn_t0:");
75: asm("movab d0rei,_reipc");
76: if (act_pc != exp_pc) /* check if PC is backed up */
77: {
78: msg1 = "** PC pushed on the stack is not correct.\n";
79: d2err(msg1,act_pc,exp_pc,exp_pc,reipc,exp_fvadr);
80: }
81: if (act_fvadr != exp_fvadr) /* check VA at fault */
82: {
83: msg1 = "** Fault virtual address pushed on the stack is not correct.\n";
84: d2err(msg1,act_fvadr,exp_fvadr,exp_pc,reipc,exp_fvadr);
85: }
86: set_handler(TRANS_VEC,&dummy,saved_vec1);
87: fixpv_pte(P0BR,TEST_PG,&saved_pte,(PTE_V|PTE_UW));
88: asm("movab kcall_f0,_savvec4");
89: set_handler(CHMK_VEC,&saved_vec2,savvec4);
90: asm("pushl _exp_psl"); /* Push PSL on stack */
91: asm("pushl _exp_pc"); /* Push PC on stack */
92: asm("movl $0xffffffff,r5");
93: asm("d0rei1:");
94: asm("rei");
95: asm("halt");
96: asm(".align 2");
97: asm("rtn_t01:");
98: asm("movl r5,_savvec4");
99: asm("movab d0rei1,_reipc");
100: if (savvec4 != 0) /* Error !! */
101: {
102: msg1 = "\n** Incorrect result in R5 after instruction is restarted.\n";
103: d2err(msg1,savvec4,0,exp_pc,reipc,exp_fvadr);
104: }
105: set_handler(CHMK_VEC,&dummy,saved_vec2); /* Restore handler */
106: }
107:
108: new_hdr0()
109: {
110: asm(".align 2"); /* Longword align */
111: asm("trans_f0:"); /* Handler of translation fault */
112: asm("mtpr $0x1f,$IPL");
113: asm("movl (sp)+,r12"); /* Pop 1st two parameter */
114: asm("movl (sp)+,_act_fvadr"); /* Actual virtual addr at fault */
115: asm("movl (sp)+,_act_pc"); /* Actual PC */
116: asm("movl (sp)+,_act_psl"); /* Actual PSL */
117: asm("svpctx"); /* Switch back to ISP */
118: asm("jmp rtn_t0"); /* Return */
119:
120:
121: asm(".align 2"); /* Longword align */
122: asm("kcall_f0:"); /* Handler of KCALL */
123: asm("mtpr $0x1f,$IPL");
124: asm("svpctx"); /* Switch back to ISP */
125: asm("jmp rtn_t01"); /* Return */
126: }
127:
128: d2err(msg1,act,exp,pc,reipc,fva)
129: char *msg1;
130: long act, exp, pc, reipc, fva;
131: {
132: writes(msg1);
133: writes("\n** Actual : "); writeh(act);
134: writes("\n** Expect : "); writeh(exp);
135: writes("\n** PC : "); writeh(pc);
136: writes("\n** PC of REI : "); writeh(reipc);
137: writes("\n** VA that should cause fault : "); writeh(fva);
138: writec('\n');
139: asm("halt");
140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.