summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/k_process.cpp6
-rw-r--r--src/core/hle/kernel/kernel.cpp34
-rw-r--r--src/core/hle/kernel/kernel.h7
3 files changed, 44 insertions, 3 deletions
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp
index 1d3157a9f..abc2115bd 100644
--- a/src/core/hle/kernel/k_process.cpp
+++ b/src/core/hle/kernel/k_process.cpp
@@ -356,9 +356,9 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std:
356 return ResultLimitReached; 356 return ResultLimitReached;
357 } 357 }
358 // Initialize proces address space 358 // Initialize proces address space
359 if (const Result result{page_table->InitializeForProcess(metadata.GetAddressSpaceType(), false, 359 if (const Result result{page_table->InitializeForProcess(
360 0x8000000, code_size, 360 metadata.GetAddressSpaceType(), false, 0x8000000, code_size,
361 KMemoryManager::Pool::Application)}; 361 &kernel.GetApplicationMemoryBlockManager(), KMemoryManager::Pool::Application)};
362 result.IsError()) { 362 result.IsError()) {
363 return result; 363 return result;
364 } 364 }
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}
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 0847cbcbf..79e66483e 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -37,6 +37,7 @@ class KClientSession;
37class KEvent; 37class KEvent;
38class KHandleTable; 38class KHandleTable;
39class KLinkedListNode; 39class KLinkedListNode;
40class KMemoryBlockSlabManager;
40class KMemoryLayout; 41class KMemoryLayout;
41class KMemoryManager; 42class KMemoryManager;
42class KPageBuffer; 43class KPageBuffer;
@@ -238,6 +239,12 @@ public:
238 /// Gets the virtual memory manager for the kernel. 239 /// Gets the virtual memory manager for the kernel.
239 const KMemoryManager& MemoryManager() const; 240 const KMemoryManager& MemoryManager() const;
240 241
242 /// Gets the application memory block manager for the kernel.
243 KMemoryBlockSlabManager& GetApplicationMemoryBlockManager();
244
245 /// Gets the application memory block manager for the kernel.
246 const KMemoryBlockSlabManager& GetApplicationMemoryBlockManager() const;
247
241 /// Gets the shared memory object for HID services. 248 /// Gets the shared memory object for HID services.
242 Kernel::KSharedMemory& GetHidSharedMem(); 249 Kernel::KSharedMemory& GetHidSharedMem();
243 250