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`.
This commit is contained in:
Daniel Bertalan 2021-08-14 13:47:41 +02:00 committed by Andreas Kling
commit 09cef25e92
Notes: sideshowbarker 2024-07-18 06:55:06 +09:00

View file

@ -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