diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/core.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/address_arbiter.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 19 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 19 |
5 files changed, 42 insertions, 23 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index ab7181a05..6dda20faa 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -78,6 +78,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | |||
| 78 | return vfs->OpenFile(path, FileSys::Mode::Read); | 78 | return vfs->OpenFile(path, FileSys::Mode::Read); |
| 79 | } | 79 | } |
| 80 | struct System::Impl { | 80 | struct System::Impl { |
| 81 | explicit Impl(System& system) : kernel{system} {} | ||
| 81 | 82 | ||
| 82 | Cpu& CurrentCpuCore() { | 83 | Cpu& CurrentCpuCore() { |
| 83 | return cpu_core_manager.GetCurrentCore(); | 84 | return cpu_core_manager.GetCurrentCore(); |
| @@ -95,7 +96,7 @@ struct System::Impl { | |||
| 95 | LOG_DEBUG(HW_Memory, "initialized OK"); | 96 | LOG_DEBUG(HW_Memory, "initialized OK"); |
| 96 | 97 | ||
| 97 | core_timing.Initialize(); | 98 | core_timing.Initialize(); |
| 98 | kernel.Initialize(core_timing); | 99 | kernel.Initialize(); |
| 99 | 100 | ||
| 100 | const auto current_time = std::chrono::duration_cast<std::chrono::seconds>( | 101 | const auto current_time = std::chrono::duration_cast<std::chrono::seconds>( |
| 101 | std::chrono::system_clock::now().time_since_epoch()); | 102 | std::chrono::system_clock::now().time_since_epoch()); |
| @@ -265,7 +266,7 @@ struct System::Impl { | |||
| 265 | Core::FrameLimiter frame_limiter; | 266 | Core::FrameLimiter frame_limiter; |
| 266 | }; | 267 | }; |
| 267 | 268 | ||
| 268 | System::System() : impl{std::make_unique<Impl>()} {} | 269 | System::System() : impl{std::make_unique<Impl>(*this)} {} |
| 269 | System::~System() = default; | 270 | System::~System() = default; |
| 270 | 271 | ||
| 271 | Cpu& System::CurrentCpuCore() { | 272 | Cpu& System::CurrentCpuCore() { |
diff --git a/src/core/hle/kernel/address_arbiter.cpp b/src/core/hle/kernel/address_arbiter.cpp index daebbbd1d..9780a7849 100644 --- a/src/core/hle/kernel/address_arbiter.cpp +++ b/src/core/hle/kernel/address_arbiter.cpp | |||
| @@ -39,7 +39,7 @@ void WakeThreads(const std::vector<SharedPtr<Thread>>& waiting_threads, s32 num_ | |||
| 39 | } | 39 | } |
| 40 | } // Anonymous namespace | 40 | } // Anonymous namespace |
| 41 | 41 | ||
| 42 | AddressArbiter::AddressArbiter() = default; | 42 | AddressArbiter::AddressArbiter(Core::System& system) : system{system} {} |
| 43 | AddressArbiter::~AddressArbiter() = default; | 43 | AddressArbiter::~AddressArbiter() = default; |
| 44 | 44 | ||
| 45 | ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { | 45 | ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { |
| @@ -134,22 +134,22 @@ ResultCode AddressArbiter::WaitForAddressIfEqual(VAddr address, s32 value, s64 t | |||
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | ResultCode AddressArbiter::WaitForAddress(VAddr address, s64 timeout) { | 136 | ResultCode AddressArbiter::WaitForAddress(VAddr address, s64 timeout) { |
| 137 | SharedPtr<Thread> current_thread = GetCurrentThread(); | 137 | SharedPtr<Thread> current_thread = system.CurrentScheduler().GetCurrentThread(); |
| 138 | current_thread->SetArbiterWaitAddress(address); | 138 | current_thread->SetArbiterWaitAddress(address); |
| 139 | current_thread->SetStatus(ThreadStatus::WaitArb); | 139 | current_thread->SetStatus(ThreadStatus::WaitArb); |
| 140 | current_thread->InvalidateWakeupCallback(); | 140 | current_thread->InvalidateWakeupCallback(); |
| 141 | 141 | ||
| 142 | current_thread->WakeAfterDelay(timeout); | 142 | current_thread->WakeAfterDelay(timeout); |
| 143 | 143 | ||
| 144 | Core::System::GetInstance().CpuCore(current_thread->GetProcessorID()).PrepareReschedule(); | 144 | system.CpuCore(current_thread->GetProcessorID()).PrepareReschedule(); |
| 145 | return RESULT_TIMEOUT; | 145 | return RESULT_TIMEOUT; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const { | 148 | std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const { |
| 149 | const auto RetrieveWaitingThreads = [](std::size_t core_index, | 149 | const auto RetrieveWaitingThreads = [this](std::size_t core_index, |
| 150 | std::vector<SharedPtr<Thread>>& waiting_threads, | 150 | std::vector<SharedPtr<Thread>>& waiting_threads, |
| 151 | VAddr arb_addr) { | 151 | VAddr arb_addr) { |
| 152 | const auto& scheduler = Core::System::GetInstance().Scheduler(core_index); | 152 | const auto& scheduler = system.Scheduler(core_index); |
| 153 | const auto& thread_list = scheduler.GetThreadList(); | 153 | const auto& thread_list = scheduler.GetThreadList(); |
| 154 | 154 | ||
| 155 | for (const auto& thread : thread_list) { | 155 | for (const auto& thread : thread_list) { |
diff --git a/src/core/hle/kernel/address_arbiter.h b/src/core/hle/kernel/address_arbiter.h index 6f46190f6..e0c36f2e3 100644 --- a/src/core/hle/kernel/address_arbiter.h +++ b/src/core/hle/kernel/address_arbiter.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | 9 | ||
| 10 | union ResultCode; | 10 | union ResultCode; |
| 11 | 11 | ||
| 12 | namespace Core { | ||
| 13 | class System; | ||
| 14 | } | ||
| 15 | |||
| 12 | namespace Kernel { | 16 | namespace Kernel { |
| 13 | 17 | ||
| 14 | class Thread; | 18 | class Thread; |
| @@ -27,7 +31,7 @@ public: | |||
| 27 | ModifyByWaitingCountAndSignalIfEqual = 2, | 31 | ModifyByWaitingCountAndSignalIfEqual = 2, |
| 28 | }; | 32 | }; |
| 29 | 33 | ||
| 30 | AddressArbiter(); | 34 | explicit AddressArbiter(Core::System& system); |
| 31 | ~AddressArbiter(); | 35 | ~AddressArbiter(); |
| 32 | 36 | ||
| 33 | AddressArbiter(const AddressArbiter&) = delete; | 37 | AddressArbiter(const AddressArbiter&) = delete; |
| @@ -61,6 +65,8 @@ private: | |||
| 61 | 65 | ||
| 62 | // Gets the threads waiting on an address. | 66 | // Gets the threads waiting on an address. |
| 63 | std::vector<SharedPtr<Thread>> GetThreadsWaitingOnAddress(VAddr address) const; | 67 | std::vector<SharedPtr<Thread>> GetThreadsWaitingOnAddress(VAddr address) const; |
| 68 | |||
| 69 | Core::System& system; | ||
| 64 | }; | 70 | }; |
| 65 | 71 | ||
| 66 | } // namespace Kernel | 72 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index b771a33a6..04ea9349e 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -87,11 +87,13 @@ static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] int cycles_ | |||
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | struct KernelCore::Impl { | 89 | struct KernelCore::Impl { |
| 90 | void Initialize(KernelCore& kernel, Core::Timing::CoreTiming& core_timing) { | 90 | explicit Impl(Core::System& system) : address_arbiter{system}, system{system} {} |
| 91 | |||
| 92 | void Initialize(KernelCore& kernel) { | ||
| 91 | Shutdown(); | 93 | Shutdown(); |
| 92 | 94 | ||
| 93 | InitializeSystemResourceLimit(kernel); | 95 | InitializeSystemResourceLimit(kernel); |
| 94 | InitializeThreads(core_timing); | 96 | InitializeThreads(); |
| 95 | } | 97 | } |
| 96 | 98 | ||
| 97 | void Shutdown() { | 99 | void Shutdown() { |
| @@ -123,9 +125,9 @@ struct KernelCore::Impl { | |||
| 123 | ASSERT(system_resource_limit->SetLimitValue(ResourceType::Sessions, 900).IsSuccess()); | 125 | ASSERT(system_resource_limit->SetLimitValue(ResourceType::Sessions, 900).IsSuccess()); |
| 124 | } | 126 | } |
| 125 | 127 | ||
| 126 | void InitializeThreads(Core::Timing::CoreTiming& core_timing) { | 128 | void InitializeThreads() { |
| 127 | thread_wakeup_event_type = | 129 | thread_wakeup_event_type = |
| 128 | core_timing.RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback); | 130 | system.CoreTiming().RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback); |
| 129 | } | 131 | } |
| 130 | 132 | ||
| 131 | std::atomic<u32> next_object_id{0}; | 133 | std::atomic<u32> next_object_id{0}; |
| @@ -148,15 +150,18 @@ struct KernelCore::Impl { | |||
| 148 | /// Map of named ports managed by the kernel, which can be retrieved using | 150 | /// Map of named ports managed by the kernel, which can be retrieved using |
| 149 | /// the ConnectToPort SVC. | 151 | /// the ConnectToPort SVC. |
| 150 | NamedPortTable named_ports; | 152 | NamedPortTable named_ports; |
| 153 | |||
| 154 | // System context | ||
| 155 | Core::System& system; | ||
| 151 | }; | 156 | }; |
| 152 | 157 | ||
| 153 | KernelCore::KernelCore() : impl{std::make_unique<Impl>()} {} | 158 | KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system)} {} |
| 154 | KernelCore::~KernelCore() { | 159 | KernelCore::~KernelCore() { |
| 155 | Shutdown(); | 160 | Shutdown(); |
| 156 | } | 161 | } |
| 157 | 162 | ||
| 158 | void KernelCore::Initialize(Core::Timing::CoreTiming& core_timing) { | 163 | void KernelCore::Initialize() { |
| 159 | impl->Initialize(*this, core_timing); | 164 | impl->Initialize(*this); |
| 160 | } | 165 | } |
| 161 | 166 | ||
| 162 | void KernelCore::Shutdown() { | 167 | void KernelCore::Shutdown() { |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 32b8ede0e..4d292aca9 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -11,6 +11,10 @@ | |||
| 11 | template <typename T> | 11 | template <typename T> |
| 12 | class ResultVal; | 12 | class ResultVal; |
| 13 | 13 | ||
| 14 | namespace Core { | ||
| 15 | class System; | ||
| 16 | } | ||
| 17 | |||
| 14 | namespace Core::Timing { | 18 | namespace Core::Timing { |
| 15 | class CoreTiming; | 19 | class CoreTiming; |
| 16 | struct EventType; | 20 | struct EventType; |
| @@ -31,7 +35,14 @@ private: | |||
| 31 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; | 35 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; |
| 32 | 36 | ||
| 33 | public: | 37 | public: |
| 34 | KernelCore(); | 38 | /// Constructs an instance of the kernel using the given System |
| 39 | /// instance as a context for any necessary system-related state, | ||
| 40 | /// such as threads, CPU core state, etc. | ||
| 41 | /// | ||
| 42 | /// @post After execution of the constructor, the provided System | ||
| 43 | /// object *must* outlive the kernel instance itself. | ||
| 44 | /// | ||
| 45 | explicit KernelCore(Core::System& system); | ||
| 35 | ~KernelCore(); | 46 | ~KernelCore(); |
| 36 | 47 | ||
| 37 | KernelCore(const KernelCore&) = delete; | 48 | KernelCore(const KernelCore&) = delete; |
| @@ -41,11 +52,7 @@ public: | |||
| 41 | KernelCore& operator=(KernelCore&&) = delete; | 52 | KernelCore& operator=(KernelCore&&) = delete; |
| 42 | 53 | ||
| 43 | /// Resets the kernel to a clean slate for use. | 54 | /// Resets the kernel to a clean slate for use. |
| 44 | /// | 55 | void Initialize(); |
| 45 | /// @param core_timing CoreTiming instance used to create any necessary | ||
| 46 | /// kernel-specific callback events. | ||
| 47 | /// | ||
| 48 | void Initialize(Core::Timing::CoreTiming& core_timing); | ||
| 49 | 56 | ||
| 50 | /// Clears all resources in use by the kernel instance. | 57 | /// Clears all resources in use by the kernel instance. |
| 51 | void Shutdown(); | 58 | void Shutdown(); |