Răsfoiți Sursa

kernel: reshuffle ini1 size, add slab clear note

Liam 2 ani în urmă
părinte
comite
22afa2c7a3

+ 7 - 2
src/core/hle/kernel/init/init_slab_setup.cpp

@@ -106,7 +106,7 @@ static_assert(KernelPageBufferAdditionalSize ==
 /// memory.
 /// memory.
 static KPhysicalAddress TranslateSlabAddrToPhysical(KMemoryLayout& memory_layout,
 static KPhysicalAddress TranslateSlabAddrToPhysical(KMemoryLayout& memory_layout,
                                                     KVirtualAddress slab_addr) {
                                                     KVirtualAddress slab_addr) {
-    slab_addr -= GetInteger(memory_layout.GetSlabRegionAddress());
+    slab_addr -= memory_layout.GetSlabRegion().GetAddress();
     return GetInteger(slab_addr) + Core::DramMemoryMap::SlabHeapBase;
     return GetInteger(slab_addr) + Core::DramMemoryMap::SlabHeapBase;
 }
 }
 
 
@@ -196,7 +196,12 @@ void InitializeSlabHeaps(Core::System& system, KMemoryLayout& memory_layout) {
     auto& kernel = system.Kernel();
     auto& kernel = system.Kernel();
 
 
     // Get the start of the slab region, since that's where we'll be working.
     // Get the start of the slab region, since that's where we'll be working.
-    KVirtualAddress address = memory_layout.GetSlabRegionAddress();
+    const KMemoryRegion& slab_region = memory_layout.GetSlabRegion();
+    KVirtualAddress address = slab_region.GetAddress();
+
+    // Clear the slab region.
+    // TODO: implement access to kernel VAs.
+    // std::memset(device_ptr, 0, slab_region.GetSize());
 
 
     // Initialize slab type array to be in sorted order.
     // Initialize slab type array to be in sorted order.
     std::array<KSlabType, KSlabType_Count> slab_types;
     std::array<KSlabType, KSlabType_Count> slab_types;

+ 4 - 0
src/core/hle/kernel/initial_process.h

@@ -19,4 +19,8 @@ static inline KPhysicalAddress GetInitialProcessBinaryPhysicalAddress() {
         MainMemoryAddress);
         MainMemoryAddress);
 }
 }
 
 
+static inline size_t GetInitialProcessBinarySize() {
+    return InitialProcessBinarySizeMax;
+}
+
 } // namespace Kernel
 } // namespace Kernel

+ 2 - 4
src/core/hle/kernel/k_memory_layout.h

@@ -137,11 +137,9 @@ public:
         return GetStackTopAddress(core_id, KMemoryRegionType_KernelMiscExceptionStack);
         return GetStackTopAddress(core_id, KMemoryRegionType_KernelMiscExceptionStack);
     }
     }
 
 
-    KVirtualAddress GetSlabRegionAddress() const {
-        return Dereference(GetVirtualMemoryRegionTree().FindByType(KMemoryRegionType_KernelSlab))
-            .GetAddress();
+    const KMemoryRegion& GetSlabRegion() const {
+        return Dereference(GetVirtualMemoryRegionTree().FindByType(KMemoryRegionType_KernelSlab));
     }
     }
-
     const KMemoryRegion& GetDeviceRegion(KMemoryRegionType type) const {
     const KMemoryRegion& GetDeviceRegion(KMemoryRegionType type) const {
         return Dereference(GetPhysicalMemoryRegionTree().FindFirstDerived(type));
         return Dereference(GetPhysicalMemoryRegionTree().FindFirstDerived(type));
     }
     }

+ 5 - 4
src/core/hle/kernel/k_memory_manager.cpp

@@ -119,7 +119,8 @@ void KMemoryManager::Initialize(KVirtualAddress management_region, size_t manage
     // Free each region to its corresponding heap.
     // Free each region to its corresponding heap.
     size_t reserved_sizes[MaxManagerCount] = {};
     size_t reserved_sizes[MaxManagerCount] = {};
     const KPhysicalAddress ini_start = GetInitialProcessBinaryPhysicalAddress();
     const KPhysicalAddress ini_start = GetInitialProcessBinaryPhysicalAddress();
-    const KPhysicalAddress ini_end = ini_start + InitialProcessBinarySizeMax;
+    const size_t ini_size = GetInitialProcessBinarySize();
+    const KPhysicalAddress ini_end = ini_start + ini_size;
     const KPhysicalAddress ini_last = ini_end - 1;
     const KPhysicalAddress ini_last = ini_end - 1;
     for (const auto& it : m_system.Kernel().MemoryLayout().GetPhysicalMemoryRegionTree()) {
     for (const auto& it : m_system.Kernel().MemoryLayout().GetPhysicalMemoryRegionTree()) {
         if (it.IsDerivedFrom(KMemoryRegionType_DramUserPool)) {
         if (it.IsDerivedFrom(KMemoryRegionType_DramUserPool)) {
@@ -137,13 +138,13 @@ void KMemoryManager::Initialize(KVirtualAddress management_region, size_t manage
                 }
                 }
 
 
                 // Open/reserve the ini memory.
                 // Open/reserve the ini memory.
-                manager.OpenFirst(ini_start, InitialProcessBinarySizeMax / PageSize);
-                reserved_sizes[it.GetAttributes()] += InitialProcessBinarySizeMax;
+                manager.OpenFirst(ini_start, ini_size / PageSize);
+                reserved_sizes[it.GetAttributes()] += ini_size;
 
 
                 // Free memory after the ini to the heap.
                 // Free memory after the ini to the heap.
                 if (ini_last != cur_last) {
                 if (ini_last != cur_last) {
                     ASSERT(cur_end != 0);
                     ASSERT(cur_end != 0);
-                    manager.Free(ini_end, cur_end - ini_end);
+                    manager.Free(ini_end, (cur_end - ini_end) / PageSize);
                 }
                 }
             } else {
             } else {
                 // Ensure there's no partial overlap with the ini image.
                 // Ensure there's no partial overlap with the ini image.