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