summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-05 12:28:10 -0500
committerGravatar Lioncash2019-03-05 15:47:03 -0500
commitc161389a0f0b0fe3b9d6400c45fd87152f2cb14c (patch)
treeb050bdbd77611a1205028b6307f4aca72e1c7417 /src
parentkernel/address_arbiter: Minor tidying up (diff)
downloadyuzu-c161389a0f0b0fe3b9d6400c45fd87152f2cb14c.tar.gz
yuzu-c161389a0f0b0fe3b9d6400c45fd87152f2cb14c.tar.xz
yuzu-c161389a0f0b0fe3b9d6400c45fd87152f2cb14c.zip
kernel/address_arbiter: Pass in system instance to constructor
Allows getting rid of reliance on the global accessor functions and instead operating on the provided system instance.
Diffstat (limited to 'src')
-rw-r--r--src/core/core.cpp5
-rw-r--r--src/core/hle/kernel/address_arbiter.cpp14
-rw-r--r--src/core/hle/kernel/address_arbiter.h8
-rw-r--r--src/core/hle/kernel/kernel.cpp19
-rw-r--r--src/core/hle/kernel/kernel.h19
-rw-r--r--src/tests/core/arm/arm_test_common.cpp6
6 files changed, 45 insertions, 26 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}
80struct System::Impl { 80struct 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
268System::System() : impl{std::make_unique<Impl>()} {} 269System::System() : impl{std::make_unique<Impl>(*this)} {}
269System::~System() = default; 270System::~System() = default;
270 271
271Cpu& System::CurrentCpuCore() { 272Cpu& 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
42AddressArbiter::AddressArbiter() = default; 42AddressArbiter::AddressArbiter(Core::System& system) : system{system} {}
43AddressArbiter::~AddressArbiter() = default; 43AddressArbiter::~AddressArbiter() = default;
44 44
45ResultCode AddressArbiter::SignalToAddress(VAddr address, s32 num_to_wake) { 45ResultCode 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
136ResultCode AddressArbiter::WaitForAddress(VAddr address, s64 timeout) { 136ResultCode 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
148std::vector<SharedPtr<Thread>> AddressArbiter::GetThreadsWaitingOnAddress(VAddr address) const { 148std::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
10union ResultCode; 10union ResultCode;
11 11
12namespace Core {
13class System;
14}
15
12namespace Kernel { 16namespace Kernel {
13 17
14class Thread; 18class 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
89struct KernelCore::Impl { 89struct 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
153KernelCore::KernelCore() : impl{std::make_unique<Impl>()} {} 158KernelCore::KernelCore(Core::System& system) : impl{std::make_unique<Impl>(system)} {}
154KernelCore::~KernelCore() { 159KernelCore::~KernelCore() {
155 Shutdown(); 160 Shutdown();
156} 161}
157 162
158void KernelCore::Initialize(Core::Timing::CoreTiming& core_timing) { 163void KernelCore::Initialize() {
159 impl->Initialize(*this, core_timing); 164 impl->Initialize(*this);
160} 165}
161 166
162void KernelCore::Shutdown() { 167void 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 @@
11template <typename T> 11template <typename T>
12class ResultVal; 12class ResultVal;
13 13
14namespace Core {
15class System;
16}
17
14namespace Core::Timing { 18namespace Core::Timing {
15class CoreTiming; 19class CoreTiming;
16struct EventType; 20struct 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
33public: 37public:
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();
diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp
index 9b8a44fa1..ea27ef90d 100644
--- a/src/tests/core/arm/arm_test_common.cpp
+++ b/src/tests/core/arm/arm_test_common.cpp
@@ -13,11 +13,11 @@
13namespace ArmTests { 13namespace ArmTests {
14 14
15TestEnvironment::TestEnvironment(bool mutable_memory_) 15TestEnvironment::TestEnvironment(bool mutable_memory_)
16 : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) { 16 : mutable_memory(mutable_memory_),
17 17 test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} {
18 auto process = Kernel::Process::Create(kernel, ""); 18 auto process = Kernel::Process::Create(kernel, "");
19 kernel.MakeCurrentProcess(process.get()); 19 kernel.MakeCurrentProcess(process.get());
20 page_table = &Core::CurrentProcess()->VMManager().page_table; 20 page_table = &process->VMManager().page_table;
21 21
22 std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr); 22 std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr);
23 page_table->special_regions.clear(); 23 page_table->special_regions.clear();