From 47829850131f04075950b733cb93a3688e8afb5b Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 31 Dec 2020 02:13:02 -0800 Subject: hle: kernel: Move single core "phantom mode" out of KThread. - This is a workaround that does not belong in a kernel primitive. --- src/core/hle/kernel/kernel.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/core/hle/kernel/kernel.cpp') diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 6ae0bdeed..80a78e643 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -62,6 +62,7 @@ struct KernelCore::Impl { global_scheduler_context = std::make_unique(kernel); service_thread_manager = std::make_unique(1, "yuzu:ServiceThreadManager"); + is_phantom_mode_for_singlecore = false; InitializePhysicalCores(); InitializeSystemResourceLimit(kernel); @@ -227,6 +228,15 @@ struct KernelCore::Impl { return this_id; } + bool IsPhantomModeForSingleCore() const { + return is_phantom_mode_for_singlecore; + } + + void SetIsPhantomModeForSingleCore(bool value) { + ASSERT(!is_multicore); + is_phantom_mode_for_singlecore = value; + } + [[nodiscard]] Core::EmuThreadHandle GetCurrentEmuThreadID() { Core::EmuThreadHandle result = Core::EmuThreadHandle::InvalidHandle(); result.host_handle = GetCurrentHostThreadID(); @@ -235,7 +245,7 @@ struct KernelCore::Impl { } const Kernel::KScheduler& sched = cores[result.host_handle].Scheduler(); const Kernel::KThread* current = sched.GetCurrentThread(); - if (current != nullptr && !current->IsPhantomMode()) { + if (current != nullptr && !IsPhantomModeForSingleCore()) { result.guest_handle = current->GetGlobalHandle(); } else { result.guest_handle = InvalidHandle; @@ -345,6 +355,7 @@ struct KernelCore::Impl { std::array, Core::Hardware::NUM_CPU_CORES> schedulers{}; bool is_multicore{}; + bool is_phantom_mode_for_singlecore{}; u32 single_core_thread_id{}; std::array svc_ticks{}; @@ -643,4 +654,12 @@ void KernelCore::ReleaseServiceThread(std::weak_ptr servi }); } +bool KernelCore::IsPhantomModeForSingleCore() const { + return impl->IsPhantomModeForSingleCore(); +} + +void KernelCore::SetIsPhantomModeForSingleCore(bool value) { + impl->SetIsPhantomModeForSingleCore(value); +} + } // namespace Kernel -- cgit v1.2.3