mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-22 10:14:10 +00:00
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:
parent
1a2482be2d
commit
6d19495ed7
|
@ -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 );
|
||||||
|
|
Loading…
Reference in a new issue