summaryrefslogtreecommitdiff
path: root/src/core/cpu_manager.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2020-12-31 02:13:02 -0800
committerGravatar bunnei2021-01-28 21:42:25 -0800
commit47829850131f04075950b733cb93a3688e8afb5b (patch)
tree26f0cf0a7f9b01c0266b2b3752fb600953875129 /src/core/cpu_manager.cpp
parenthle: kernel: KThread: Remove thread types that do not exist. (diff)
downloadyuzu-47829850131f04075950b733cb93a3688e8afb5b.tar.gz
yuzu-47829850131f04075950b733cb93a3688e8afb5b.tar.xz
yuzu-47829850131f04075950b733cb93a3688e8afb5b.zip
hle: kernel: Move single core "phantom mode" out of KThread.
- This is a workaround that does not belong in a kernel primitive.
Diffstat (limited to 'src/core/cpu_manager.cpp')
-rw-r--r--src/core/cpu_manager.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index 018cd2e25..719258250 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -217,9 +217,9 @@ void CpuManager::SingleCoreRunGuestLoop() {
217 physical_core = &kernel.CurrentPhysicalCore(); 217 physical_core = &kernel.CurrentPhysicalCore();
218 } 218 }
219 system.ExitDynarmicProfile(); 219 system.ExitDynarmicProfile();
220 thread->SetPhantomMode(true); 220 kernel.SetIsPhantomModeForSingleCore(true);
221 system.CoreTiming().Advance(); 221 system.CoreTiming().Advance();
222 thread->SetPhantomMode(false); 222 kernel.SetIsPhantomModeForSingleCore(false);
223 physical_core->ArmInterface().ClearExclusiveState(); 223 physical_core->ArmInterface().ClearExclusiveState();
224 PreemptSingleCore(); 224 PreemptSingleCore();
225 auto& scheduler = kernel.Scheduler(current_core); 225 auto& scheduler = kernel.Scheduler(current_core);
@@ -255,22 +255,23 @@ void CpuManager::SingleCoreRunSuspendThread() {
255 255
256void CpuManager::PreemptSingleCore(bool from_running_enviroment) { 256void CpuManager::PreemptSingleCore(bool from_running_enviroment) {
257 { 257 {
258 auto& scheduler = system.Kernel().Scheduler(current_core); 258 auto& kernel = system.Kernel();
259 auto& scheduler = kernel.Scheduler(current_core);
259 Kernel::KThread* current_thread = scheduler.GetCurrentThread(); 260 Kernel::KThread* current_thread = scheduler.GetCurrentThread();
260 if (idle_count >= 4 || from_running_enviroment) { 261 if (idle_count >= 4 || from_running_enviroment) {
261 if (!from_running_enviroment) { 262 if (!from_running_enviroment) {
262 system.CoreTiming().Idle(); 263 system.CoreTiming().Idle();
263 idle_count = 0; 264 idle_count = 0;
264 } 265 }
265 current_thread->SetPhantomMode(true); 266 kernel.SetIsPhantomModeForSingleCore(true);
266 system.CoreTiming().Advance(); 267 system.CoreTiming().Advance();
267 current_thread->SetPhantomMode(false); 268 kernel.SetIsPhantomModeForSingleCore(false);
268 } 269 }
269 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); 270 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES);
270 system.CoreTiming().ResetTicks(); 271 system.CoreTiming().ResetTicks();
271 scheduler.Unload(scheduler.GetCurrentThread()); 272 scheduler.Unload(scheduler.GetCurrentThread());
272 273
273 auto& next_scheduler = system.Kernel().Scheduler(current_core); 274 auto& next_scheduler = kernel.Scheduler(current_core);
274 Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext()); 275 Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext());
275 } 276 }
276 277