From 4b9e1b6586a8a4017b8e3e0fb52457d1e2568066 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Wed, 18 Nov 2020 16:52:47 -0800
Subject: [PATCH] kernel: scheduler: Minor cleanup to remove duplicated code.

---
 src/core/hle/kernel/scheduler.cpp | 58 +++++++------------------------
 src/core/hle/kernel/scheduler.h   |  2 ++
 2 files changed, 14 insertions(+), 46 deletions(-)

diff --git a/src/core/hle/kernel/scheduler.cpp b/src/core/hle/kernel/scheduler.cpp
index 0805e99147..5c63b0b4a2 100644
--- a/src/core/hle/kernel/scheduler.cpp
+++ b/src/core/hle/kernel/scheduler.cpp
@@ -618,8 +618,7 @@ void Scheduler::OnThreadStart() {
     SwitchContextStep2();
 }
 
-void Scheduler::Unload() {
-    Thread* thread = current_thread.get();
+void Scheduler::Unload(Thread* thread) {
     if (thread) {
         thread->last_running_ticks = system.CoreTiming().GetCPUTicks();
         thread->SetIsRunning(false);
@@ -639,8 +638,11 @@ void Scheduler::Unload() {
     }
 }
 
-void Scheduler::Reload() {
-    Thread* thread = current_thread.get();
+void Scheduler::Unload() {
+    Unload(current_thread.get());
+}
+
+void Scheduler::Reload(Thread* thread) {
     if (thread) {
         ASSERT_MSG(thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
                    "Thread must be runnable.");
@@ -665,30 +667,13 @@ void Scheduler::Reload() {
     }
 }
 
+void Scheduler::Reload() {
+    Reload(current_thread.get());
+}
+
 void Scheduler::SwitchContextStep2() {
     // Load context of new thread
-    if (selected_thread) {
-        ASSERT_MSG(selected_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
-                   "Thread must be runnable.");
-
-        // Cancel any outstanding wakeup events for this thread
-        selected_thread->SetIsRunning(true);
-        selected_thread->last_running_ticks = system.CoreTiming().GetCPUTicks();
-        selected_thread->SetWasRunning(false);
-
-        auto* const thread_owner_process = current_thread->GetOwnerProcess();
-        if (thread_owner_process != nullptr) {
-            system.Kernel().MakeCurrentProcess(thread_owner_process);
-        }
-        if (!selected_thread->IsHLEThread()) {
-            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.ClearExclusiveState();
-        }
-    }
+    Reload(selected_thread.get());
 
     TryDoContextSwitch();
 }
@@ -712,26 +697,7 @@ void Scheduler::SwitchContext() {
     UpdateLastContextSwitchTime(previous_thread, previous_process);
 
     // Save context for previous thread
-    if (previous_thread) {
-        if (new_thread != nullptr && new_thread->IsSuspendThread()) {
-            previous_thread->SetWasRunning(true);
-        }
-        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 = 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.
-            previous_thread->SetTPIDR_EL0(cpu_core.GetTPIDR_EL0());
-            cpu_core.ClearExclusiveState();
-        }
-        previous_thread->context_guard.unlock();
-    }
+    Unload(previous_thread);
 
     std::shared_ptr<Common::Fiber>* old_context;
     if (previous_thread != nullptr) {
diff --git a/src/core/hle/kernel/scheduler.h b/src/core/hle/kernel/scheduler.h
index b6f04dceae..68db4a5efe 100644
--- a/src/core/hle/kernel/scheduler.h
+++ b/src/core/hle/kernel/scheduler.h
@@ -212,8 +212,10 @@ public:
 
     /// The next two are for SingleCore Only.
     /// Unload current thread before preempting core.
+    void Unload(Thread* thread);
     void Unload();
     /// Reload current thread after core preemption.
+    void Reload(Thread* thread);
     void Reload();
 
     /// Gets the current running thread