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.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 9251f29ad..d57239472 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -24,6 +24,7 @@
24#include "core/hardware_properties.h" 24#include "core/hardware_properties.h"
25#include "core/hle/kernel/init/init_slab_setup.h" 25#include "core/hle/kernel/init/init_slab_setup.h"
26#include "core/hle/kernel/k_client_port.h" 26#include "core/hle/kernel/k_client_port.h"
27#include "core/hle/kernel/k_dynamic_resource_manager.h"
27#include "core/hle/kernel/k_handle_table.h" 28#include "core/hle/kernel/k_handle_table.h"
28#include "core/hle/kernel/k_memory_layout.h" 29#include "core/hle/kernel/k_memory_layout.h"
29#include "core/hle/kernel/k_memory_manager.h" 30#include "core/hle/kernel/k_memory_manager.h"
@@ -76,6 +77,14 @@ struct KernelCore::Impl {
76 InitializePreemption(kernel); 77 InitializePreemption(kernel);
77 InitializePhysicalCores(); 78 InitializePhysicalCores();
78 79
80 // Initialize the Dynamic Slab Heaps.
81 {
82 const auto& pt_heap_region = memory_layout->GetPageTableHeapRegion();
83 ASSERT(pt_heap_region.GetEndAddress() != 0);
84
85 InitializeResourceManagers(pt_heap_region.GetAddress(), pt_heap_region.GetSize());
86 }
87
79 RegisterHostThread(); 88 RegisterHostThread();
80 } 89 }
81 90
@@ -257,6 +266,18 @@ struct KernelCore::Impl {
257 system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event); 266 system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event);
258 } 267 }
259 268
269 void InitializeResourceManagers(VAddr address, size_t size) {
270 dynamic_page_manager = std::make_unique<KDynamicPageManager>();
271 memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>();
272 app_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>();
273
274 dynamic_page_manager->Initialize(address, size);
275 static constexpr size_t ApplicationMemoryBlockSlabHeapSize = 20000;
276 memory_block_heap->Initialize(dynamic_page_manager.get(),
277 ApplicationMemoryBlockSlabHeapSize);
278 app_memory_block_manager->Initialize(nullptr, memory_block_heap.get());
279 }
280
260 void InitializeShutdownThreads() { 281 void InitializeShutdownThreads() {
261 for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { 282 for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) {
262 shutdown_threads[core_id] = KThread::Create(system.Kernel()); 283 shutdown_threads[core_id] = KThread::Create(system.Kernel());
@@ -770,6 +791,11 @@ struct KernelCore::Impl {
770 // Kernel memory management 791 // Kernel memory management
771 std::unique_ptr<KMemoryManager> memory_manager; 792 std::unique_ptr<KMemoryManager> memory_manager;
772 793
794 // Dynamic slab managers
795 std::unique_ptr<KDynamicPageManager> dynamic_page_manager;
796 std::unique_ptr<KMemoryBlockSlabHeap> memory_block_heap;
797 std::unique_ptr<KMemoryBlockSlabManager> app_memory_block_manager;
798
773 // Shared memory for services 799 // Shared memory for services
774 Kernel::KSharedMemory* hid_shared_mem{}; 800 Kernel::KSharedMemory* hid_shared_mem{};
775 Kernel::KSharedMemory* font_shared_mem{}; 801 Kernel::KSharedMemory* font_shared_mem{};
@@ -1041,6 +1067,14 @@ const KMemoryManager& KernelCore::MemoryManager() const {
1041 return *impl->memory_manager; 1067 return *impl->memory_manager;
1042} 1068}
1043 1069
1070KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() {
1071 return *impl->app_memory_block_manager;
1072}
1073
1074const KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() const {
1075 return *impl->app_memory_block_manager;
1076}
1077
1044Kernel::KSharedMemory& KernelCore::GetHidSharedMem() { 1078Kernel::KSharedMemory& KernelCore::GetHidSharedMem() {
1045 return *impl->hid_shared_mem; 1079 return *impl->hid_shared_mem;
1046} 1080}