Implemented CacheLockDown
This commit is contained in:
parent
7b8327d3a4
commit
9d2e515947
40
src/CP15.cpp
40
src/CP15.cpp
|
@ -380,6 +380,24 @@ void ARMv5::ICacheLookup(u32 addr)
|
||||||
line = RandomLineIndex();
|
line = RandomLineIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ICacheLockDown)
|
||||||
|
{
|
||||||
|
if (ICacheLockDown & CACHE_LOCKUP_L)
|
||||||
|
{
|
||||||
|
// load into locked up cache
|
||||||
|
// into the selected set
|
||||||
|
line = ICacheLockDown & (ICACHE_SETS-1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
u8 minSet = ICacheLockDown & (ICACHE_SETS-1);
|
||||||
|
if (minSet)
|
||||||
|
{
|
||||||
|
// part of the cache is locked up and only the cachelines
|
||||||
|
line = (line % (ICACHE_SETS - minSet)) + minSet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
line += id;
|
line += id;
|
||||||
|
|
||||||
addr &= ~(ICACHE_LINELENGTH-1);
|
addr &= ~(ICACHE_LINELENGTH-1);
|
||||||
|
@ -474,6 +492,24 @@ void ARMv5::DCacheLookup(u32 addr)
|
||||||
line = RandomLineIndex();
|
line = RandomLineIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DCacheLockDown)
|
||||||
|
{
|
||||||
|
if (DCacheLockDown & CACHE_LOCKUP_L)
|
||||||
|
{
|
||||||
|
// load into locked up cache
|
||||||
|
// into the selected set
|
||||||
|
line = DCacheLockDown & (DCACHE_SETS-1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
u8 minSet = DCacheLockDown & (DCACHE_SETS-1);
|
||||||
|
if (minSet)
|
||||||
|
{
|
||||||
|
// part of the cache is locked up and only the cachelines
|
||||||
|
line = (line % (DCACHE_SETS - minSet)) + minSet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
line += id;
|
line += id;
|
||||||
|
|
||||||
addr &= ~(DCACHE_LINELENGTH-1);
|
addr &= ~(DCACHE_LINELENGTH-1);
|
||||||
|
@ -856,6 +892,10 @@ void ARMv5::CP15Write(u32 id, u32 val)
|
||||||
// Test and clean (optional)
|
// Test and clean (optional)
|
||||||
// Is not present on the NDS/DSi
|
// Is not present on the NDS/DSi
|
||||||
return;
|
return;
|
||||||
|
case 0x7A4:
|
||||||
|
// Drain Write Buffer: Stall until all write back completed
|
||||||
|
// TODO when write back was implemented instead of write through
|
||||||
|
return;
|
||||||
|
|
||||||
case 0x7D1:
|
case 0x7D1:
|
||||||
Log(LogLevel::Debug,"Prefetch instruction cache MVA\n");
|
Log(LogLevel::Debug,"Prefetch instruction cache MVA\n");
|
||||||
|
|
|
@ -57,6 +57,8 @@ constexpr u32 CACHE_FLAG_VALID = (1 << 4);
|
||||||
constexpr u32 CACHE_FLAG_DIRTY_LOWERHALF = (1 << 2);
|
constexpr u32 CACHE_FLAG_DIRTY_LOWERHALF = (1 << 2);
|
||||||
constexpr u32 CACHE_FLAG_DIRTY_UPPERHALF = (1 << 3);
|
constexpr u32 CACHE_FLAG_DIRTY_UPPERHALF = (1 << 3);
|
||||||
|
|
||||||
|
constexpr u32 CACHE_LOCKUP_L = (1 << 31);
|
||||||
|
|
||||||
constexpr u32 CP15_CR_MPUENABLE = (1 << 0);
|
constexpr u32 CP15_CR_MPUENABLE = (1 << 0);
|
||||||
constexpr u32 CP15_CR_BIGENDIAN = (1 << 7);
|
constexpr u32 CP15_CR_BIGENDIAN = (1 << 7);
|
||||||
constexpr u32 CP15_CR_HIGHEXCEPTIONBASE = (1 << 13);
|
constexpr u32 CP15_CR_HIGHEXCEPTIONBASE = (1 << 13);
|
||||||
|
|
Loading…
Reference in New Issue