xenia/src/alloy/backend/x64/x64_thunk_emitter.h

148 lines
3.9 KiB
C
Raw Normal View History

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2014 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
2014-07-10 07:31:14 +02:00
#ifndef ALLOY_BACKEND_X64_X64_THUNK_EMITTER_H_
#define ALLOY_BACKEND_X64_X64_THUNK_EMITTER_H_
#include <alloy/core.h>
#include <alloy/backend/x64/x64_backend.h>
#include <alloy/backend/x64/x64_emitter.h>
namespace alloy {
namespace backend {
namespace x64 {
/**
* Stack Layout
* ----------------------------
* NOTE: stack must always be 16b aligned.
*
2014-02-02 21:28:40 +01:00
* Thunk stack:
* +------------------+
2014-02-01 07:51:18 +01:00
* | arg temp, 3 * 8 | rsp + 0
* | |
* | |
2014-02-01 07:51:18 +01:00
* +------------------+
2014-02-02 21:28:40 +01:00
* | scratch, 16b | rsp + 32
* | |
* +------------------+
2014-02-02 21:28:40 +01:00
* | rbx | rsp + 48
* +------------------+
* | rcx / context | rsp + 56
* +------------------+
* | rbp | rsp + 64
* +------------------+
* | rsi | rsp + 72
* +------------------+
* | rdi | rsp + 80
* +------------------+
* | r12 | rsp + 88
* +------------------+
* | r13 | rsp + 96
* +------------------+
* | r14 | rsp + 104
* +------------------+
* | r15 | rsp + 112
* +------------------+
* | (return address) | rsp + 120
* +------------------+
* | (rcx home) | rsp + 128
* +------------------+
* | (rdx home) | rsp + 136
* +------------------+
*
*
* TODO:
* +------------------+
* | xmm6 | rsp + 128
* | |
* +------------------+
* | xmm7 | rsp + 144
* | |
* +------------------+
* | xmm8 | rsp + 160
* | |
* +------------------+
* | xmm9 | rsp + 176
* | |
* +------------------+
* | xmm10 | rsp + 192
* | |
* +------------------+
* | xmm11 | rsp + 208
* | |
* +------------------+
* | xmm12 | rsp + 224
* | |
* +------------------+
* | xmm13 | rsp + 240
* | |
* +------------------+
* | xmm14 | rsp + 256
* | |
* +------------------+
* | xmm15 | rsp + 272
* | |
* +------------------+
*
2014-02-02 21:28:40 +01:00
* Guest stack:
* +------------------+
* | arg temp, 3 * 8 | rsp + 0
* | |
* | |
* +------------------+
* | scratch, 32b | rsp + 32
* | |
* +------------------+
* | rcx / context | rsp + 64
* +------------------+
2014-02-07 06:53:31 +01:00
* | guest ret addr | rsp + 72
* +------------------+
* | call ret addr | rsp + 80
* +------------------+
2014-02-02 21:28:40 +01:00
* ... locals ...
* +------------------+
* | (return address) |
2014-07-10 07:31:14 +02:00
* +------------------+
2014-02-02 21:28:40 +01:00
*
*/
class StackLayout {
public:
const static size_t THUNK_STACK_SIZE = 120;
2014-02-07 06:53:31 +01:00
const static size_t GUEST_STACK_SIZE = 88;
2014-02-02 21:28:40 +01:00
const static size_t GUEST_RCX_HOME = 64;
2014-02-07 06:53:31 +01:00
const static size_t GUEST_RET_ADDR = 72;
const static size_t GUEST_CALL_RET_ADDR = 80;
};
class X64ThunkEmitter : public X64Emitter {
public:
X64ThunkEmitter(X64Backend* backend, XbyakAllocator* allocator);
virtual ~X64ThunkEmitter();
// Call a generated function, saving all stack parameters.
HostToGuestThunk EmitHostToGuestThunk();
// Function that guest code can call to transition into host code.
GuestToHostThunk EmitGuestToHostThunk();
};
} // namespace x64
} // namespace backend
} // namespace alloy
2014-07-10 07:31:14 +02:00
#endif // ALLOY_BACKEND_X64_X64_THUNK_EMITTER_H_