|
|
|
@ -118,17 +118,18 @@ void CpuManager::MultiCoreRunGuestLoop() { |
|
|
|
physical_core = &kernel.CurrentPhysicalCore(); |
|
|
|
} |
|
|
|
system.ExitDynarmicProfile(); |
|
|
|
physical_core->ArmInterface().ClearExclusiveState(); |
|
|
|
kernel.CurrentScheduler()->RescheduleCurrentCore(); |
|
|
|
{ |
|
|
|
Kernel::KScopedDisableDispatch dd(kernel); |
|
|
|
physical_core->ArmInterface().ClearExclusiveState(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void CpuManager::MultiCoreRunIdleThread() { |
|
|
|
auto& kernel = system.Kernel(); |
|
|
|
while (true) { |
|
|
|
auto& physical_core = kernel.CurrentPhysicalCore(); |
|
|
|
physical_core.Idle(); |
|
|
|
kernel.CurrentScheduler()->RescheduleCurrentCore(); |
|
|
|
Kernel::KScopedDisableDispatch dd(kernel); |
|
|
|
kernel.CurrentPhysicalCore().Idle(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -136,12 +137,12 @@ void CpuManager::MultiCoreRunSuspendThread() { |
|
|
|
auto& kernel = system.Kernel(); |
|
|
|
kernel.CurrentScheduler()->OnThreadStart(); |
|
|
|
while (true) { |
|
|
|
auto core = kernel.GetCurrentHostThreadID(); |
|
|
|
auto core = kernel.CurrentPhysicalCoreIndex(); |
|
|
|
auto& scheduler = *kernel.CurrentScheduler(); |
|
|
|
Kernel::KThread* current_thread = scheduler.GetCurrentThread(); |
|
|
|
Common::Fiber::YieldTo(current_thread->GetHostContext(), *core_data[core].host_context); |
|
|
|
ASSERT(scheduler.ContextSwitchPending()); |
|
|
|
ASSERT(core == kernel.GetCurrentHostThreadID()); |
|
|
|
ASSERT(core == kernel.CurrentPhysicalCoreIndex()); |
|
|
|
scheduler.RescheduleCurrentCore(); |
|
|
|
} |
|
|
|
} |
|
|
|
|