46 lines
1.5 KiB
C++
46 lines
1.5 KiB
C++
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "xenia/cpu/backend/x64/x64_function.h"
|
|
|
|
#include "xenia/cpu/backend/x64/x64_backend.h"
|
|
#include "xenia/cpu/processor.h"
|
|
#include "xenia/cpu/thread_state.h"
|
|
|
|
namespace xe {
|
|
namespace cpu {
|
|
namespace backend {
|
|
namespace x64 {
|
|
|
|
X64Function::X64Function(Module* module, uint32_t address)
|
|
: GuestFunction(module, address) {}
|
|
|
|
X64Function::~X64Function() {
|
|
// machine_code_ is freed by code cache.
|
|
}
|
|
|
|
void X64Function::Setup(uint8_t* machine_code, size_t machine_code_length) {
|
|
machine_code_ = machine_code;
|
|
machine_code_length_ = machine_code_length;
|
|
}
|
|
|
|
bool X64Function::CallImpl(ThreadState* thread_state, uint32_t return_address) {
|
|
auto backend =
|
|
reinterpret_cast<X64Backend*>(thread_state->processor()->backend());
|
|
auto thunk = backend->host_to_guest_thunk();
|
|
thunk(machine_code_, thread_state->context(),
|
|
reinterpret_cast<void*>(uintptr_t(return_address)));
|
|
return true;
|
|
}
|
|
|
|
} // namespace x64
|
|
} // namespace backend
|
|
} // namespace cpu
|
|
} // namespace xe
|