From 6d19495ed7baea31dc27a46bcd039db8152d274b Mon Sep 17 00:00:00 2001 From: Brendan Shanks Date: Thu, 14 Apr 2022 10:19:07 -0700 Subject: [PATCH] wow64cpu: Use different JMP instruction to work around Rosetta bug. Rosetta 2 on macOS 11 and 12 (before 12.4) does not support the 0xEA JMP instruction, use the indirect form instead. Signed-off-by: Brendan Shanks Signed-off-by: Alexandre Julliard --- dlls/wow64cpu/cpu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/wow64cpu/cpu.c b/dlls/wow64cpu/cpu.c index a029b251be0..34c3f3ad493 100644 --- a/dlls/wow64cpu/cpu.c +++ b/dlls/wow64cpu/cpu.c @@ -33,7 +33,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(wow); #include "pshpack1.h" struct thunk_32to64 { - BYTE ljmp; /* ljmp %cs:1f */ + BYTE ljmp; /* jump far, absolute indirect */ + BYTE modrm; /* address=disp32, opcode=5 */ + DWORD op; DWORD addr; WORD cs; }; @@ -195,7 +197,9 @@ NTSTATUS WINAPI BTCpuProcessInit(void) ds64_sel = context.SegDs; fs32_sel = context.SegFs; - thunk->ljmp = 0xea; + thunk->ljmp = 0xff; + thunk->modrm = 0x2d; + thunk->op = PtrToUlong( &thunk->addr ); thunk->addr = PtrToUlong( syscall_32to64 ); thunk->cs = cs64_sel; NtProtectVirtualMemory( GetCurrentProcess(), (void **)&thunk, &size, PAGE_EXECUTE_READ, &old_prot );