From a8722d8c562ca2dc42485bb97aac6f76d1bd058c Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:47:41 -0400 Subject: [PATCH] tcms shouldn't be cacheable --- src/CP15.cpp | 319 +++++++++++++++++++++++---------------------------- 1 file changed, 145 insertions(+), 174 deletions(-) diff --git a/src/CP15.cpp b/src/CP15.cpp index 7cf8109f..fd088b1f 100644 --- a/src/CP15.cpp +++ b/src/CP15.cpp @@ -540,17 +540,7 @@ u32 ARMv5::DCacheLookup(const u32 addr) // See arm946e-s Rev 1 technical manual, 2.3.15 "Register 15, test State Register") WriteBufferDrain(); DataCycles = NDS.ARM9MemTimings[tag >> 14][2]; - if (addr < ITCMSize) - { - return *(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)]; - } else - if ((addr & DTCMMask) == DTCMBase) - { - return *(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)]; - } else - { - return BusRead32(addr & ~3); - } + return BusRead32(addr & ~3); } DataCycles += 1; DataRegion = Mem9_DCache; @@ -567,17 +557,7 @@ u32 ARMv5::DCacheLookup(const u32 addr) { WriteBufferDrain(); DataCycles = NDS.ARM9MemTimings[tag >> 14][2]; - if (addr < ITCMSize) - { - return *(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)]; - } else - if ((addr & DTCMMask) == DTCMBase) - { - return *(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)]; - } else - { - return BusRead32(addr & ~3); - } + return BusRead32(addr & ~3); } u32 line; @@ -620,17 +600,7 @@ u32 ARMv5::DCacheLookup(const u32 addr) //Log(LogLevel::Debug,"DCache miss, load @ %08x\n", tag); for (int i = 0; i < DCACHE_LINELENGTH; i+=sizeof(u32)) { - if (tag+i < ITCMSize) - { - ptr[i >> 2] = *(u32*)&ITCM[(tag+i) & (ITCMPhysicalSize - 1)]; - } else - if (((tag+i) & DTCMMask) == DTCMBase) - { - ptr[i >> 2] = *(u32*)&DTCM[(tag+i) & (DTCMPhysicalSize - 1)]; - } else - { - ptr[i >> 2] = BusRead32(tag+i); - } + ptr[i >> 2] = BusRead32(tag+i); //Log(LogLevel::Debug,"DCache store @ %08x: %08x in set %i, line %i\n", tag+i, *(u32*)&ptr[i >> 2], line & 3, line >> 2); } @@ -1783,6 +1753,17 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) DataRegion = Mem9_Null; return 0; } + + if (addr < ITCMSize) + { + CodeCycles = 1; + + if (NDS.ARM9Timestamp < ITCMTimestamp) NDS.ARM9Timestamp = ITCMTimestamp; + NDS.ARM9Timestamp += CodeCycles; + if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual; + DataRegion = Mem9_Null; + return *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)]; + } #if !DISABLE_ICACHE #ifdef JIT_ENABLED @@ -1799,17 +1780,6 @@ u32 ARMv5::CodeRead32(u32 addr, bool branch) } #endif - if (addr < ITCMSize) - { - CodeCycles = 1; - - if (NDS.ARM9Timestamp < ITCMTimestamp) NDS.ARM9Timestamp = ITCMTimestamp; - NDS.ARM9Timestamp += CodeCycles; - if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual; - DataRegion = Mem9_Null; - return *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)]; - } - CodeCycles = MemTimings[addr >> 12][0]; if (CodeCycles == 0xFF) // cached memory. hax { @@ -1848,6 +1818,22 @@ bool ARMv5::DataRead8(u32 addr, u32* val) DataCycles = 1; return false; } + + if (addr < ITCMSize) + { + DataCycles = 1; + ITCMTimestamp = NDS.ARM9Timestamp + DataCycles; + DataRegion = Mem9_ITCM; + *val = *(u8*)&ITCM[addr & (ITCMPhysicalSize - 1)]; + return true; + } + if ((addr & DTCMMask) == DTCMBase) + { + DataCycles = 1; + DataRegion = Mem9_DTCM; + *val = *(u8*)&DTCM[addr & (DTCMPhysicalSize - 1)]; + return true; + } #if !DISABLE_DCACHE #ifdef JIT_ENABLED @@ -1865,22 +1851,6 @@ bool ARMv5::DataRead8(u32 addr, u32* val) } } #endif - - if (addr < ITCMSize) - { - DataCycles = 1; - ITCMTimestamp = NDS.ARM9Timestamp + DataCycles; - DataRegion = Mem9_ITCM; - *val = *(u8*)&ITCM[addr & (ITCMPhysicalSize - 1)]; - return true; - } - if ((addr & DTCMMask) == DTCMBase) - { - DataCycles = 1; - DataRegion = Mem9_DTCM; - *val = *(u8*)&DTCM[addr & (DTCMPhysicalSize - 1)]; - return true; - } WriteBufferDrain(); @@ -1910,23 +1880,7 @@ bool ARMv5::DataRead16(u32 addr, u32* val) DataCycles = 1; return false; } - - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - DataCycles = 0; - *val = (DCacheLookup(addr) >> (8* (addr & 2))) & 0xffff; - return true; - } - } - } - #endif + addr &= ~1; if (addr < ITCMSize) @@ -1944,6 +1898,23 @@ bool ARMv5::DataRead16(u32 addr, u32* val) *val = *(u16*)&DTCM[addr & (DTCMPhysicalSize - 1)]; return true; } + + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + DataCycles = 0; + *val = (DCacheLookup(addr) >> (8* (addr & 2))) & 0xffff; + return true; + } + } + } + #endif WriteBufferDrain(); @@ -1976,6 +1947,22 @@ bool ARMv5::DataRead32(u32 addr, u32* val) addr &= ~3; + if (addr < ITCMSize) + { + DataCycles = 1; + ITCMTimestamp = NDS.ARM9Timestamp + DataCycles; + DataRegion = Mem9_ITCM; + *val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)]; + return true; + } + if ((addr & DTCMMask) == DTCMBase) + { + DataCycles = 1; + DataRegion = Mem9_DTCM; + *val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)]; + return true; + } + #if !DISABLE_DCACHE #ifdef JIT_ENABLED if (!NDS.IsJITEnabled()) @@ -1993,22 +1980,6 @@ bool ARMv5::DataRead32(u32 addr, u32* val) } #endif - if (addr < ITCMSize) - { - DataCycles = 1; - ITCMTimestamp = NDS.ARM9Timestamp + DataCycles; - DataRegion = Mem9_ITCM; - *val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 1)]; - return true; - } - if ((addr & DTCMMask) == DTCMBase) - { - DataCycles = 1; - DataRegion = Mem9_DTCM; - *val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 1)]; - return true; - } - WriteBufferDrain(); NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); @@ -2039,22 +2010,6 @@ bool ARMv5::DataRead32S(u32 addr, u32* val) addr &= ~3; - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - *val = DCacheLookup(addr); - return true; - } - } - } - #endif - if (addr < ITCMSize) { DataCycles += 1; @@ -2071,6 +2026,22 @@ bool ARMv5::DataRead32S(u32 addr, u32* val) return true; } + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + *val = DCacheLookup(addr); + return true; + } + } + } + #endif + WriteBufferDrain(); NDS.ARM9Timestamp += DataCycles; @@ -2104,22 +2075,6 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) return false; } - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - if (DCacheWrite8(addr, val)) - return true; - } - } - } - #endif - if (addr < ITCMSize) { DataCycles = 1; @@ -2139,6 +2094,22 @@ bool ARMv5::DataWrite8(u32 addr, u8 val) return true; } + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + if (DCacheWrite8(addr, val)) + return true; + } + } + } + #endif + if (!(PU_Map[addr>>12] & (0x30))) { NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); @@ -2180,22 +2151,6 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) addr &= ~1; - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - if (DCacheWrite16(addr, val)) - return true; - } - } - } - #endif - if (addr < ITCMSize) { DataCycles = 1; @@ -2215,6 +2170,22 @@ bool ARMv5::DataWrite16(u32 addr, u16 val) return true; } + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + if (DCacheWrite16(addr, val)) + return true; + } + } + } + #endif + if (!(PU_Map[addr>>12] & 0x30)) { NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); @@ -2256,23 +2227,6 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) addr &= ~3; - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - DataCycles = 0; - if (DCacheWrite32(addr, val)) - return true; - } - } - } - #endif - if (addr < ITCMSize) { DataCycles = 1; @@ -2292,6 +2246,23 @@ bool ARMv5::DataWrite32(u32 addr, u32 val) return true; } + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + DataCycles = 0; + if (DCacheWrite32(addr, val)) + return true; + } + } + } + #endif + if (!(PU_Map[addr>>12] & 0x30)) { NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1); @@ -2332,22 +2303,6 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) addr &= ~3; - #if !DISABLE_DCACHE - #ifdef JIT_ENABLED - if (!NDS.IsJITEnabled()) - #endif - { - if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) - { - if (IsAddressDCachable(addr)) - { - if (DCacheWrite32(addr, val)) - return true; - } - } - } - #endif - if (addr < ITCMSize) { DataCycles += 1; @@ -2367,6 +2322,22 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val) return true; } + #if !DISABLE_DCACHE + #ifdef JIT_ENABLED + if (!NDS.IsJITEnabled()) + #endif + { + if (CP15Control & CP15_CACHE_CR_DCACHEENABLE) + { + if (IsAddressDCachable(addr)) + { + if (DCacheWrite32(addr, val)) + return true; + } + } + } + #endif + if (!(PU_Map[addr>>12] & 0x30)) { DataCycles += (((NDS.ARM9Timestamp + DataCycles) + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1)) - (NDS.ARM9Timestamp + DataCycles));