From 4f29128e50322a2d34b8e81248b76e1c1357eead Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 21 Feb 2026 01:53:48 +0100 Subject: [PATCH] [dynarmic] Fix ISB with new JIT schema (#3576) If an ISB is issued, the changes on the memory wouldn't be reflected Now we emulate "instruction cache" properly by just telling the mechanism to re-fetch the entire page again (to make ANY changes visible immediately) This mainly fixes a potential issue where an ISB is emitted before a branch on the same codepage. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3576 Reviewed-by: CamilleLaVey Reviewed-by: crueter Reviewed-by: DraVee Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/arm/dynarmic/arm_dynarmic_32.h | 3 +++ src/core/arm/dynarmic/arm_dynarmic_64.h | 3 +++ src/core/hle/service/jit/jit_context.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 5e40d5d82a..d93cc1cfc9 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h @@ -35,6 +35,9 @@ public: u32 MemoryRead32(u32 vaddr) override; u64 MemoryRead64(u32 vaddr) override; std::optional MemoryReadCode(u32 vaddr) override; + void InstructionSynchronizationBarrierRaised() override { + last_code_addr = 0; //reset back, force refetch + } void MemoryWrite8(u32 vaddr, u8 value) override; void MemoryWrite16(u32 vaddr, u16 value) override; void MemoryWrite32(u32 vaddr, u32 value) override; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index a756c63615..9eff17c5fe 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -42,6 +42,9 @@ public: u64 MemoryRead64(u64 vaddr) override; Dynarmic::A64::Vector MemoryRead128(u64 vaddr) override; std::optional MemoryReadCode(u64 vaddr) override; + void InstructionSynchronizationBarrierRaised() override { + last_code_addr = 0; //reset back, force refetch + } void MemoryWrite8(u64 vaddr, u8 value) override; void MemoryWrite16(u64 vaddr, u16 value) override; void MemoryWrite32(u64 vaddr, u32 value) override; diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index 327825ee83..a927318a7c 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -56,6 +56,9 @@ public: } return cached_code_page.inst[(vaddr & Core::Memory::YUZU_PAGEMASK) / sizeof(u32)]; } + void InstructionSynchronizationBarrierRaised() override { + last_code_addr = 0; //reset back, force refetch + } u8 MemoryRead8(u64 vaddr) override { return ReadMemory(vaddr); }