From 36bdb591be2f49f9a1b4965ceb516ab960fbadba Mon Sep 17 00:00:00 2001 From: RSDuck Date: Sun, 9 Aug 2020 13:29:04 +0200 Subject: fix JIT for code in VRAM apparantely Pokemon B/W needs this fixes #708 --- src/ARMJIT_Memory.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/ARMJIT_Memory.cpp') diff --git a/src/ARMJIT_Memory.cpp b/src/ARMJIT_Memory.cpp index 35cfdf0..f2367f6 100644 --- a/src/ARMJIT_Memory.cpp +++ b/src/ARMJIT_Memory.cpp @@ -773,6 +773,7 @@ bool GetMirrorLocation(int region, u32 num, u32 addr, u32& memoryOffset, u32& mi { mirrorStart = addr & ~0xFFFFF; mirrorSize = 0x100000; + return true; } return false; case memregion_VWRAM: -- cgit v1.2.3 From 4299ef5f067c0f7aac338fbdd5e36726f8c8af64 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Fri, 14 Aug 2020 23:38:47 +0200 Subject: use unordered map for JIT RestoreCandidates also fix WifiRead32? --- src/ARMJIT.cpp | 153 +++++++++++--------------------------------------- src/ARMJIT_Memory.cpp | 2 +- 2 files changed, 33 insertions(+), 122 deletions(-) (limited to 'src/ARMJIT_Memory.cpp') diff --git a/src/ARMJIT.cpp b/src/ARMJIT.cpp index 0eb792c..59f7f54 100644 --- a/src/ARMJIT.cpp +++ b/src/ARMJIT.cpp @@ -38,6 +38,14 @@ namespace ARMJIT Compiler* JITCompiler; + +std::unordered_map JitBlocks9; +std::unordered_map JitBlocks7; + +std::unordered_map RestoreCandidates; + +TinyVector InvalidLiterals; + AddressRange CodeIndexITCM[ITCMPhysicalSize / 512]; AddressRange CodeIndexMainRAM[NDS::MainRAMMaxSize / 512]; AddressRange CodeIndexSWRAM[NDS::SharedWRAMSize / 512]; @@ -52,9 +60,6 @@ AddressRange CodeIndexNWRAM_A[DSi::NWRAMSize / 512]; AddressRange CodeIndexNWRAM_B[DSi::NWRAMSize / 512]; AddressRange CodeIndexNWRAM_C[DSi::NWRAMSize / 512]; -std::unordered_map JitBlocks9; -std::unordered_map JitBlocks7; - u64 FastBlockLookupITCM[ITCMPhysicalSize / 2]; u64 FastBlockLookupMainRAM[NDS::MainRAMMaxSize / 2]; u64 FastBlockLookupSWRAM[NDS::SharedWRAMSize / 2]; @@ -146,8 +151,6 @@ u32 LocaliseCodeAddress(u32 num, u32 addr) return 0; } -TinyVector InvalidLiterals; - template T SlowRead9(u32 addr, ARMv5* cpu) { @@ -286,97 +289,6 @@ void SlowBlockTransfer7(u32 addr, u64* data, u32 num) INSTANTIATE_SLOWMEM(0) INSTANTIATE_SLOWMEM(1) -template -struct UnreliableHashTable -{ - struct Bucket - { - K KeyA, KeyB; - V ValA, ValB; - }; - - Bucket Table[Size]; - - void Reset() - { - for (int i = 0; i < Size; i++) - { - Table[i].ValA = Table[i].ValB = InvalidValue; - } - } - - UnreliableHashTable() - { - Reset(); - } - - V Insert(K key, V value) - { - u32 slot = XXH3_64bits(&key, sizeof(K)) & (Size - 1); - Bucket* bucket = &Table[slot]; - - if (bucket->ValA == value || bucket->ValB == value) - { - return InvalidValue; - } - else if (bucket->ValA == InvalidValue) - { - bucket->KeyA = key; - bucket->ValA = value; - } - else if (bucket->ValB == InvalidValue) - { - bucket->KeyB = key; - bucket->ValB = value; - } - else - { - V prevVal = bucket->ValB; - bucket->KeyB = bucket->KeyA; - bucket->ValB = bucket->ValA; - bucket->KeyA = key; - bucket->ValA = value; - return prevVal; - } - - return InvalidValue; - } - - void Remove(K key) - { - u32 slot = XXH3_64bits(&key, sizeof(K)) & (Size - 1); - Bucket* bucket = &Table[slot]; - - if (bucket->KeyA == key && bucket->ValA != InvalidValue) - { - bucket->ValA = InvalidValue; - if (bucket->ValB != InvalidValue) - { - bucket->KeyA = bucket->KeyB; - bucket->ValA = bucket->ValB; - bucket->ValB = InvalidValue; - } - } - if (bucket->KeyB == key && bucket->ValB != InvalidValue) - bucket->ValB = InvalidValue; - } - - V LookUp(K addr) - { - u32 slot = XXH3_64bits(&addr, 4) & (Size - 1); - Bucket* bucket = &Table[slot]; - - if (bucket->ValA != InvalidValue && bucket->KeyA == addr) - return bucket->ValA; - if (bucket->ValB != InvalidValue && bucket->KeyB == addr) - return bucket->ValB; - - return InvalidValue; - } -}; - -UnreliableHashTable RestoreCandidates; - void Init() { JITCompiler = new Compiler(); @@ -622,6 +534,20 @@ InterpreterFunc InterpretTHUMB[ARMInstrInfo::tk_Count] = }; #undef F +void RetireJitBlock(JitBlock* block) +{ + auto it = RestoreCandidates.find(block->InstrHash); + if (it != RestoreCandidates.end()) + { + delete it->second; + it->second = block; + } + else + { + RestoreCandidates[block->InstrHash] = block; + } +} + void CompileBlock(ARM* cpu) { bool thumb = cpu->CPSR & 0x20; @@ -659,10 +585,7 @@ void CompileBlock(ARM* cpu) } // some memory has been remapped - JitBlock* prevBlock = RestoreCandidates.Insert(existingBlockIt->second->InstrHash, existingBlockIt->second); - if (prevBlock) - delete prevBlock; - + RetireJitBlock(existingBlockIt->second); map.erase(existingBlockIt); } @@ -906,11 +829,13 @@ void CompileBlock(ARM* cpu) u32 literalHash = (u32)XXH3_64bits(literalValues, numLiterals * 4); u32 instrHash = (u32)XXH3_64bits(instrValues, i * 4); - JitBlock* prevBlock = RestoreCandidates.LookUp(instrHash); + auto prevBlockIt = RestoreCandidates.find(instrHash); + JitBlock* prevBlock = NULL; bool mayRestore = true; - if (prevBlock) + if (prevBlockIt != RestoreCandidates.end()) { - RestoreCandidates.Remove(instrHash); + prevBlock = prevBlockIt->second; + RestoreCandidates.erase(prevBlockIt); mayRestore = prevBlock->StartAddr == blockAddr && prevBlock->LiteralHash == literalHash; @@ -932,7 +857,6 @@ void CompileBlock(ARM* cpu) else { mayRestore = false; - prevBlock = NULL; } JitBlock* block; @@ -1078,9 +1002,7 @@ void InvalidateByAddr(u32 localAddr) if (!literalInvalidation) { - JitBlock* prevBlock = RestoreCandidates.Insert(block->InstrHash, block); - if (prevBlock) - delete prevBlock; + RetireJitBlock(block); } else { @@ -1166,20 +1088,9 @@ void ResetBlockCache() InvalidLiterals.Clear(); for (int i = 0; i < ARMJIT_Memory::memregions_Count; i++) memset(FastBlockLookupRegions[i], 0xFF, CodeRegionSizes[i] * sizeof(u64) / 2); - RestoreCandidates.Reset(); - for (int i = 0; i < sizeof(RestoreCandidates.Table)/sizeof(RestoreCandidates.Table[0]); i++) - { - if (RestoreCandidates.Table[i].ValA) - { - delete RestoreCandidates.Table[i].ValA; - RestoreCandidates.Table[i].ValA = NULL; - } - if (RestoreCandidates.Table[i].ValA) - { - delete RestoreCandidates.Table[i].ValB; - RestoreCandidates.Table[i].ValB = NULL; - } - } + for (auto it = RestoreCandidates.begin(); it != RestoreCandidates.end(); it++) + delete it->second; + RestoreCandidates.clear(); for (auto it : JitBlocks9) { JitBlock* block = it.second; diff --git a/src/ARMJIT_Memory.cpp b/src/ARMJIT_Memory.cpp index f2367f6..7885fb7 100644 --- a/src/ARMJIT_Memory.cpp +++ b/src/ARMJIT_Memory.cpp @@ -1008,7 +1008,7 @@ void WifiWrite32(u32 addr, u32 val) u32 WifiRead32(u32 addr) { - return Wifi::Read(addr) | (Wifi::Read(addr + 2) << 16); + return (u32)Wifi::Read(addr) | ((u32)Wifi::Read(addr + 2) << 16); } template -- cgit v1.2.3 From b12e1a1b6e2c983f522ef1369a6bfb8167b1bf4c Mon Sep 17 00:00:00 2001 From: RSDuck Date: Tue, 25 Aug 2020 18:13:17 +0200 Subject: JIT fastmem: fix out of bounds read seems to fix #727 --- src/ARMJIT_Memory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/ARMJIT_Memory.cpp') diff --git a/src/ARMJIT_Memory.cpp b/src/ARMJIT_Memory.cpp index 7885fb7..c5c8f04 100644 --- a/src/ARMJIT_Memory.cpp +++ b/src/ARMJIT_Memory.cpp @@ -524,8 +524,8 @@ bool MapAtAddress(u32 addr) { u32 sectionOffset = offset; bool hasCode = isExecutable && ARMJIT::PageContainsCode(&range[offset / 512]); - while ((!isExecutable || ARMJIT::PageContainsCode(&range[offset / 512]) == hasCode) - && offset < mirrorSize + while (offset < mirrorSize + && (!isExecutable || ARMJIT::PageContainsCode(&range[offset / 512]) == hasCode) && (!skipDTCM || mirrorStart + offset != NDS::ARM9->DTCMBase)) { assert(states[(mirrorStart + offset) >> 12] == memstate_Unmapped); -- cgit v1.2.3 From edf4c66724b7371c3cafde68ea457b5aac372cb6 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Fri, 11 Sep 2020 19:29:06 +0200 Subject: fix build on Switch --- src/ARMJIT_Memory.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/ARMJIT_Memory.cpp') diff --git a/src/ARMJIT_Memory.cpp b/src/ARMJIT_Memory.cpp index c5c8f04..d321d2f 100644 --- a/src/ARMJIT_Memory.cpp +++ b/src/ARMJIT_Memory.cpp @@ -279,6 +279,7 @@ bool UnmapFromRange(u32 addr, u32 num, u32 offset, u32 size) #endif } +#ifndef __SWITCH__ void SetCodeProtectionRange(u32 addr, u32 size, u32 num, int protection) { u8* dst = (u8*)(num == 0 ? FastMem9Start : FastMem7Start) + addr; @@ -303,6 +304,7 @@ void SetCodeProtectionRange(u32 addr, u32 size, u32 num, int protection) mprotect(dst, size, posixProt); #endif } +#endif struct Mapping { -- cgit v1.2.3