summaryrefslogtreecommitdiff
path: root/src/core/cpu_manager.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2021-01-29 23:06:40 -0800
committerGravatar GitHub2021-01-29 23:06:40 -0800
commita4526c4e1acb50808bbe205952101142288e1c60 (patch)
tree7109edf89606c43352da9de40d0e3a920a08b659 /src/core/cpu_manager.cpp
parentMerge pull request #5795 from ReinUsesLisp/bytes-to-map-end (diff)
parenthle: kernel: KLightLock: Fix several bugs. (diff)
downloadyuzu-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.cpp25
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
19namespace Core { 19namespace 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
209void CpuManager::SingleCoreRunGuestLoop() { 209void 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
256void CpuManager::PreemptSingleCore(bool from_running_enviroment) { 255void 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 }