67 lines
2.6 KiB
C++
67 lines
2.6 KiB
C++
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2022 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "xenia/kernel/util/shim_utils.h"
|
|
#include "xenia/kernel/xboxkrnl/xboxkrnl_private.h"
|
|
#include "xenia/kernel/xthread.h"
|
|
#include "xenia/xbox.h"
|
|
|
|
namespace xe {
|
|
namespace kernel {
|
|
namespace xboxkrnl {
|
|
|
|
void KeEnableFpuExceptions_entry(
|
|
const ppc_context_t& ctx) { // dword_t enabled) {
|
|
// TODO(benvanik): can we do anything about exceptions?
|
|
// theres a lot more thats supposed to happen here, the floating point state
|
|
// has to be saved to kthread, the irql changes, the machine state register is
|
|
// changed to enable exceptions
|
|
|
|
X_KTHREAD* kthread = ctx->TranslateVirtual(
|
|
ctx->TranslateVirtualGPR<X_KPCR*>(ctx->r[13])->prcb_data.current_thread);
|
|
kthread->fpu_exceptions_on = static_cast<uint32_t>(ctx->r[3]) != 0;
|
|
}
|
|
DECLARE_XBOXKRNL_EXPORT1(KeEnableFpuExceptions, kNone, kStub);
|
|
|
|
void KeSaveFloatingPointState_entry(const ppc_context_t& ctx) {
|
|
// Probably we should use: thread_fpu_related to store/restore state
|
|
X_KTHREAD* kthread = ctx->TranslateVirtual(
|
|
ctx->TranslateVirtualGPR<X_KPCR*>(ctx->r[13])->prcb_data.current_thread);
|
|
|
|
for (size_t i = 0; i < xe::countof(ctx->f); ++i) {
|
|
kthread->fpu_context[i] = ctx->f[i];
|
|
}
|
|
}
|
|
DECLARE_XBOXKRNL_EXPORT1(KeSaveFloatingPointState, kNone, kSketchy);
|
|
|
|
void KeRestoreFloatingPointState_entry(const ppc_context_t& ctx) {
|
|
const X_KTHREAD* kthread = ctx->TranslateVirtual(
|
|
ctx->TranslateVirtualGPR<X_KPCR*>(ctx->r[13])->prcb_data.current_thread);
|
|
|
|
for (size_t i = 0; i < xe::countof(ctx->f); ++i) {
|
|
ctx->f[i] = kthread->fpu_context[i];
|
|
}
|
|
}
|
|
DECLARE_XBOXKRNL_EXPORT1(KeRestoreFloatingPointState, kNone, kSketchy);
|
|
|
|
static qword_result_t KeQueryInterruptTime_entry(const ppc_context_t& ctx) {
|
|
auto kstate = ctx->kernel_state;
|
|
uint32_t ts_bundle = kstate->GetKeTimestampBundle();
|
|
X_TIME_STAMP_BUNDLE* bundle =
|
|
ctx->TranslateVirtual<X_TIME_STAMP_BUNDLE*>(ts_bundle);
|
|
|
|
return xe::load_and_swap<uint64_t>(&bundle->interrupt_time);
|
|
}
|
|
DECLARE_XBOXKRNL_EXPORT1(KeQueryInterruptTime, kNone, kImplemented);
|
|
} // namespace xboxkrnl
|
|
} // namespace kernel
|
|
} // namespace xe
|
|
|
|
DECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Misc);
|