Set context/membase registers to rsi/rdi respectively.
Use offsetof for the backend thunks.
This commit is contained in:
@@ -388,8 +388,8 @@ X64ThunkEmitter::~X64ThunkEmitter() {}
|
||||
|
||||
HostToGuestThunk X64ThunkEmitter::EmitHostToGuestThunk() {
|
||||
// rcx = target
|
||||
// rdx = arg0
|
||||
// r8 = arg1
|
||||
// rdx = arg0 (context)
|
||||
// r8 = arg1 (guest return address)
|
||||
|
||||
const size_t stack_size = StackLayout::THUNK_STACK_SIZE;
|
||||
// rsp + 0 = return address
|
||||
@@ -399,52 +399,52 @@ HostToGuestThunk X64ThunkEmitter::EmitHostToGuestThunk() {
|
||||
sub(rsp, stack_size);
|
||||
|
||||
// Preserve nonvolatile registers.
|
||||
mov(qword[rsp + 40], rbx);
|
||||
mov(qword[rsp + 48], rcx);
|
||||
mov(qword[rsp + 56], rbp);
|
||||
mov(qword[rsp + 64], rsi);
|
||||
mov(qword[rsp + 72], rdi);
|
||||
mov(qword[rsp + 80], r12);
|
||||
mov(qword[rsp + 88], r13);
|
||||
mov(qword[rsp + 96], r14);
|
||||
mov(qword[rsp + 104], r15);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[0])], rbx);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[1])], rcx);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[2])], rbp);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[3])], rsi);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[4])], rdi);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[5])], r12);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[6])], r13);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[7])], r14);
|
||||
mov(qword[rsp + offsetof(StackLayout::Thunk, r[8])], r15);
|
||||
|
||||
movaps(ptr[rsp + 112], xmm6);
|
||||
movaps(ptr[rsp + 128], xmm7);
|
||||
movaps(ptr[rsp + 144], xmm8);
|
||||
movaps(ptr[rsp + 160], xmm9);
|
||||
movaps(ptr[rsp + 176], xmm10);
|
||||
movaps(ptr[rsp + 192], xmm11);
|
||||
movaps(ptr[rsp + 208], xmm12);
|
||||
movaps(ptr[rsp + 224], xmm13);
|
||||
movaps(ptr[rsp + 240], xmm14);
|
||||
movaps(ptr[rsp + 256], xmm15);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm6);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm7);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm8);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm9);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm10);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm11);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[6])], xmm12);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[7])], xmm13);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[8])], xmm14);
|
||||
movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[9])], xmm15);
|
||||
|
||||
mov(rax, rcx);
|
||||
mov(rcx, rdx);
|
||||
mov(rsi, rdx); // context
|
||||
mov(rdx, r8);
|
||||
call(rax);
|
||||
|
||||
movaps(xmm6, ptr[rsp + 112]);
|
||||
movaps(xmm7, ptr[rsp + 128]);
|
||||
movaps(xmm8, ptr[rsp + 144]);
|
||||
movaps(xmm9, ptr[rsp + 160]);
|
||||
movaps(xmm10, ptr[rsp + 176]);
|
||||
movaps(xmm11, ptr[rsp + 192]);
|
||||
movaps(xmm12, ptr[rsp + 208]);
|
||||
movaps(xmm13, ptr[rsp + 224]);
|
||||
movaps(xmm14, ptr[rsp + 240]);
|
||||
movaps(xmm15, ptr[rsp + 256]);
|
||||
movaps(xmm6, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);
|
||||
movaps(xmm7, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
|
||||
movaps(xmm8, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
|
||||
movaps(xmm9, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
|
||||
movaps(xmm10, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
|
||||
movaps(xmm11, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
|
||||
movaps(xmm12, qword[rsp + offsetof(StackLayout::Thunk, xmm[6])]);
|
||||
movaps(xmm13, qword[rsp + offsetof(StackLayout::Thunk, xmm[7])]);
|
||||
movaps(xmm14, qword[rsp + offsetof(StackLayout::Thunk, xmm[8])]);
|
||||
movaps(xmm15, qword[rsp + offsetof(StackLayout::Thunk, xmm[9])]);
|
||||
|
||||
mov(rbx, qword[rsp + 40]);
|
||||
mov(rcx, qword[rsp + 48]);
|
||||
mov(rbp, qword[rsp + 56]);
|
||||
mov(rsi, qword[rsp + 64]);
|
||||
mov(rdi, qword[rsp + 72]);
|
||||
mov(r12, qword[rsp + 80]);
|
||||
mov(r13, qword[rsp + 88]);
|
||||
mov(r14, qword[rsp + 96]);
|
||||
mov(r15, qword[rsp + 104]);
|
||||
mov(rbx, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);
|
||||
mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);
|
||||
mov(rbp, qword[rsp + offsetof(StackLayout::Thunk, r[2])]);
|
||||
mov(rsi, qword[rsp + offsetof(StackLayout::Thunk, r[3])]);
|
||||
mov(rdi, qword[rsp + offsetof(StackLayout::Thunk, r[4])]);
|
||||
mov(r12, qword[rsp + offsetof(StackLayout::Thunk, r[5])]);
|
||||
mov(r13, qword[rsp + offsetof(StackLayout::Thunk, r[6])]);
|
||||
mov(r14, qword[rsp + offsetof(StackLayout::Thunk, r[7])]);
|
||||
mov(r15, qword[rsp + offsetof(StackLayout::Thunk, r[8])]);
|
||||
|
||||
add(rsp, stack_size);
|
||||
mov(rcx, qword[rsp + 8 * 1]);
|
||||
@@ -469,34 +469,40 @@ GuestToHostThunk X64ThunkEmitter::EmitGuestToHostThunk() {
|
||||
mov(qword[rsp + 8 * 1], rcx);
|
||||
sub(rsp, stack_size);
|
||||
|
||||
mov(qword[rsp + 40], rbx);
|
||||
mov(qword[rsp + 48], rcx);
|
||||
mov(qword[rsp + 56], rbp);
|
||||
mov(qword[rsp + 64], rsi);
|
||||
mov(qword[rsp + 72], rdi);
|
||||
mov(qword[rsp + 80], r12);
|
||||
mov(qword[rsp + 88], r13);
|
||||
mov(qword[rsp + 96], r14);
|
||||
mov(qword[rsp + 104], r15);
|
||||
// Save off volatile registers.
|
||||
// TODO(DrChat): Enable this when we actually need this.
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[0])], rcx);
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[1])], rdx);
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[2])], r8);
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[3])], r9);
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[4])], r10);
|
||||
// mov(qword[rsp + offsetof(StackLayout::Thunk, r[5])], r11);
|
||||
|
||||
// TODO(benvanik): save things? XMM0-5?
|
||||
// HACK: Some emulated vector instructions require that we don't touch xmm0.
|
||||
// movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm1);
|
||||
// movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm2);
|
||||
// movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm3);
|
||||
// movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm4);
|
||||
// movaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm5);
|
||||
|
||||
mov(rax, rdx);
|
||||
mov(rcx, rsi); // context
|
||||
mov(rdx, r8);
|
||||
mov(r8, r9);
|
||||
mov(r9, r10);
|
||||
call(rax);
|
||||
|
||||
mov(rbx, qword[rsp + 40]);
|
||||
mov(rcx, qword[rsp + 48]);
|
||||
mov(rbp, qword[rsp + 56]);
|
||||
mov(rsi, qword[rsp + 64]);
|
||||
mov(rdi, qword[rsp + 72]);
|
||||
mov(r12, qword[rsp + 80]);
|
||||
mov(r13, qword[rsp + 88]);
|
||||
mov(r14, qword[rsp + 96]);
|
||||
mov(r15, qword[rsp + 104]);
|
||||
// movaps(xmm1, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);
|
||||
// movaps(xmm2, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);
|
||||
// movaps(xmm3, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);
|
||||
// movaps(xmm4, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);
|
||||
// movaps(xmm5, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);
|
||||
|
||||
// mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);
|
||||
// mov(rdx, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);
|
||||
// mov(r8, qword[rsp + offsetof(StackLayout::Thunk, r[2])]);
|
||||
// mov(r9, qword[rsp + offsetof(StackLayout::Thunk, r[3])]);
|
||||
// mov(r10, qword[rsp + offsetof(StackLayout::Thunk, r[4])]);
|
||||
// mov(r11, qword[rsp + offsetof(StackLayout::Thunk, r[5])]);
|
||||
|
||||
add(rsp, stack_size);
|
||||
mov(rcx, qword[rsp + 8 * 1]);
|
||||
@@ -514,36 +520,18 @@ ResolveFunctionThunk X64ThunkEmitter::EmitResolveFunctionThunk() {
|
||||
// ebx = target PPC address
|
||||
// rcx = context
|
||||
|
||||
const size_t stack_size = StackLayout::THUNK_STACK_SIZE;
|
||||
uint32_t stack_size = 0x18;
|
||||
|
||||
// rsp + 0 = return address
|
||||
mov(qword[rsp + 8 * 2], rdx);
|
||||
mov(qword[rsp + 8 * 1], rcx);
|
||||
sub(rsp, stack_size);
|
||||
|
||||
mov(qword[rsp + 40], rbx);
|
||||
mov(qword[rsp + 48], rcx);
|
||||
mov(qword[rsp + 56], rbp);
|
||||
mov(qword[rsp + 64], rsi);
|
||||
mov(qword[rsp + 72], rdi);
|
||||
mov(qword[rsp + 80], r12);
|
||||
mov(qword[rsp + 88], r13);
|
||||
mov(qword[rsp + 96], r14);
|
||||
mov(qword[rsp + 104], r15);
|
||||
|
||||
mov(rcx, rsi); // context
|
||||
mov(rdx, rbx);
|
||||
mov(rax, uint64_t(&ResolveFunction));
|
||||
call(rax);
|
||||
|
||||
mov(rbx, qword[rsp + 40]);
|
||||
mov(rcx, qword[rsp + 48]);
|
||||
mov(rbp, qword[rsp + 56]);
|
||||
mov(rsi, qword[rsp + 64]);
|
||||
mov(rdi, qword[rsp + 72]);
|
||||
mov(r12, qword[rsp + 80]);
|
||||
mov(r13, qword[rsp + 88]);
|
||||
mov(r14, qword[rsp + 96]);
|
||||
mov(r15, qword[rsp + 104]);
|
||||
|
||||
add(rsp, stack_size);
|
||||
mov(rcx, qword[rsp + 8 * 1]);
|
||||
mov(rdx, qword[rsp + 8 * 2]);
|
||||
|
||||
Reference in New Issue
Block a user