diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
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 { | |||
| 62 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); | 62 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); |
| 63 | service_thread_manager = | 63 | service_thread_manager = |
| 64 | std::make_unique<Common::ThreadWorker>(1, "yuzu:ServiceThreadManager"); | 64 | std::make_unique<Common::ThreadWorker>(1, "yuzu:ServiceThreadManager"); |
| 65 | is_phantom_mode_for_singlecore = false; | ||
| 65 | 66 | ||
| 66 | InitializePhysicalCores(); | 67 | InitializePhysicalCores(); |
| 67 | InitializeSystemResourceLimit(kernel); | 68 | InitializeSystemResourceLimit(kernel); |
| @@ -227,6 +228,15 @@ struct KernelCore::Impl { | |||
| 227 | return this_id; | 228 | return this_id; |
| 228 | } | 229 | } |
| 229 | 230 | ||
| 231 | bool IsPhantomModeForSingleCore() const { | ||
| 232 | return is_phantom_mode_for_singlecore; | ||
| 233 | } | ||
| 234 | |||
| 235 | void SetIsPhantomModeForSingleCore(bool value) { | ||
| 236 | ASSERT(!is_multicore); | ||
| 237 | is_phantom_mode_for_singlecore = value; | ||
| 238 | } | ||
| 239 | |||
| 230 | [[nodiscard]] Core::EmuThreadHandle GetCurrentEmuThreadID() { | 240 | [[nodiscard]] Core::EmuThreadHandle GetCurrentEmuThreadID() { |
| 231 | Core::EmuThreadHandle result = Core::EmuThreadHandle::InvalidHandle(); | 241 | Core::EmuThreadHandle result = Core::EmuThreadHandle::InvalidHandle(); |
| 232 | result.host_handle = GetCurrentHostThreadID(); | 242 | result.host_handle = GetCurrentHostThreadID(); |
| @@ -235,7 +245,7 @@ struct KernelCore::Impl { | |||
| 235 | } | 245 | } |
| 236 | const Kernel::KScheduler& sched = cores[result.host_handle].Scheduler(); | 246 | const Kernel::KScheduler& sched = cores[result.host_handle].Scheduler(); |
| 237 | const Kernel::KThread* current = sched.GetCurrentThread(); | 247 | const Kernel::KThread* current = sched.GetCurrentThread(); |
| 238 | if (current != nullptr && !current->IsPhantomMode()) { | 248 | if (current != nullptr && !IsPhantomModeForSingleCore()) { |
| 239 | result.guest_handle = current->GetGlobalHandle(); | 249 | result.guest_handle = current->GetGlobalHandle(); |
| 240 | } else { | 250 | } else { |
| 241 | result.guest_handle = InvalidHandle; | 251 | result.guest_handle = InvalidHandle; |
| @@ -345,6 +355,7 @@ struct KernelCore::Impl { | |||
| 345 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; | 355 | std::array<std::unique_ptr<Kernel::KScheduler>, Core::Hardware::NUM_CPU_CORES> schedulers{}; |
| 346 | 356 | ||
| 347 | bool is_multicore{}; | 357 | bool is_multicore{}; |
| 358 | bool is_phantom_mode_for_singlecore{}; | ||
| 348 | u32 single_core_thread_id{}; | 359 | u32 single_core_thread_id{}; |
| 349 | 360 | ||
| 350 | std::array<u64, Core::Hardware::NUM_CPU_CORES> svc_ticks{}; | 361 | std::array<u64, Core::Hardware::NUM_CPU_CORES> svc_ticks{}; |
| @@ -643,4 +654,12 @@ void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> servi | |||
| 643 | }); | 654 | }); |
| 644 | } | 655 | } |
| 645 | 656 | ||
| 657 | bool KernelCore::IsPhantomModeForSingleCore() const { | ||
| 658 | return impl->IsPhantomModeForSingleCore(); | ||
| 659 | } | ||
| 660 | |||
| 661 | void KernelCore::SetIsPhantomModeForSingleCore(bool value) { | ||
| 662 | impl->SetIsPhantomModeForSingleCore(value); | ||
| 663 | } | ||
| 664 | |||
| 646 | } // namespace Kernel | 665 | } // namespace Kernel |