//Do a full lookup on the UTLB entry's u32 mmu_full_lookup(u32 va, u32& idx, u32& rv) { CCN_MMUCR.URC++; if (CCN_MMUCR.URB == CCN_MMUCR.URC) CCN_MMUCR.URC = 0; u32 entry = 0; u32 nom = 0; for (u32 i = 0; i<64; i++) { //verify(sz!=0); if (mmu_match(va, UTLB[i].Address, UTLB[i].Data)) { entry = i; nom++; u32 sz = UTLB[i].Data.SZ1 * 2 + UTLB[i].Data.SZ0; u32 mask = mmu_mask[sz]; //VPN->PPN | low bits rv = ((UTLB[i].Data.PPN << 10)&mask) | (va&(~mask)); } } if (nom != 1) { if (nom) return MMU_ERROR_TLB_MHIT; return MMU_ERROR_TLB_MISS; } idx = entry; return MMU_ERROR_NONE; }
void __fastcall WriteMem_P4(u32 addr,T data) { /*if (((addr>>26)&0x7)==7) { WriteMem_area7(addr,data,sz); return; }*/ switch((addr>>24)&0xFF) { case 0xE0: case 0xE1: case 0xE2: case 0xE3: log("Unhandled p4 Write [Store queue] 0x%x",addr); break; case 0xF0: //log("Unhandled p4 Write [Instruction cache address array] 0x%x = %x\n",addr,data); return; break; case 0xF1: //log("Unhandled p4 Write [Instruction cache data array] 0x%x = %x\n",addr,data); return; break; case 0xF2: //log("Unhandled p4 Write [Instruction TLB address array] 0x%x = %x\n",addr,data); { u32 entry=(addr>>8)&3; ITLB[entry].Address.reg_data=data & 0xFFFFFCFF; ITLB[entry].Data.V=((u32)data>>8) & 1; ITLB_Sync(entry); return; } break; case 0xF3: if (addr&0x800000) { log("Unhandled p4 Write [Instruction TLB data array 2] 0x%x = %x\n",addr,data); } else { //log("Unhandled p4 Write [Instruction TLB data array 1] 0x%x = %x\n",addr,data); u32 entry=(addr>>8)&3; ITLB[entry].Data.reg_data=data; ITLB_Sync(entry); return; } break; case 0xF4: { //int W,Set,A; //W=(addr>>14)&1; //A=(addr>>3)&1; //Set=(addr>>5)&0xFF; //log("Unhandled p4 Write [Operand cache address array] %d:%d,%d 0x%x = %x\n",Set,W,A,addr,data); return; } break; case 0xF5: //log("Unhandled p4 Write [Operand cache data array] 0x%x = %x\n",addr,data); return; break; case 0xF6: { if (addr&0x80) { //log("Unhandled p4 Write [Unified TLB address array , Associative Write] 0x%x = %x\n",addr,data); CCN_PTEH_type t; t.reg_data=data; u32 va=t.VPN<<10; for (int i=0;i<64;i++) { if (mmu_match(va,UTLB[i].Address,UTLB[i].Data)) { UTLB_SyncUnmap(i); UTLB[i].Data.V=((u32)data>>8)&1; UTLB[i].Data.D=((u32)data>>9)&1; UTLB_SyncMap(i); } } for (int i=0;i<4;i++) { if (mmu_match(va,ITLB[i].Address,ITLB[i].Data)) { ITLB[i].Data.V=((u32)data>>8)&1; ITLB[i].Data.D=((u32)data>>9)&1; ITLB_Sync(i); } } }