|
|
@ -78,10 +78,10 @@ void CpuManager::RunGuestThread() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while (true) {
|
|
|
|
while (true) {
|
|
|
|
auto& physical_core = kernel.CurrentPhysicalCore();
|
|
|
|
auto& physical_core = kernel.CurrentPhysicalCore();
|
|
|
|
LOG_CRITICAL(Core_ARM, "Running Guest Thread");
|
|
|
|
if (!physical_core.IsInterrupted()) {
|
|
|
|
physical_core.Idle();
|
|
|
|
physical_core.Idle();
|
|
|
|
LOG_CRITICAL(Core_ARM, "Leaving Guest Thread");
|
|
|
|
|
|
|
|
//physical_core.Run();
|
|
|
|
//physical_core.Run();
|
|
|
|
|
|
|
|
}
|
|
|
|
auto& scheduler = physical_core.Scheduler();
|
|
|
|
auto& scheduler = physical_core.Scheduler();
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -91,7 +91,6 @@ void CpuManager::RunIdleThread() {
|
|
|
|
auto& kernel = system.Kernel();
|
|
|
|
auto& kernel = system.Kernel();
|
|
|
|
while (true) {
|
|
|
|
while (true) {
|
|
|
|
auto& physical_core = kernel.CurrentPhysicalCore();
|
|
|
|
auto& physical_core = kernel.CurrentPhysicalCore();
|
|
|
|
LOG_CRITICAL(Core_ARM, "Running Idle Thread");
|
|
|
|
|
|
|
|
physical_core.Idle();
|
|
|
|
physical_core.Idle();
|
|
|
|
auto& scheduler = physical_core.Scheduler();
|
|
|
|
auto& scheduler = physical_core.Scheduler();
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
@ -99,7 +98,6 @@ void CpuManager::RunIdleThread() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CpuManager::RunSuspendThread() {
|
|
|
|
void CpuManager::RunSuspendThread() {
|
|
|
|
LOG_CRITICAL(Core_ARM, "Suspending Thread Entered");
|
|
|
|
|
|
|
|
auto& kernel = system.Kernel();
|
|
|
|
auto& kernel = system.Kernel();
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto& sched = kernel.CurrentScheduler();
|
|
|
|
auto& sched = kernel.CurrentScheduler();
|
|
|
@ -109,9 +107,7 @@ void CpuManager::RunSuspendThread() {
|
|
|
|
auto core = kernel.GetCurrentHostThreadID();
|
|
|
|
auto core = kernel.GetCurrentHostThreadID();
|
|
|
|
auto& scheduler = kernel.CurrentScheduler();
|
|
|
|
auto& scheduler = kernel.CurrentScheduler();
|
|
|
|
Kernel::Thread* current_thread = scheduler.GetCurrentThread();
|
|
|
|
Kernel::Thread* current_thread = scheduler.GetCurrentThread();
|
|
|
|
LOG_CRITICAL(Core_ARM, "Suspending Core {}", core);
|
|
|
|
|
|
|
|
Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[core].host_context);
|
|
|
|
Common::Fiber::YieldTo(current_thread->GetHostContext(), core_data[core].host_context);
|
|
|
|
LOG_CRITICAL(Core_ARM, "Unsuspending Core {}", core);
|
|
|
|
|
|
|
|
ASSERT(scheduler.ContextSwitchPending());
|
|
|
|
ASSERT(scheduler.ContextSwitchPending());
|
|
|
|
ASSERT(core == kernel.GetCurrentHostThreadID());
|
|
|
|
ASSERT(core == kernel.GetCurrentHostThreadID());
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
|
scheduler.TryDoContextSwitch();
|
|
|
|