}
void ARM710T::reset() {
+#ifdef ARM710T_CACHE
clearCache();
+#endif
raiseException(Supervisor32, 0, 0);
}
case 3: cp15_domainAccessControl = what; break;
case 5: cp15_faultStatus = what; break;
case 6: cp15_faultAddress = what; break;
+#ifdef ARM710T_CACHE
case 7: clearCache(); log("cache cleared"); break;
+#endif
case 8: {
if (CPOpc == 1)
flushTlb(what);
+#ifdef ARM710T_CACHE
void ARM710T::clearCache() {
for (uint32_t i = 0; i < CacheSets; i++) {
for (uint32_t j = 0; j < CacheBlocksPerSet; j++) {
}
return false;
}
+#endif
uint32_t ARM710T::physAddrFromTlbEntry(TlbEntry *tlbEntry, uint32_t virtAddr) {
return make_pair(MaybeU32(), encodeFault(AlignmentFault, 0, virtAddr));
// fast path: cache
+#ifdef ARM710T_CACHE
if (auto v = readCached(virtAddr, valueSize); v.has_value())
return make_pair(v.value(), NoFault);
+#endif
if (!isMMUEnabled()) {
// things are very simple without a MMU
bool isPage = (tlbEntry->lv2Entry != 0);
uint32_t physAddr = physAddrFromTlbEntry(tlbEntry, virtAddr);
- bool cacheable = tlbEntry->lv2Entry ? (tlbEntry->lv2Entry & 8) : (tlbEntry->lv1Entry & 8);
+#ifdef ARM710T_CACHE
+ bool cacheable = tlbEntry->lv2Entry ? (tlbEntry->lv2Entry & 8) : (tlbEntry->lv1Entry & 8);
if (cacheable && isCacheEnabled())
return addCacheLineAndRead(physAddr, virtAddr, valueSize, domain, isPage);
- else if (auto result = readPhysical(physAddr, valueSize); result.has_value())
+ else
+#endif
+ if (auto result = readPhysical(physAddr, valueSize); result.has_value())
return make_pair(result, NoFault);
else
return make_pair(result, encodeFaultSorP(SorPOtherBusError, isPage, domain, virtAddr));
}
// commit to cache if all was good
+#ifdef ARM710T_CACHE
writeCached(value, virtAddr, valueSize);
+#endif
return NoFault;
}
// Write buffer is 4 address FIFO, 8 data FIFO
// TLB is 64 entries
+// Speedhacks:
+//#define ARM710T_CACHE
+
typedef optional<uint32_t> MaybeU32;
class ARM710T
cp15_faultStatus = 0;
cp15_faultAddress = 0;
prefetchCount = 0;
+#ifdef ARM710T_CACHE
clearCache();
+#endif
flushTlb();
}
void reportFault(MMUFault fault);
// Instruction/Data Cache
+#ifdef ARM710T_CACHE
enum {
CacheSets = 4,
CacheBlocksPerSet = 128,
pair<MaybeU32, MMUFault> addCacheLineAndRead(uint32_t physAddr, uint32_t virtAddr, ValueSize valueSize, int domain, bool isPage);
MaybeU32 readCached(uint32_t virtAddr, ValueSize valueSize);
bool writeCached(uint32_t value, uint32_t virtAddr, ValueSize valueSize);
+#endif
// Instruction Loop
int prefetchCount;