|
|
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.