|
|
|
@ -621,11 +621,14 @@ void Scheduler::OnThreadStart() { |
|
|
|
void Scheduler::Unload() { |
|
|
|
Thread* thread = current_thread.get(); |
|
|
|
if (thread) { |
|
|
|
thread->SetContinuousOnSVC(false); |
|
|
|
thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); |
|
|
|
thread->SetIsRunning(false); |
|
|
|
if (thread->IsContinuousOnSVC() && !thread->IsHLEThread()) { |
|
|
|
system.ArmInterface(core_id).ExceptionalExit(); |
|
|
|
thread->SetContinuousOnSVC(false); |
|
|
|
} |
|
|
|
if (!thread->IsHLEThread() && !thread->HasExited()) { |
|
|
|
Core::ARM_Interface& cpu_core = thread->ArmInterface(); |
|
|
|
Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |
|
|
|
cpu_core.SaveContext(thread->GetContext32()); |
|
|
|
cpu_core.SaveContext(thread->GetContext64()); |
|
|
|
// Save the TPIDR_EL0 system register in case it was modified.
|
|
|
|
@ -652,12 +655,11 @@ void Scheduler::Reload() { |
|
|
|
system.Kernel().MakeCurrentProcess(thread_owner_process); |
|
|
|
} |
|
|
|
if (!thread->IsHLEThread()) { |
|
|
|
Core::ARM_Interface& cpu_core = thread->ArmInterface(); |
|
|
|
Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |
|
|
|
cpu_core.LoadContext(thread->GetContext32()); |
|
|
|
cpu_core.LoadContext(thread->GetContext64()); |
|
|
|
cpu_core.SetTlsAddress(thread->GetTLSAddress()); |
|
|
|
cpu_core.SetTPIDR_EL0(thread->GetTPIDR_EL0()); |
|
|
|
cpu_core.ChangeProcessorID(this->core_id); |
|
|
|
cpu_core.ClearExclusiveState(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -679,12 +681,11 @@ void Scheduler::SwitchContextStep2() { |
|
|
|
system.Kernel().MakeCurrentProcess(thread_owner_process); |
|
|
|
} |
|
|
|
if (!selected_thread->IsHLEThread()) { |
|
|
|
Core::ARM_Interface& cpu_core = selected_thread->ArmInterface(); |
|
|
|
Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |
|
|
|
cpu_core.LoadContext(selected_thread->GetContext32()); |
|
|
|
cpu_core.LoadContext(selected_thread->GetContext64()); |
|
|
|
cpu_core.SetTlsAddress(selected_thread->GetTLSAddress()); |
|
|
|
cpu_core.SetTPIDR_EL0(selected_thread->GetTPIDR_EL0()); |
|
|
|
cpu_core.ChangeProcessorID(this->core_id); |
|
|
|
cpu_core.ClearExclusiveState(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -715,11 +716,14 @@ void Scheduler::SwitchContext() { |
|
|
|
if (new_thread != nullptr && new_thread->IsSuspendThread()) { |
|
|
|
previous_thread->SetWasRunning(true); |
|
|
|
} |
|
|
|
previous_thread->SetContinuousOnSVC(false); |
|
|
|
previous_thread->last_running_ticks = system.CoreTiming().GetCPUTicks(); |
|
|
|
previous_thread->SetIsRunning(false); |
|
|
|
if (previous_thread->IsContinuousOnSVC() && !previous_thread->IsHLEThread()) { |
|
|
|
system.ArmInterface(core_id).ExceptionalExit(); |
|
|
|
previous_thread->SetContinuousOnSVC(false); |
|
|
|
} |
|
|
|
if (!previous_thread->IsHLEThread() && !previous_thread->HasExited()) { |
|
|
|
Core::ARM_Interface& cpu_core = previous_thread->ArmInterface(); |
|
|
|
Core::ARM_Interface& cpu_core = system.ArmInterface(core_id); |
|
|
|
cpu_core.SaveContext(previous_thread->GetContext32()); |
|
|
|
cpu_core.SaveContext(previous_thread->GetContext64()); |
|
|
|
// Save the TPIDR_EL0 system register in case it was modified.
|
|
|
|
|