/** ****************************************************************************** * 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(ctx->r[13])->prcb_data.current_thread); kthread->fpu_exceptions_on = static_cast(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(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(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(ts_bundle); return xe::load_and_swap(&bundle->interrupt_time); } DECLARE_XBOXKRNL_EXPORT1(KeQueryInterruptTime, kNone, kImplemented); } // namespace xboxkrnl } // namespace kernel } // namespace xe DECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Misc);