diff options
| author | bunnei <bunneidev@gmail.com> | 2022-09-16 23:33:47 -0700 | 
|---|---|---|
| committer | bunnei <bunneidev@gmail.com> | 2022-10-18 19:13:34 -0700 | 
| commit | 1baedfa12cc84efd878567e91672f7e0f6de7b5a (patch) | |
| tree | 6a5694e0d8b822f8a5771ebbae657e8dfd8479c2 | |
| parent | ed591934fbffa32af0151302fd07e9fce776eb17 (diff) | |
core: hle: kernel: Integration application memory block slab manager.
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 34 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 7 | 
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:          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;      } 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 @@  #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;  } 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;  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();  | 
