From 09cef25e921a47bbf203dad951df80404ae8b2f5 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Sat, 14 Aug 2021 13:47:41 +0200 Subject: [PATCH] UserspaceEmulator: Make call rm32 work with address on the stack Previously, we pushed the old `eip` on the stack before reading the new address, which made us jump to the wrong place if the destination was relative to the `esp`. --- Userland/DevTools/UserspaceEmulator/SoftCPU.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Userland/DevTools/UserspaceEmulator/SoftCPU.cpp b/Userland/DevTools/UserspaceEmulator/SoftCPU.cpp index 32df7ddbd5..43d09d453d 100644 --- a/Userland/DevTools/UserspaceEmulator/SoftCPU.cpp +++ b/Userland/DevTools/UserspaceEmulator/SoftCPU.cpp @@ -1176,8 +1176,8 @@ void SoftCPU::CALL_RM16(const X86::Instruction&) { TODO_INSN(); } void SoftCPU::CALL_RM32(const X86::Instruction& insn) { - push32(shadow_wrap_as_initialized(eip())); auto address = insn.modrm().read32(*this, insn); + push32(shadow_wrap_as_initialized(eip())); warn_if_uninitialized(address, "call rm32"); set_eip(address.value()); // FIXME: this won't catch at the moment due to us not having a way to set