Fixed an issue with caclulating DTCM/ITCM masks after addr was declared constant

Encapsuled the cache features in #if to disable the features via compile flags
This commit is contained in:
DesperateProgrammer 2024-02-06 10:18:53 +01:00
parent a8306f2aa0
commit 4164687bd2
1 changed files with 218 additions and 187 deletions

View File

@ -623,10 +623,11 @@ u32 ARMv5::DCacheLookup(const u32 addr)
u32* ptr = (u32 *)&DCache[line << DCACHE_LINELENGTH_LOG2];
DataCycles = 0;
#if !DISABLE_CACHEWRITEBACK
// Before we fill the cacheline, we need to write back dirty content
// Datacycles will be incremented by the required cycles to do so
DCacheClearByASetAndWay(line & (DCACHE_SETS-1), line >> DCACHE_SETS_LOG2);
#endif
//Log(LogLevel::Debug,"DCache miss, load @ %08x\n", tag);
for (int i = 0; i < DCACHE_LINELENGTH; i+=sizeof(u32))
{
@ -667,7 +668,8 @@ bool ARMv5::DCacheWrite32(const u32 addr, const u32 val)
u32 *cacheLine = (u32 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 2] = val;
DataCycles = 1;
//if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
#if !DISABLE_CACHEWRITEBACK
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
{
if (addr & (DCACHE_LINELENGTH / 2))
{
@ -680,6 +682,7 @@ bool ARMv5::DCacheWrite32(const u32 addr, const u32 val)
// just mark dirty and abort the data write through the bus
return true;
}
#endif
return false;
}
}
@ -699,7 +702,8 @@ bool ARMv5::DCacheWrite16(const u32 addr, const u16 val)
u16 *cacheLine = (u16 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 1] = val;
DataCycles = 1;
//if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
#if !DISABLE_CACHEWRITEBACK
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
{
if (addr & (DCACHE_LINELENGTH / 2))
{
@ -712,6 +716,7 @@ bool ARMv5::DCacheWrite16(const u32 addr, const u16 val)
// just mark dirtyand abort the data write through the bus
return true;
}
#endif
return false;
}
}
@ -732,7 +737,8 @@ bool ARMv5::DCacheWrite8(const u32 addr, const u8 val)
u8 *cacheLine = &DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
cacheLine[addr & (DCACHE_LINELENGTH-1)] = val;
DataCycles = 1;
//if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
#if !DISABLE_CACHEWRITEBACK
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
{
if (addr & (DCACHE_LINELENGTH / 2))
{
@ -746,6 +752,7 @@ bool ARMv5::DCacheWrite8(const u32 addr, const u8 val)
// just mark dirty and abort the data write through the bus
return true;
}
#endif
return false;
}
}
@ -789,13 +796,16 @@ void ARMv5::DCacheInvalidateAll()
void ARMv5::DCacheClearAll()
{
#if !DISABLE_CACHEWRITEBACK
for (int set = 0;set<DCACHE_SETS;set++)
for (int line = 0;line<=DCACHE_LINESPERSET;line++)
DCacheClearByASetAndWay(set, line);
#endif
}
void ARMv5::DCacheClearByAddr(const u32 addr)
{
#if !DISABLE_CACHEWRITEBACK
const u32 tag = (addr & ~(DCACHE_LINELENGTH - 1)) | CACHE_FLAG_VALID;
const u32 id = ((addr >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1)) << DCACHE_SETS_LOG2;
@ -807,10 +817,12 @@ void ARMv5::DCacheClearByAddr(const u32 addr)
return;
}
}
#endif
}
void ARMv5::DCacheClearByASetAndWay(const u8 cacheSet, const u8 cacheLine)
{
#if !DISABLE_CACHEWRITEBACK
const u32 index = cacheSet | (cacheLine << DCACHE_SETS_LOG2);
// Only write back if valid
@ -863,6 +875,7 @@ void ARMv5::DCacheClearByASetAndWay(const u8 cacheSet, const u8 cacheLine)
DataCycles += (NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 8) - 1))) << NDS.ARM9ClockShift;
}
DCacheTags[index] &= ~(CACHE_FLAG_DIRTY_LOWERHALF | CACHE_FLAG_DIRTY_UPPERHALF);
#endif
}
bool ARMv5::IsAddressDCachable(const u32 addr) const
@ -898,7 +911,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
{
u32 diff = PU_DataCacheable ^ val;
PU_DataCacheable = val;
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region cachable bit
@ -924,7 +937,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
{
u32 diff = PU_CodeCacheable ^ val;
PU_CodeCacheable = val;
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region cachable bit
@ -951,7 +964,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
{
u32 diff = PU_DataCacheWrite ^ val;
PU_DataCacheWrite = val;
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region write buffer
@ -983,7 +996,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
for (int i=0;i<CP15_REGION_COUNT;i++)
PU_DataRW |= (val >> (i * 2) & 3) << (i * CP15_REGIONACCESS_BITS_PER_REGION);
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region access permission
@ -1015,7 +1028,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
for (int i=0;i<CP15_REGION_COUNT;i++)
PU_CodeRW |= (val >> (i * 2) & 3) << (i * CP15_REGIONACCESS_BITS_PER_REGION);
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region access permission
@ -1041,7 +1054,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
{
u32 diff = PU_DataRW ^ val;
PU_DataRW = val;
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region access permission
@ -1065,7 +1078,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
{
u32 diff = PU_CodeRW ^ val;
PU_CodeRW = val;
#if 0
#if 1
// This code just updates the PU_Map entries of the given region
// this works fine, if the regions do not overlap
// If overlapping and the least priority region access permission
@ -1399,7 +1412,7 @@ void ARMv5::CP15Write(const u32 id, const u32 val)
uint8_t segment = (CacheDebugRegisterIndex >> (32-DCACHE_SETS_LOG2)) & (DCACHE_SETS-1);
uint8_t wordAddress = (CacheDebugRegisterIndex & (DCACHE_LINELENGTH-1)) >> 2;
uint8_t index = (CacheDebugRegisterIndex >> DCACHE_LINELENGTH_LOG2) & (DCACHE_LINESPERSET-1);
*(u32 *)&DCache[((index << DCACHE_SETS_LOG2) + segment) << DCACHE_LINELENGTH_LOG2 + wordAddress*4] = val;
*(u32 *)&DCache[(((index << DCACHE_SETS_LOG2) + segment) << DCACHE_LINELENGTH_LOG2) + wordAddress*4] = val;
}
return;
@ -1488,7 +1501,7 @@ u32 ARMv5::CP15Read(const u32 id) const
case 0x661:
case 0x670:
case 0x671:
return PU_Region[(id >> CP15_REGIONACCESS_BITS_PER_REGION) & 0xF];
return PU_Region[(id >> 4) & 0xF];
case 0x7A6:
// read Cache Dirty Bit (optional)
@ -1585,6 +1598,7 @@ u32 ARMv5::CP15Read(const u32 id) const
u32 ARMv5::CodeRead32(const u32 addr, bool const branch)
{
#if !DISABLE_ICACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1597,6 +1611,7 @@ u32 ARMv5::CodeRead32(const u32 addr, bool const branch)
}
}
}
#endif
if (addr < ITCMSize)
{
@ -1631,6 +1646,7 @@ void ARMv5::DataRead8(const u32 addr, u32* val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1644,6 +1660,7 @@ void ARMv5::DataRead8(const u32 addr, u32* val)
}
}
}
#endif
if (addr < ITCMSize)
{
@ -1673,6 +1690,7 @@ void ARMv5::DataRead16(const u32 addr, u32* val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1686,6 +1704,7 @@ void ARMv5::DataRead16(const u32 addr, u32* val)
}
}
}
#endif
if (addr < ITCMSize)
{
@ -1715,6 +1734,7 @@ void ARMv5::DataRead32(const u32 addr, u32* val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1728,17 +1748,18 @@ void ARMv5::DataRead32(const u32 addr, u32* val)
}
}
}
#endif
if (addr < ITCMSize)
{
DataCycles = 1;
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)];
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 4)];
return;
}
if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
*val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)];
*val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 4)];
return;
}
@ -1748,6 +1769,7 @@ void ARMv5::DataRead32(const u32 addr, u32* val)
void ARMv5::DataRead32S(const u32 addr, u32* val)
{
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1761,17 +1783,18 @@ void ARMv5::DataRead32S(const u32 addr, u32* val)
}
}
}
#endif
if (addr < ITCMSize)
{
DataCycles += 1;
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)];
*val = *(u32*)&ITCM[addr & (ITCMPhysicalSize - 4)];
return;
}
if ((addr & DTCMMask) == DTCMBase)
{
DataCycles += 1;
*val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)];
*val = *(u32*)&DTCM[addr & (DTCMPhysicalSize - 4)];
return;
}
@ -1789,6 +1812,7 @@ void ARMv5::DataWrite8(const u32 addr, const u8 val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1802,6 +1826,7 @@ void ARMv5::DataWrite8(const u32 addr, const u8 val)
}
}
}
#endif
if (addr < ITCMSize)
{
@ -1831,6 +1856,7 @@ void ARMv5::DataWrite16(const u32 addr, const u16 val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1844,6 +1870,7 @@ void ARMv5::DataWrite16(const u32 addr, const u16 val)
}
}
}
#endif
if (addr < ITCMSize)
{
@ -1873,6 +1900,7 @@ void ARMv5::DataWrite32(const u32 addr, const u32 val)
DataRegion = addr;
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1886,18 +1914,19 @@ void ARMv5::DataWrite32(const u32 addr, const u32 val)
}
}
}
#endif
if (addr < ITCMSize)
{
DataCycles = 1;
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)] = val;
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 4)] = val;
NDS.JIT.CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
return;
}
if ((addr & DTCMMask) == DTCMBase)
{
DataCycles = 1;
*(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)] = val;
*(u32*)&DTCM[addr & (DTCMPhysicalSize - 4)] = val;
return;
}
@ -1907,6 +1936,7 @@ void ARMv5::DataWrite32(const u32 addr, const u32 val)
void ARMv5::DataWrite32S(const u32 addr, const u32 val)
{
#if !DISABLE_DCACHE
#ifdef JIT_ENABLED
if (!NDS.IsJITEnabled())
#endif
@ -1920,11 +1950,12 @@ void ARMv5::DataWrite32S(const u32 addr, const u32 val)
}
}
}
#endif
if (addr < ITCMSize)
{
DataCycles += 1;
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 3)] = val;
*(u32*)&ITCM[addr & (ITCMPhysicalSize - 4)] = val;
#ifdef JIT_ENABLED
NDS.JIT.CheckAndInvalidate<0, ARMJIT_Memory::memregion_ITCM>(addr);
#endif
@ -1933,7 +1964,7 @@ void ARMv5::DataWrite32S(const u32 addr, const u32 val)
if ((addr & DTCMMask) == DTCMBase)
{
DataCycles += 1;
*(u32*)&DTCM[addr & (DTCMPhysicalSize - 3)] = val;
*(u32*)&DTCM[addr & (DTCMPhysicalSize - 4)] = val;
return;
}