|
|
1.1 root 1: #include "data.h"
2: #include "definitions"
3:
4:
5:
6: /* Demand paging with 4 operands instruction
7: EMUL *12(r3)[r4], r5, *12(r6)[r7], *12(r10)[R9]
8: */
9:
10: long exp_psl, exp_result0, exp_result1, saved_vec1, saved_vec2, saved_pte;
11: long saved_pte2, *opa4, exp_pc, act_pc, act_result0, act_result1, temp_glb;
12: long d7pc, dummy, act_fvadr;
13: char *msg1, *msg2;
14: extern long iob1,iob2,iob3, u0p2pt, pcb0, savvec4, ret_adr, saved_sp, saved_fp;
15: extern long exp_fvadr, act_fvadr;
16:
17: dmp5()
18: {
19: asm("mfpr $SBR,_savvec4");
20: savvec4 |= (savvec4 | SADDR); /* Make it system address */
21: asm("mtpr _savvec4,$P0BR"); /* Double map P0PT to SPT */
22: asm("mfpr $SLR,_savvec4");
23: asm("mtpr _savvec4,$P0LR");
24:
25: asm("mtpr $6,$DCK");
26: asm("mtpr $0,$TBIA");
27: asm("mtpr $0,$PADC");
28: asm("mtpr $1,$MME"); /* Enable MME */
29: asm("jmp *$0f"); /* Go virtual */
30: asm("0:");
31:
32: dt5();
33: asm("mtpr $0,$MME");
34: asm("mtpr $0,$P0LR");
35: }
36:
37:
38: dt5()
39: { char *byte_ptr;
40: long ix, byte_no, dummy;
41:
42: savvec4 = (long)&pcb0;
43: asm("mtpr _savvec4,$PCBB");
44: fixpv_pte(P0BR,(TEST_PG-1),&saved_pte,(PTE_V|PTE_UW));
45: asm("movab prod,_opa4"); /* address of operand 4 */
46:
47: asm("movab opadr1,_savvec4");
48: savvec4 = (savvec4 >> PGSHIFT) & 0xfffff; /* Make test area */
49: fixpv_pte(P0BR,savvec4,&dummy,(PTE_V|PTE_UW)); /* User read/write */
50: fixpv_pte(P0BR,(savvec4+1),&dummy,(PTE_V|PTE_UW));
51:
52: for(byte_no=1;byte_no<I5;byte_no++)
53: {
54: /* Move code to boundery of test page */
55: exp_pc = ((TEST_PG-1)<<PGSHIFT)|(NBPG-byte_no);
56: byte_ptr = (char *)exp_pc;
57: for(ix=0;ix<I5;ix++) *byte_ptr++ = EMUL[ix];
58: *byte_ptr++ = KCALL[0]; /* move KCALL instruction */
59: *byte_ptr = KCALL[1];
60:
61: exp_fvadr = (TEST_PG<<PGSHIFT) & 0xfffffc00;
62: fixpv_pte(P0BR,TEST_PG,&saved_pte,PTE_UW); /* Set V bit off */
63: asm("movab prot_f5,_savvec4"); /* Set new exception handlers */
64: set_handler(TRANS_VEC,&saved_vec1,savvec4);
65: asm("movl fp,_saved_fp"); /* save FP to return */
66: asm("movab (sp),_savvec4");
67: savvec4 -= 160; /* KSP is 40 words below ISP */
68: asm("mtpr _savvec4,$KSP");
69:
70: exp_psl = PSL_USR; /* PSL : user mode */
71: asm("pushl _exp_psl"); /* Push PSL on stack */
72: asm("pushl _exp_pc"); /* Push PC on stack */
73:
74: opa4[0] = opa4[1] = 0xffffffff; /* result = dummy value */
75: exp_result0 = 0;
76: exp_result1 = 6; /* prod = (2*2) + 2 */
77: asm("movl $1,r4"); /* Set index value */
78: asm("movl $2,r5"); /* R5 = multiplicand */
79: asm("movl $1,r7");
80: asm("movl $1,r9");
81: asm("movab opadr1,r3"); /* Set base address of operand1 */
82: asm("movab opadr3,r6"); /* Set base address of operand3 */
83: asm("movab opadr4,r10"); /* Set base address of operand4 */
84: asm("mtpr $1,$PACC"); /* Purge all code cache */
85: asm("movab d7rei,_d7pc");
86: asm("d7rei:");
87: asm("rei"); /* Context switch to user */
88: asm("halt");
89:
90: asm(".align 2");
91: asm("rtn_t50:");
92: asm("movl _saved_fp,fp"); /* restore FP */
93: break; /* return from error ; stop test */
94: asm("rtn_t51:");
95: asm("movl _saved_fp,fp"); /* restore FP */
96: act_result0 = opa4[0];
97: act_result1 = opa4[1];
98:
99: set_handler(CHMK_VEC,&temp_glb,saved_vec2); /* restore CMHK vector */
100: if ( (act_result0!=exp_result0)||(act_result1!=exp_result1) )
101: {
102: msg1 = "** Incorrect result after instruction is restarted.\n";
103: d2err(msg1,act_result1,exp_result1,exp_pc,d7pc,exp_fvadr);
104: }
105: }
106: }
107:
108: prot_hdl5()
109: {
110: asm(".align 2");
111: asm("prot_f5:");
112: asm("mtpr $0x1f,$IPL");
113: asm("movl (sp)+,r12"); /* Ignore 1st parameter */
114: asm("movl (sp)+,_act_fvadr"); /* Actual VA at fault */
115:
116: asm("movl (sp),_act_pc"); /* Actual PC that caused fault */
117: asm("movab (sp),fp"); /* Set FP */
118: if (act_pc != exp_pc)
119: {
120: msg1="** PC pushed on the stack is not correct.\n";
121: d2err(msg1,act_pc,exp_pc,exp_pc,d7pc,exp_fvadr);
122: asm("svpctx"); /* Switch to ISP */
123: asm("jmp rtn_t50");
124: }
125: act_fvadr &= 0xfffffc00;
126: if (act_fvadr != exp_fvadr)
127: {
128: msg1="** Fault virtual address pushed on the stack is not correct.\n";
129: d2err(msg1,act_fvadr,exp_fvadr,exp_pc,d7pc,exp_fvadr);
130: asm("svpctx"); /* Switch to ISP */
131: asm("jmp rtn_t50");
132: }
133: else
134: {
135: asm("movab kcall5,_savvec4"); /* New handler for KCALL */
136: set_handler(CHMK_VEC,&saved_vec2,savvec4);
137: /* Restore TRANSLATION fault vector */
138: set_handler(TRANS_VEC,&dummy,saved_vec1);
139: /* Validate test page and restart instruction */
140: fixpv_pte(P0BR,TEST_PG,&saved_pte2,(PTE_V|PTE_UW));
141: asm("movab d71rei,_d7pc");
142: asm("d71rei:");
143: asm("rei");
144: }
145:
146: asm(".align 2");
147: asm("kcall5:");
148: asm("mtpr $0x1f,$IPL");
149: asm("svpctx"); /* Switch to ISP */
150: asm("jmp rtn_t51");
151:
152: }
153:
154:
155: TEST_AREA5()
156: {
157: asm(".align 2");
158: asm("opadr1:"); /* r3 point to here */
159: asm(".space 12"); /* 12 bytes for displacement */
160: asm(".long op1"); /* r3 point to here after add in displacement */
161: asm("op1:");
162: asm(".long 0"); /* indexed by r4 */
163: asm("mulr:");
164: asm(".long 2"); /* Multiplier = 2 */
165:
166:
167: asm("opadr3:"); /* r6 point to here */
168: asm(".space 12"); /* 12 bytes for displacement */
169: asm(".long op3"); /* r6 point to here after add in displacement */
170: asm("op3:");
171: asm(".long 0"); /* indexed by r7 */
172: asm("addop:");
173: asm(".long 2"); /* addend operand = 2 */
174:
175:
176: asm("opadr4:"); /* r10 point to here */
177: asm(".space 12"); /* 12 bytes for displacement */
178: asm(".long op4"); /* r8 point to here after add in displacement */
179: asm("op4:");
180: asm(".long 0"); /* indexed by r9 : quadword */
181: asm(".long 0");
182: asm("prod:");
183: asm(".space 16"); /* Quadword for result of EMUL */
184:
185: }
186:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.