diff --git a/src/xenia/cpu/backend/a64/a64_backend.cc b/src/xenia/cpu/backend/a64/a64_backend.cc index d1780980b..6320cf4d7 100644 --- a/src/xenia/cpu/backend/a64/a64_backend.cc +++ b/src/xenia/cpu/backend/a64/a64_backend.cc @@ -273,10 +273,10 @@ HostToGuestThunk A64ThunkEmitter::EmitHostToGuestThunk() { } GuestToHostThunk A64ThunkEmitter::EmitGuestToHostThunk() { - // rcx = target function - // rdx = arg0 - // r8 = arg1 - // r9 = arg2 + // X0 = target function + // X1 = arg0 + // X2 = arg1 + // X3 = arg2 struct _code_offsets { size_t prolog; @@ -420,6 +420,8 @@ void A64ThunkEmitter::EmitSaveVolatileRegs() { STR(X17, XSP, offsetof(StackLayout::Thunk, r[17])); STR(X18, XSP, offsetof(StackLayout::Thunk, r[18])); + STR(X30, XSP, offsetof(StackLayout::Thunk, r[19])); + STR(Q0, XSP, offsetof(StackLayout::Thunk, xmm[0])); STR(Q1, XSP, offsetof(StackLayout::Thunk, xmm[1])); STR(Q2, XSP, offsetof(StackLayout::Thunk, xmm[2])); @@ -477,6 +479,8 @@ void A64ThunkEmitter::EmitLoadVolatileRegs() { LDR(X17, XSP, offsetof(StackLayout::Thunk, r[17])); LDR(X18, XSP, offsetof(StackLayout::Thunk, r[18])); + LDR(X30, XSP, offsetof(StackLayout::Thunk, r[19])); + LDR(Q0, XSP, offsetof(StackLayout::Thunk, xmm[0])); LDR(Q1, XSP, offsetof(StackLayout::Thunk, xmm[1])); LDR(Q2, XSP, offsetof(StackLayout::Thunk, xmm[2])); diff --git a/src/xenia/cpu/backend/a64/a64_emitter.cc b/src/xenia/cpu/backend/a64/a64_emitter.cc index 6010d762f..5a905d9b8 100644 --- a/src/xenia/cpu/backend/a64/a64_emitter.cc +++ b/src/xenia/cpu/backend/a64/a64_emitter.cc @@ -628,7 +628,15 @@ void A64Emitter::CallNativeSafe(void* fn) { // call(rax); MOV(X0, reinterpret_cast(fn)); MOV(X16, reinterpret_cast(thunk)); + + // Preserve frame and link register + STP(X29, X30, XSP, POST_INDEXED, -16); + BLR(X16); + + // Restore frame and link register + LDP(X29, X30, XSP, PRE_INDEXED, 16); + // X0 = host return } diff --git a/src/xenia/cpu/backend/a64/a64_stack_layout.h b/src/xenia/cpu/backend/a64/a64_stack_layout.h index 02db19db2..64deece50 100644 --- a/src/xenia/cpu/backend/a64/a64_stack_layout.h +++ b/src/xenia/cpu/backend/a64/a64_stack_layout.h @@ -90,7 +90,7 @@ class StackLayout { */ XEPACKEDSTRUCT(Thunk, { uint64_t arg_temp[3]; - uint64_t r[19]; + uint64_t r[20]; vec128_t xmm[32]; }); static_assert(sizeof(Thunk) % 16 == 0,