Browse Source

hle: kernel: KMemoryManager: Add CalculateManagementOverheadSize.

bunnei 5 years ago
parent
commit
a439867f2c
2 changed files with 26 additions and 0 deletions
  1. 12 0
      src/core/hle/kernel/k_memory_manager.cpp
  2. 14 0
      src/core/hle/kernel/k_memory_manager.h

+ 12 - 0
src/core/hle/kernel/k_memory_manager.cpp

@@ -173,4 +173,16 @@ ResultCode KMemoryManager::Free(KPageLinkedList& page_list, std::size_t num_page
     return RESULT_SUCCESS;
 }
 
+std::size_t KMemoryManager::Impl::CalculateManagementOverheadSize(std::size_t region_size) {
+    const std::size_t ref_count_size = (region_size / PageSize) * sizeof(u16);
+    const std::size_t optimize_map_size =
+        (Common::AlignUp((region_size / PageSize), Common::BitSize<u64>()) /
+         Common::BitSize<u64>()) *
+        sizeof(u64);
+    const std::size_t manager_meta_size =
+        Common::AlignUp(optimize_map_size + ref_count_size, PageSize);
+    const std::size_t page_heap_size = KPageHeap::CalculateManagementOverheadSize(region_size);
+    return manager_meta_size + page_heap_size;
+}
+
 } // namespace Kernel

+ 14 - 0
src/core/hle/kernel/k_memory_manager.h

@@ -60,6 +60,10 @@ public:
     static constexpr std::size_t MaxManagerCount = 10;
 
 public:
+    static std::size_t CalculateManagementOverheadSize(std::size_t region_size) {
+        return Impl::CalculateManagementOverheadSize(region_size);
+    }
+
     static constexpr u32 EncodeOption(Pool pool, Direction dir) {
         return (static_cast<u32>(pool) << static_cast<u32>(Pool::Shift)) |
                (static_cast<u32>(dir) << static_cast<u32>(Direction::Shift));
@@ -89,6 +93,16 @@ private:
         KPageHeap heap;
         Pool pool{};
 
+    public:
+        static std::size_t CalculateManagementOverheadSize(std::size_t region_size);
+
+        static constexpr std::size_t CalculateOptimizedProcessOverheadSize(
+            std::size_t region_size) {
+            return (Common::AlignUp((region_size / PageSize), Common::BitSize<u64>()) /
+                    Common::BitSize<u64>()) *
+                   sizeof(u64);
+        }
+
     public:
         Impl() = default;