core: hle: kernel: Integration application memory block slab manager.
This commit is contained in:
		| @@ -356,9 +356,9 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | ||||
|         return ResultLimitReached; | ||||
|     } | ||||
|     // Initialize proces address space | ||||
|     if (const Result result{page_table->InitializeForProcess(metadata.GetAddressSpaceType(), false, | ||||
|                                                              0x8000000, code_size, | ||||
|                                                              KMemoryManager::Pool::Application)}; | ||||
|     if (const Result result{page_table->InitializeForProcess( | ||||
|             metadata.GetAddressSpaceType(), false, 0x8000000, code_size, | ||||
|             &kernel.GetApplicationMemoryBlockManager(), KMemoryManager::Pool::Application)}; | ||||
|         result.IsError()) { | ||||
|         return result; | ||||
|     } | ||||
|   | ||||
| @@ -24,6 +24,7 @@ | ||||
| #include "core/hardware_properties.h" | ||||
| #include "core/hle/kernel/init/init_slab_setup.h" | ||||
| #include "core/hle/kernel/k_client_port.h" | ||||
| #include "core/hle/kernel/k_dynamic_resource_manager.h" | ||||
| #include "core/hle/kernel/k_handle_table.h" | ||||
| #include "core/hle/kernel/k_memory_layout.h" | ||||
| #include "core/hle/kernel/k_memory_manager.h" | ||||
| @@ -76,6 +77,14 @@ struct KernelCore::Impl { | ||||
|         InitializePreemption(kernel); | ||||
|         InitializePhysicalCores(); | ||||
|  | ||||
|         // Initialize the Dynamic Slab Heaps. | ||||
|         { | ||||
|             const auto& pt_heap_region = memory_layout->GetPageTableHeapRegion(); | ||||
|             ASSERT(pt_heap_region.GetEndAddress() != 0); | ||||
|  | ||||
|             InitializeResourceManagers(pt_heap_region.GetAddress(), pt_heap_region.GetSize()); | ||||
|         } | ||||
|  | ||||
|         RegisterHostThread(); | ||||
|     } | ||||
|  | ||||
| @@ -257,6 +266,18 @@ struct KernelCore::Impl { | ||||
|         system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event); | ||||
|     } | ||||
|  | ||||
|     void InitializeResourceManagers(VAddr address, size_t size) { | ||||
|         dynamic_page_manager = std::make_unique<KDynamicPageManager>(); | ||||
|         memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>(); | ||||
|         app_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>(); | ||||
|  | ||||
|         dynamic_page_manager->Initialize(address, size); | ||||
|         static constexpr size_t ApplicationMemoryBlockSlabHeapSize = 20000; | ||||
|         memory_block_heap->Initialize(dynamic_page_manager.get(), | ||||
|                                       ApplicationMemoryBlockSlabHeapSize); | ||||
|         app_memory_block_manager->Initialize(nullptr, memory_block_heap.get()); | ||||
|     } | ||||
|  | ||||
|     void InitializeShutdownThreads() { | ||||
|         for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { | ||||
|             shutdown_threads[core_id] = KThread::Create(system.Kernel()); | ||||
| @@ -770,6 +791,11 @@ struct KernelCore::Impl { | ||||
|     // Kernel memory management | ||||
|     std::unique_ptr<KMemoryManager> memory_manager; | ||||
|  | ||||
|     // Dynamic slab managers | ||||
|     std::unique_ptr<KDynamicPageManager> dynamic_page_manager; | ||||
|     std::unique_ptr<KMemoryBlockSlabHeap> memory_block_heap; | ||||
|     std::unique_ptr<KMemoryBlockSlabManager> app_memory_block_manager; | ||||
|  | ||||
|     // Shared memory for services | ||||
|     Kernel::KSharedMemory* hid_shared_mem{}; | ||||
|     Kernel::KSharedMemory* font_shared_mem{}; | ||||
| @@ -1041,6 +1067,14 @@ const KMemoryManager& KernelCore::MemoryManager() const { | ||||
|     return *impl->memory_manager; | ||||
| } | ||||
|  | ||||
| KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() { | ||||
|     return *impl->app_memory_block_manager; | ||||
| } | ||||
|  | ||||
| const KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() const { | ||||
|     return *impl->app_memory_block_manager; | ||||
| } | ||||
|  | ||||
| Kernel::KSharedMemory& KernelCore::GetHidSharedMem() { | ||||
|     return *impl->hid_shared_mem; | ||||
| } | ||||
|   | ||||
| @@ -37,6 +37,7 @@ class KClientSession; | ||||
| class KEvent; | ||||
| class KHandleTable; | ||||
| class KLinkedListNode; | ||||
| class KMemoryBlockSlabManager; | ||||
| class KMemoryLayout; | ||||
| class KMemoryManager; | ||||
| class KPageBuffer; | ||||
| @@ -238,6 +239,12 @@ public: | ||||
|     /// Gets the virtual memory manager for the kernel. | ||||
|     const KMemoryManager& MemoryManager() const; | ||||
|  | ||||
|     /// Gets the application memory block manager for the kernel. | ||||
|     KMemoryBlockSlabManager& GetApplicationMemoryBlockManager(); | ||||
|  | ||||
|     /// Gets the application memory block manager for the kernel. | ||||
|     const KMemoryBlockSlabManager& GetApplicationMemoryBlockManager() const; | ||||
|  | ||||
|     /// Gets the shared memory object for HID services. | ||||
|     Kernel::KSharedMemory& GetHidSharedMem(); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user