diff options
| author | 2021-01-29 23:06:40 -0800 | |
|---|---|---|
| committer | 2021-01-29 23:06:40 -0800 | |
| commit | a4526c4e1acb50808bbe205952101142288e1c60 (patch) | |
| tree | 7109edf89606c43352da9de40d0e3a920a08b659 /src/core/cpu_manager.cpp | |
| parent | Merge pull request #5795 from ReinUsesLisp/bytes-to-map-end (diff) | |
| parent | hle: kernel: KLightLock: Fix several bugs. (diff) | |
| download | yuzu-a4526c4e1acb50808bbe205952101142288e1c60.tar.gz yuzu-a4526c4e1acb50808bbe205952101142288e1c60.tar.xz yuzu-a4526c4e1acb50808bbe205952101142288e1c60.zip | |
Merge pull request #5779 from bunnei/kthread-rewrite
Rewrite KThread to be more accurate
Diffstat (limited to 'src/core/cpu_manager.cpp')
| -rw-r--r-- | src/core/cpu_manager.cpp | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp index 373395047..8f04fb8f5 100644 --- a/src/core/cpu_manager.cpp +++ b/src/core/cpu_manager.cpp | |||
| @@ -11,9 +11,9 @@ | |||
| 11 | #include "core/core_timing.h" | 11 | #include "core/core_timing.h" |
| 12 | #include "core/cpu_manager.h" | 12 | #include "core/cpu_manager.h" |
| 13 | #include "core/hle/kernel/k_scheduler.h" | 13 | #include "core/hle/kernel/k_scheduler.h" |
| 14 | #include "core/hle/kernel/k_thread.h" | ||
| 14 | #include "core/hle/kernel/kernel.h" | 15 | #include "core/hle/kernel/kernel.h" |
| 15 | #include "core/hle/kernel/physical_core.h" | 16 | #include "core/hle/kernel/physical_core.h" |
| 16 | #include "core/hle/kernel/thread.h" | ||
| 17 | #include "video_core/gpu.h" | 17 | #include "video_core/gpu.h" |
| 18 | 18 | ||
| 19 | namespace Core { | 19 | namespace Core { |
| @@ -147,7 +147,7 @@ void CpuManager::MultiCoreRunSuspendThread() { | |||
| 147 | while (true) { | 147 | while (true) { |
| 148 | auto core = kernel.GetCurrentHostThreadID(); | 148 | auto core = kernel.GetCurrentHostThreadID(); |
| 149 | auto& scheduler = *kernel.CurrentScheduler(); | 149 | auto& scheduler = *kernel.CurrentScheduler(); |
| 150 | Kernel::Thread* current_thread = scheduler.GetCurrentThread(); | 150 | Kernel::KThread* current_thread = scheduler.GetCurrentThread(); |
| 151 | Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[core].host_context); | 151 | Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[core].host_context); |
| 152 | ASSERT(scheduler.ContextSwitchPending()); | 152 | ASSERT(scheduler.ContextSwitchPending()); |
| 153 | ASSERT(core == kernel.GetCurrentHostThreadID()); | 153 | ASSERT(core == kernel.GetCurrentHostThreadID()); |
| @@ -208,7 +208,6 @@ void CpuManager::SingleCoreRunGuestThread() { | |||
| 208 | 208 | ||
| 209 | void CpuManager::SingleCoreRunGuestLoop() { | 209 | void CpuManager::SingleCoreRunGuestLoop() { |
| 210 | auto& kernel = system.Kernel(); | 210 | auto& kernel = system.Kernel(); |
| 211 | auto* thread = kernel.CurrentScheduler()->GetCurrentThread(); | ||
| 212 | while (true) { | 211 | while (true) { |
| 213 | auto* physical_core = &kernel.CurrentPhysicalCore(); | 212 | auto* physical_core = &kernel.CurrentPhysicalCore(); |
| 214 | system.EnterDynarmicProfile(); | 213 | system.EnterDynarmicProfile(); |
| @@ -217,9 +216,9 @@ void CpuManager::SingleCoreRunGuestLoop() { | |||
| 217 | physical_core = &kernel.CurrentPhysicalCore(); | 216 | physical_core = &kernel.CurrentPhysicalCore(); |
| 218 | } | 217 | } |
| 219 | system.ExitDynarmicProfile(); | 218 | system.ExitDynarmicProfile(); |
| 220 | thread->SetPhantomMode(true); | 219 | kernel.SetIsPhantomModeForSingleCore(true); |
| 221 | system.CoreTiming().Advance(); | 220 | system.CoreTiming().Advance(); |
| 222 | thread->SetPhantomMode(false); | 221 | kernel.SetIsPhantomModeForSingleCore(false); |
| 223 | physical_core->ArmInterface().ClearExclusiveState(); | 222 | physical_core->ArmInterface().ClearExclusiveState(); |
| 224 | PreemptSingleCore(); | 223 | PreemptSingleCore(); |
| 225 | auto& scheduler = kernel.Scheduler(current_core); | 224 | auto& scheduler = kernel.Scheduler(current_core); |
| @@ -245,7 +244,7 @@ void CpuManager::SingleCoreRunSuspendThread() { | |||
| 245 | while (true) { | 244 | while (true) { |
| 246 | auto core = kernel.GetCurrentHostThreadID(); | 245 | auto core = kernel.GetCurrentHostThreadID(); |
| 247 | auto& scheduler = *kernel.CurrentScheduler(); | 246 | auto& scheduler = *kernel.CurrentScheduler(); |
| 248 | Kernel::Thread* current_thread = scheduler.GetCurrentThread(); | 247 | Kernel::KThread* current_thread = scheduler.GetCurrentThread(); |
| 249 | Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[0].host_context); | 248 | Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[0].host_context); |
| 250 | ASSERT(scheduler.ContextSwitchPending()); | 249 | ASSERT(scheduler.ContextSwitchPending()); |
| 251 | ASSERT(core == kernel.GetCurrentHostThreadID()); | 250 | ASSERT(core == kernel.GetCurrentHostThreadID()); |
| @@ -255,22 +254,23 @@ void CpuManager::SingleCoreRunSuspendThread() { | |||
| 255 | 254 | ||
| 256 | void CpuManager::PreemptSingleCore(bool from_running_enviroment) { | 255 | void CpuManager::PreemptSingleCore(bool from_running_enviroment) { |
| 257 | { | 256 | { |
| 258 | auto& scheduler = system.Kernel().Scheduler(current_core); | 257 | auto& kernel = system.Kernel(); |
| 259 | Kernel::Thread* current_thread = scheduler.GetCurrentThread(); | 258 | auto& scheduler = kernel.Scheduler(current_core); |
| 259 | Kernel::KThread* current_thread = scheduler.GetCurrentThread(); | ||
| 260 | if (idle_count >= 4 || from_running_enviroment) { | 260 | if (idle_count >= 4 || from_running_enviroment) { |
| 261 | if (!from_running_enviroment) { | 261 | if (!from_running_enviroment) { |
| 262 | system.CoreTiming().Idle(); | 262 | system.CoreTiming().Idle(); |
| 263 | idle_count = 0; | 263 | idle_count = 0; |
| 264 | } | 264 | } |
| 265 | current_thread->SetPhantomMode(true); | 265 | kernel.SetIsPhantomModeForSingleCore(true); |
| 266 | system.CoreTiming().Advance(); | 266 | system.CoreTiming().Advance(); |
| 267 | current_thread->SetPhantomMode(false); | 267 | kernel.SetIsPhantomModeForSingleCore(false); |
| 268 | } | 268 | } |
| 269 | current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); | 269 | current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); |
| 270 | system.CoreTiming().ResetTicks(); | 270 | system.CoreTiming().ResetTicks(); |
| 271 | scheduler.Unload(scheduler.GetCurrentThread()); | 271 | scheduler.Unload(scheduler.GetCurrentThread()); |
| 272 | 272 | ||
| 273 | auto& next_scheduler = system.Kernel().Scheduler(current_core); | 273 | auto& next_scheduler = kernel.Scheduler(current_core); |
| 274 | Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext()); | 274 | Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext()); |
| 275 | } | 275 | } |
| 276 | 276 | ||
| @@ -278,8 +278,7 @@ void CpuManager::PreemptSingleCore(bool from_running_enviroment) { | |||
| 278 | { | 278 | { |
| 279 | auto& scheduler = system.Kernel().Scheduler(current_core); | 279 | auto& scheduler = system.Kernel().Scheduler(current_core); |
| 280 | scheduler.Reload(scheduler.GetCurrentThread()); | 280 | scheduler.Reload(scheduler.GetCurrentThread()); |
| 281 | auto* currrent_thread2 = scheduler.GetCurrentThread(); | 281 | if (!scheduler.IsIdle()) { |
| 282 | if (!currrent_thread2->IsIdleThread()) { | ||
| 283 | idle_count = 0; | 282 | idle_count = 0; |
| 284 | } | 283 | } |
| 285 | } | 284 | } |