|
|
1.1 root 1: #include "data.h"
2:
3: #include "definitions"
4:
5:
6: long exp_psl, exp_pc, act_pc, exp_result, act_result, exp_sp, act_sp;
7: long dummy, *opr_adr, *fault_vadr, saved_vec1, saved_vec2, saved_pte, temp_glb;
8: long d6pc;
9: extern long exp_fvadr, act_fvadr;
10: char *msg1, *msg2, *bptr;
11:
12:
13: extern long iob1, iob2, iob3, u0p2pt, pcb0, savvec4, savvec5, savvec6, savvec7;
14: extern long ret_adr, saved_sp, saved_fp, *p_ptr;
15:
16:
17:
18: /* Demand paging with longword relative deferred indexed
19: Boundery of virtual Page _iob0 and _iob1 are used in this test. Opcodes of
20: the "clrl *loc[r6]" instruction (loc is 1 page away from PC) is moved
21: to last byte in page _iob0 and operand specifiers are moved to 1st bytes
22: in page _iob1. PTE of Page _iob1 is then set to invalid.
23: */
24:
25:
26: dmp4()
27: {
28: asm("mfpr $SBR,_savvec4");
29: savvec4 |= (savvec4 | SADDR); /* Make it system address */
30: asm("mtpr _savvec4,$P0BR"); /* Double map P0PT to SPT */
31: asm("mfpr $SLR,_savvec4");
32: asm("mtpr _savvec4,$P0LR");
33:
34: asm("mtpr $6,$DCK");
35: asm("mtpr $0,$TBIA");
36: asm("mtpr $0,$PADC");
37: asm("mtpr $1,$MME"); /* Enable MME */
38: asm("jmp *$0f"); /* Go virtual */
39: asm("0:");
40: dpt4();
41: asm("mtpr $0,$MME");
42: asm("mtpr $0,$P0LR");
43: }
44:
45:
46: dpt4()
47: { char *byte_ptr;
48: long ix, byte_no;
49:
50: savvec4 = (long)&pcb0;
51: asm("mtpr _savvec4,$PCBB"); /* Set PCBB */
52: asm("movab act_opr,_savvec4"); /* Make test loc user R/W */
53: savvec4 = (savvec4 >> PGSHIFT) & 0xfffff;
54: fixpv_pte(P0BR,savvec4,&saved_pte,(PTE_V|PTE_UW));
55:
56: for(byte_no=1;byte_no<I4;byte_no++)
57: {
58: /* Move code to boundery of test page */
59: exp_pc = ((TEST_PG-1)<<PGSHIFT)|(NBPG-byte_no);
60: byte_ptr = (char *)exp_pc;
61: for(ix=0;ix<I4;ix++) *byte_ptr++ = CLRL4[ix];
62: bptr = byte_ptr - 1; /* Point to last byte : displacement */
63: *byte_ptr++ = KCALL[0]; /* move KCALL instruction */
64: *byte_ptr = KCALL[1];
65:
66: /* Compute address of operand */
67: opr_adr = (long *) (exp_pc + I4); /* PC after fetching instruction */
68: opr_adr = (long *)((long)opr_adr+NBPG-4); /* PC after add in displ. */
69:
70: /* Make data longword align */
71: switch ( ((long)opr_adr) & 0x3)
72: {
73: case 1 : { opr_adr = (long *)( (long)opr_adr + 3);
74: *bptr = 0xff; /* Modify displacement */
75: break; }
76: case 2 : { opr_adr = (long *)( (long)opr_adr + 2);
77: *bptr = 0xfe; /* Modify displacement */
78: break; }
79: case 3 : { opr_adr = (long *)( (long)opr_adr + 1);
80: *bptr = 0xfd; /* Modify displacement */
81: break; }
82: }
83: savvec6 = (long)opr_adr; /* Make base addr user READ/WRITE */
84: savvec6 = (savvec6 >> PGSHIFT) & 0xfffff;
85: fixpv_pte(P0BR,savvec6,&saved_pte,(PTE_V|PTE_UW));
86: fixpv_pte(P0BR,(savvec6+1),&saved_pte,(PTE_V|PTE_UW));
87:
88: asm("movab bopr_t4,_savvec4");
89: asm("movl _savvec4,*_opr_adr"); /* Set base addr of operand */
90: asm("movl $0xffffffff,act_opr"); /* Set dummy value in operand */
91:
92: fixpv_pte(P0BR,(TEST_PG-1),&saved_pte,(PTE_V|PTE_UW));
93:
94: /* Invalidate PTE of test page */
95: exp_fvadr = (TEST_PG<<PGSHIFT) & 0xfffffc00;
96: fixpv_pte(P0BR,TEST_PG,&saved_pte,PTE_UW);
97:
98: /* Set new exception handlers */
99: asm("movab trans_f4,_savvec4");
100: set_handler(TRANS_VEC,&saved_vec1,savvec4);
101:
102: asm("movab (sp),_savvec4");
103: savvec4 -= 16; /* KSP is 4 words below ISP */
104: asm("mtpr _savvec4,$KSP");
105:
106: asm("movl fp,_saved_fp"); /* save FP to return */
107: exp_result = 0;
108: exp_psl = PSL_USR; /* PSL : user mode */
109: asm("pushl _exp_psl"); /* Push PSL on stack */
110: asm("pushl _exp_pc"); /* Push PC on stack */
111:
112: /* Set up for CLRL *loc[r6] */
113: asm("movl $1,r6"); /* Set index value in r6 */
114: asm("mtpr $1,$PACC"); /* Purge all code cache */
115: asm("movab d6rei,_d6pc");
116: asm("d6rei:");
117: asm("rei");
118: asm("halt");
119:
120: asm(".align 2");
121: asm("rtn_t40:"); /* Return from error */
122: asm("movl _saved_fp,fp"); /* restore FP */
123: break;
124: asm("rtn_t41:");
125: asm("movl _saved_fp,fp"); /* restore FP */
126: asm("movl act_opr,_act_result"); /* Get actual result */
127: if (act_result != exp_result)
128: {
129: msg1 = "** Incorrect result after instruction is restarted.\n";
130: d2err(msg1,act_result,exp_result,exp_pc,d6pc,exp_fvadr);
131: }
132: set_handler(CHMK_VEC,&dummy,saved_vec2); /* Restore KCALL vector */
133: }
134: }
135:
136:
137:
138:
139: new_hdr4()
140: {
141:
142: asm(".align 2"); /* Longword align */
143: asm("trans_f4:");
144:
145: asm("mtpr $0x1f,$IPL");
146: asm("movl (sp)+,r12"); /* Ignore 1st parameter */
147: asm("movl (sp)+,_act_fvadr"); /* Actual VA at fault */
148: asm("movl (sp),_act_pc"); /* PC that caused fault */
149: asm("movab (sp),fp"); /* set new frame pointer */
150: if ( act_pc != exp_pc )
151: { /* Error in PC */
152: msg1="** PC pushed on the stack is not correct.\n";
153: d2err(msg1,act_pc,exp_pc,exp_pc,d6pc,exp_fvadr);
154: asm("svpctx"); /* Back to ISP */
155: asm("jmp rtn_t40"); /* return */
156: }
157: if ( (act_fvadr & 0xfffffc00) != (exp_fvadr & 0xfffffc00) )
158: { /* Error in PC */
159: msg1="** Fault virtual address pushed on the stack is not correct\n";
160: d2err(msg1,(act_fvadr&0xfffffc00),(exp_fvadr&0xfffffc00),exp_pc,d6pc,exp_fvadr);
161: asm("svpctx"); /* Back to ISP */
162: asm("jmp rtn_t40"); /* return */
163: }
164: else
165: {
166: /* Set V bit and restart instruction at PC */
167: fixpv_pte(P0BR,TEST_PG,&saved_pte,(PTE_V|PTE_UW));
168: asm("movab kcall4,_savvec4"); /* New handler for KCALL */
169: set_handler(CHMK_VEC,&saved_vec2,savvec4);
170: /* restore original vector of TRANSLATION fault */
171: set_handler(TRANS_VEC,&temp_glb,saved_vec1);
172: asm("movab d61rei,_d6pc");
173: asm("d61rei:");
174: asm("rei");
175: asm("halt");
176: }
177:
178: asm(".align 2");
179: asm("kcall4:");
180: asm("mtpr $0x1f,$IPL");
181: asm("svpctx"); /* Back to ISP */
182: asm("jmp rtn_t41");
183: }
184:
185: t_area4()
186: {
187: asm(".align 2");
188: asm("bopr_t4:");
189: asm(".long 0");
190: asm("act_opr:");
191: asm(".long 0"); /* Actual operand */
192: }
193:
194:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.