From 5d11b8b0d55a774795ed658c2db6b97732333d4a Mon Sep 17 00:00:00 2001 From: "Pierre-Loup A. Griffais" Date: Sun, 6 Sep 2026 02:00:05 -0700 Subject: [PATCH] DiskCache: SMC regression fixes One from a bad conflict resolution :/ --- FEXCore/Source/Interface/Core/Core.cpp | 40 ++++++++++----------- FEXCore/Source/Interface/Core/DiskCache.cpp | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/FEXCore/Source/Interface/Core/Core.cpp b/FEXCore/Source/Interface/Core/Core.cpp index dc43fcf11..8286c1465 100644 --- a/FEXCore/Source/Interface/Core/Core.cpp +++ b/FEXCore/Source/Interface/Core/Core.cpp @@ -904,27 +904,27 @@ uintptr_t ContextImpl::CompileBlock(FEXCore::Core::CpuStateFrame* Frame, uint64_ if (Thread->LookupCache->AddBlockExecutableRange(Thread, Hit->EntryPointRIPs, CodePage, FEXCore::Utils::FEX_PAGE_SIZE)) { SyscallHandler->MarkGuestExecutableRange(Thread, CodePage, FEXCore::Utils::FEX_PAGE_SIZE); } - - LOGMAN_THROW_A_FMT(Hit->EntryPointRIPs.size() == Hit->EntryPointHostOffsets.size(), "Mismatched Disk Cache entrypoint pairs!"); - - uintptr_t CachedHostCode = 0; - for (size_t i = 0; i < Hit->EntryPointRIPs.size(); i++) { - void* HostAddr = LoadedCode.BlockBegin + Hit->EntryPointHostOffsets[i]; - Thread->LookupCache->AddBlockMapping(Thread, Hit->EntryPointRIPs[i], Hit->GuestPages, HostAddr); - if (Hit->EntryPointRIPs[i] == GuestRIP) { - CachedHostCode = reinterpret_cast(HostAddr); - } - } - - LOGMAN_THROW_A_FMT(CachedHostCode != 0, "Couldn't find GuestRIP in Disk Cache entrypoints!"); - - FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedDiskCacheHitCount, 1); - Thread->FrontendDecoder->DelayedDisownBuffer(); - - Thread->FrontendDecoder->ValidateDisownedOrFree(); - Thread->OpDispatcher->ValidateDisownedOrFree(); - return CachedHostCode; } + + LOGMAN_THROW_A_FMT(Hit->EntryPointRIPs.size() == Hit->EntryPointHostOffsets.size(), "Mismatched Disk Cache entrypoint pairs!"); + + uintptr_t CachedHostCode = 0; + for (size_t i = 0; i < Hit->EntryPointRIPs.size(); i++) { + void* HostAddr = LoadedCode.BlockBegin + Hit->EntryPointHostOffsets[i]; + Thread->LookupCache->AddBlockMapping(Thread, Hit->EntryPointRIPs[i], Hit->GuestPages, HostAddr); + if (Hit->EntryPointRIPs[i] == GuestRIP) { + CachedHostCode = reinterpret_cast(HostAddr); + } + } + + LOGMAN_THROW_A_FMT(CachedHostCode != 0, "Couldn't find GuestRIP in Disk Cache entrypoints!"); + + FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedDiskCacheHitCount, 1); + Thread->FrontendDecoder->DelayedDisownBuffer(); + + Thread->FrontendDecoder->ValidateDisownedOrFree(); + Thread->OpDispatcher->ValidateDisownedOrFree(); + return CachedHostCode; } } FEXCORE_PROFILE_INSTANT_INCREMENT(Thread, AccumulatedDiskCacheMissCount, 1); diff --git a/FEXCore/Source/Interface/Core/DiskCache.cpp b/FEXCore/Source/Interface/Core/DiskCache.cpp index 0087d31d8..444e578fc 100644 --- a/FEXCore/Source/Interface/Core/DiskCache.cpp +++ b/FEXCore/Source/Interface/Core/DiskCache.cpp @@ -516,7 +516,7 @@ namespace DiskCache { for (uint32_t i = 0; i < Entry.GuestExtents.size(); i += 2) { XXH3_128bits_update(&HashState, reinterpret_cast(GuestRIP) + Entry.GuestExtents[i], Entry.GuestExtents[i + 1]); uint64_t FirstPage = (Entry.GuestExtents[i] + GuestRIP) & Utils::FEX_PAGE_MASK; - uint64_t LastPage = (Entry.GuestExtents[i] + Entry.GuestExtents[i + 1] + GuestRIP) & Utils::FEX_PAGE_MASK; + uint64_t LastPage = (Entry.GuestExtents[i] + GuestRIP + Entry.GuestExtents[i + 1] - 1) & Utils::FEX_PAGE_MASK; for (uint64_t Page = FirstPage; Page <= LastPage; Page += Utils::FEX_PAGE_SIZE) { if (GuestPages.size() == 0 || Page != GuestPages.back()) { GuestPages.push_back(Page);