summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 797f47021..eda67d933 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -70,13 +70,12 @@ struct KernelCore::Impl {
70 70
71 // Derive the initial memory layout from the emulated board 71 // Derive the initial memory layout from the emulated board
72 Init::InitializeSlabResourceCounts(kernel); 72 Init::InitializeSlabResourceCounts(kernel);
73 KMemoryLayout memory_layout; 73 DeriveInitialMemoryLayout();
74 DeriveInitialMemoryLayout(memory_layout);
75 Init::InitializeSlabHeaps(system, memory_layout); 74 Init::InitializeSlabHeaps(system, memory_layout);
76 75
77 // Initialize kernel memory and resources. 76 // Initialize kernel memory and resources.
78 InitializeSystemResourceLimit(kernel, system.CoreTiming(), memory_layout); 77 InitializeSystemResourceLimit(kernel, system.CoreTiming());
79 InitializeMemoryLayout(memory_layout); 78 InitializeMemoryLayout();
80 InitializePageSlab(); 79 InitializePageSlab();
81 InitializeSchedulers(); 80 InitializeSchedulers();
82 InitializeSuspendThreads(); 81 InitializeSuspendThreads();
@@ -219,8 +218,7 @@ struct KernelCore::Impl {
219 218
220 // Creates the default system resource limit 219 // Creates the default system resource limit
221 void InitializeSystemResourceLimit(KernelCore& kernel, 220 void InitializeSystemResourceLimit(KernelCore& kernel,
222 const Core::Timing::CoreTiming& core_timing, 221 const Core::Timing::CoreTiming& core_timing) {
223 const KMemoryLayout& memory_layout) {
224 system_resource_limit = KResourceLimit::Create(system.Kernel()); 222 system_resource_limit = KResourceLimit::Create(system.Kernel());
225 system_resource_limit->Initialize(&core_timing); 223 system_resource_limit->Initialize(&core_timing);
226 224
@@ -353,7 +351,7 @@ struct KernelCore::Impl {
353 return schedulers[thread_id]->GetCurrentThread(); 351 return schedulers[thread_id]->GetCurrentThread();
354 } 352 }
355 353
356 void DeriveInitialMemoryLayout(KMemoryLayout& memory_layout) { 354 void DeriveInitialMemoryLayout() {
357 // Insert the root region for the virtual memory tree, from which all other regions will 355 // Insert the root region for the virtual memory tree, from which all other regions will
358 // derive. 356 // derive.
359 memory_layout.GetVirtualMemoryRegionTree().InsertDirectly( 357 memory_layout.GetVirtualMemoryRegionTree().InsertDirectly(
@@ -616,20 +614,16 @@ struct KernelCore::Impl {
616 linear_region_start); 614 linear_region_start);
617 } 615 }
618 616
619 void InitializeMemoryLayout(const KMemoryLayout& memory_layout) { 617 void InitializeMemoryLayout() {
620 const auto system_pool = memory_layout.GetKernelSystemPoolRegionPhysicalExtents(); 618 const auto system_pool = memory_layout.GetKernelSystemPoolRegionPhysicalExtents();
621 const auto applet_pool = memory_layout.GetKernelAppletPoolRegionPhysicalExtents(); 619 const auto applet_pool = memory_layout.GetKernelAppletPoolRegionPhysicalExtents();
622 const auto application_pool = memory_layout.GetKernelApplicationPoolRegionPhysicalExtents(); 620 const auto application_pool = memory_layout.GetKernelApplicationPoolRegionPhysicalExtents();
623 621
624 // Initialize memory managers 622 // Initialize the memory manager.
625 memory_manager = std::make_unique<KMemoryManager>(system); 623 memory_manager = std::make_unique<KMemoryManager>(system);
626 memory_manager->InitializeManager(KMemoryManager::Pool::Application, 624 const auto& management_region = memory_layout.GetPoolManagementRegion();
627 application_pool.GetAddress(), 625 ASSERT(management_region.GetEndAddress() != 0);
628 application_pool.GetEndAddress()); 626 memory_manager->Initialize(management_region.GetAddress(), management_region.GetSize());
629 memory_manager->InitializeManager(KMemoryManager::Pool::Applet, applet_pool.GetAddress(),
630 applet_pool.GetEndAddress());
631 memory_manager->InitializeManager(KMemoryManager::Pool::System, system_pool.GetAddress(),
632 system_pool.GetEndAddress());
633 627
634 // Setup memory regions for emulated processes 628 // Setup memory regions for emulated processes
635 // TODO(bunnei): These should not be hardcoded regions initialized within the kernel 629 // TODO(bunnei): These should not be hardcoded regions initialized within the kernel
@@ -770,6 +764,9 @@ struct KernelCore::Impl {
770 Kernel::KSharedMemory* irs_shared_mem{}; 764 Kernel::KSharedMemory* irs_shared_mem{};
771 Kernel::KSharedMemory* time_shared_mem{}; 765 Kernel::KSharedMemory* time_shared_mem{};
772 766
767 // Memory layout
768 KMemoryLayout memory_layout;
769
773 // Threads used for services 770 // Threads used for services
774 std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; 771 std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads;
775 Common::ThreadWorker service_threads_manager; 772 Common::ThreadWorker service_threads_manager;
@@ -1135,6 +1132,10 @@ const KWorkerTaskManager& KernelCore::WorkerTaskManager() const {
1135 return impl->worker_task_manager; 1132 return impl->worker_task_manager;
1136} 1133}
1137 1134
1135const KMemoryLayout& KernelCore::MemoryLayout() const {
1136 return impl->memory_layout;
1137}
1138
1138bool KernelCore::IsPhantomModeForSingleCore() const { 1139bool KernelCore::IsPhantomModeForSingleCore() const {
1139 return impl->IsPhantomModeForSingleCore(); 1140 return impl->IsPhantomModeForSingleCore();
1140} 1141}