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 <bshanks@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Brendan Shanks 2022-04-14 10:19:07 -07:00 committed by Alexandre Julliard
parent 1a2482be2d
commit 6d19495ed7

View file

@ -33,7 +33,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(wow);
#include "pshpack1.h" #include "pshpack1.h"
struct thunk_32to64 struct thunk_32to64
{ {
BYTE ljmp; /* ljmp %cs:1f */ BYTE ljmp; /* jump far, absolute indirect */
BYTE modrm; /* address=disp32, opcode=5 */
DWORD op;
DWORD addr; DWORD addr;
WORD cs; WORD cs;
}; };
@ -195,7 +197,9 @@ NTSTATUS WINAPI BTCpuProcessInit(void)
ds64_sel = context.SegDs; ds64_sel = context.SegDs;
fs32_sel = context.SegFs; fs32_sel = context.SegFs;
thunk->ljmp = 0xea; thunk->ljmp = 0xff;
thunk->modrm = 0x2d;
thunk->op = PtrToUlong( &thunk->addr );
thunk->addr = PtrToUlong( syscall_32to64 ); thunk->addr = PtrToUlong( syscall_32to64 );
thunk->cs = cs64_sel; thunk->cs = cs64_sel;
NtProtectVirtualMemory( GetCurrentProcess(), (void **)&thunk, &size, PAGE_EXECUTE_READ, &old_prot ); NtProtectVirtualMemory( GetCurrentProcess(), (void **)&thunk, &size, PAGE_EXECUTE_READ, &old_prot );