diff options
| author | 2022-07-07 12:34:46 -0400 | |
|---|---|---|
| committer | 2022-07-14 22:47:18 -0400 | |
| commit | da07e13e0798a4ebd423595830f04e2234a03942 (patch) | |
| tree | 2e2a88eb2fd2a5ae6f070609040418f9c1df4c35 /src/core/hle/kernel | |
| parent | kernel: fix issues with single core mode (diff) | |
| download | yuzu-da07e13e0798a4ebd423595830f04e2234a03942.tar.gz yuzu-da07e13e0798a4ebd423595830f04e2234a03942.tar.xz yuzu-da07e13e0798a4ebd423595830f04e2234a03942.zip | |
kernel: fix single-core preemption points
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_scheduler.h | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 1 |
4 files changed, 14 insertions, 11 deletions
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index cac96a780..230ca3b95 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp | |||
| @@ -103,7 +103,20 @@ void KScheduler::ScheduleOnInterrupt() { | |||
| 103 | GetCurrentThread(kernel).EnableDispatch(); | 103 | GetCurrentThread(kernel).EnableDispatch(); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | void KScheduler::PreemptSingleCore() { | ||
| 107 | GetCurrentThread(kernel).DisableDispatch(); | ||
| 108 | |||
| 109 | auto* thread = GetCurrentThreadPointer(kernel); | ||
| 110 | auto& previous_scheduler = kernel.Scheduler(thread->GetCurrentCore()); | ||
| 111 | previous_scheduler.Unload(thread); | ||
| 112 | |||
| 113 | Common::Fiber::YieldTo(thread->GetHostContext(), *m_switch_fiber); | ||
| 114 | |||
| 115 | GetCurrentThread(kernel).EnableDispatch(); | ||
| 116 | } | ||
| 117 | |||
| 106 | void KScheduler::RescheduleCurrentCore() { | 118 | void KScheduler::RescheduleCurrentCore() { |
| 119 | ASSERT(!kernel.IsPhantomModeForSingleCore()); | ||
| 107 | ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() == 1); | 120 | ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() == 1); |
| 108 | 121 | ||
| 109 | GetCurrentThread(kernel).EnableDispatch(); | 122 | GetCurrentThread(kernel).EnableDispatch(); |
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h index 91e870933..ac7421c9a 100644 --- a/src/core/hle/kernel/k_scheduler.h +++ b/src/core/hle/kernel/k_scheduler.h | |||
| @@ -49,6 +49,7 @@ public: | |||
| 49 | 49 | ||
| 50 | void SetInterruptTaskRunnable(); | 50 | void SetInterruptTaskRunnable(); |
| 51 | void RequestScheduleOnInterrupt(); | 51 | void RequestScheduleOnInterrupt(); |
| 52 | void PreemptSingleCore(); | ||
| 52 | 53 | ||
| 53 | u64 GetIdleCount() { | 54 | u64 GetIdleCount() { |
| 54 | return m_state.idle_count; | 55 | return m_state.idle_count; |
| @@ -62,10 +63,6 @@ public: | |||
| 62 | return m_current_thread.load() == m_idle_thread; | 63 | return m_current_thread.load() == m_idle_thread; |
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | std::shared_ptr<Common::Fiber> GetSwitchFiber() { | ||
| 66 | return m_switch_fiber; | ||
| 67 | } | ||
| 68 | |||
| 69 | KThread* GetPreviousThread() const { | 66 | KThread* GetPreviousThread() const { |
| 70 | return m_state.prev_thread; | 67 | return m_state.prev_thread; |
| 71 | } | 68 | } |
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index d5d390f04..3640d1d13 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp | |||
| @@ -1204,12 +1204,6 @@ KScopedDisableDispatch::~KScopedDisableDispatch() { | |||
| 1204 | return; | 1204 | return; |
| 1205 | } | 1205 | } |
| 1206 | 1206 | ||
| 1207 | // Skip the reschedule if single-core. | ||
| 1208 | if (!Settings::values.use_multi_core.GetValue()) { | ||
| 1209 | GetCurrentThread(kernel).EnableDispatch(); | ||
| 1210 | return; | ||
| 1211 | } | ||
| 1212 | |||
| 1213 | if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { | 1207 | if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { |
| 1214 | auto scheduler = kernel.CurrentScheduler(); | 1208 | auto scheduler = kernel.CurrentScheduler(); |
| 1215 | 1209 | ||
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 1fc8f5f3e..9ee20208e 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h | |||
| @@ -110,7 +110,6 @@ void SetCurrentThread(KernelCore& kernel, KThread* thread); | |||
| 110 | [[nodiscard]] KThread* GetCurrentThreadPointer(KernelCore& kernel); | 110 | [[nodiscard]] KThread* GetCurrentThreadPointer(KernelCore& kernel); |
| 111 | [[nodiscard]] KThread& GetCurrentThread(KernelCore& kernel); | 111 | [[nodiscard]] KThread& GetCurrentThread(KernelCore& kernel); |
| 112 | [[nodiscard]] s32 GetCurrentCoreId(KernelCore& kernel); | 112 | [[nodiscard]] s32 GetCurrentCoreId(KernelCore& kernel); |
| 113 | size_t CaptureBacktrace(void** buffer, size_t max); | ||
| 114 | 113 | ||
| 115 | class KThread final : public KAutoObjectWithSlabHeapAndContainer<KThread, KWorkerTask>, | 114 | class KThread final : public KAutoObjectWithSlabHeapAndContainer<KThread, KWorkerTask>, |
| 116 | public boost::intrusive::list_base_hook<> { | 115 | public boost::intrusive::list_base_hook<> { |