void _fastcall DoTLBMiss ( BOOL DelaySlot, DWORD BadVaddr ) { CAUSE_REGISTER = EXC_RMISS; BAD_VADDR_REGISTER = BadVaddr; CONTEXT_REGISTER &= 0xFF80000F; CONTEXT_REGISTER |= (BadVaddr >> 9) & 0x007FFFF0; ENTRYHI_REGISTER = (BadVaddr & 0xFFFFE000); if ((STATUS_REGISTER & STATUS_EXL) == 0) { if (DelaySlot) { CAUSE_REGISTER |= CAUSE_BD; EPC_REGISTER = PROGRAM_COUNTER - 4; } else { EPC_REGISTER = PROGRAM_COUNTER; } if (AddressDefined(BadVaddr)) { PROGRAM_COUNTER = 0x80000180; } else { PROGRAM_COUNTER = 0x80000000; } STATUS_REGISTER |= STATUS_EXL; } else { #ifndef EXTERNAL_RELEASE DisplayError("EXL Set\nAddress Defined: %s",AddressDefined(BadVaddr)?"TRUE":"FALSE"); #endif PROGRAM_COUNTER = 0x80000180; } }
void DoTLBMiss ( usf_state_t * state, uint32_t DelaySlot, uint32_t BadVaddr ) { CAUSE_REGISTER = EXC_RMISS; BAD_VADDR_REGISTER = BadVaddr; CONTEXT_REGISTER &= 0xFF80000F; CONTEXT_REGISTER |= (BadVaddr >> 9) & 0x007FFFF0; ENTRYHI_REGISTER = (BadVaddr & 0xFFFFE000); if ((STATUS_REGISTER & STATUS_EXL) == 0) { if (DelaySlot) { CAUSE_REGISTER |= CAUSE_BD; EPC_REGISTER = state->PROGRAM_COUNTER - 4; } else { EPC_REGISTER = state->PROGRAM_COUNTER; } if (AddressDefined(state, BadVaddr)) { state->PROGRAM_COUNTER = 0x80000180; } else { state->PROGRAM_COUNTER = 0x80000000; } STATUS_REGISTER |= STATUS_EXL; } else { state->PROGRAM_COUNTER = 0x80000180; } }