mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-30 18:24:15 +01:00 
			
		
		
		
	kernel: reshuffle ini1 size, add slab clear note
This commit is contained in:
		
							parent
							
								
									85a89ca3e3
								
							
						
					
					
						commit
						22afa2c7a3
					
				| @ -106,7 +106,7 @@ static_assert(KernelPageBufferAdditionalSize == | ||||
| /// memory.
 | ||||
| static KPhysicalAddress TranslateSlabAddrToPhysical(KMemoryLayout& memory_layout, | ||||
|                                                     KVirtualAddress slab_addr) { | ||||
|     slab_addr -= GetInteger(memory_layout.GetSlabRegionAddress()); | ||||
|     slab_addr -= memory_layout.GetSlabRegion().GetAddress(); | ||||
|     return GetInteger(slab_addr) + Core::DramMemoryMap::SlabHeapBase; | ||||
| } | ||||
| 
 | ||||
| @ -196,7 +196,12 @@ void InitializeSlabHeaps(Core::System& system, KMemoryLayout& memory_layout) { | ||||
|     auto& kernel = system.Kernel(); | ||||
| 
 | ||||
|     // 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.
 | ||||
|     std::array<KSlabType, KSlabType_Count> slab_types; | ||||
|  | ||||
| @ -19,4 +19,8 @@ static inline KPhysicalAddress GetInitialProcessBinaryPhysicalAddress() { | ||||
|         MainMemoryAddress); | ||||
| } | ||||
| 
 | ||||
| static inline size_t GetInitialProcessBinarySize() { | ||||
|     return InitialProcessBinarySizeMax; | ||||
| } | ||||
| 
 | ||||
| } // namespace Kernel
 | ||||
|  | ||||
| @ -137,11 +137,9 @@ public: | ||||
|         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 { | ||||
|         return Dereference(GetPhysicalMemoryRegionTree().FindFirstDerived(type)); | ||||
|     } | ||||
|  | ||||
| @ -119,7 +119,8 @@ void KMemoryManager::Initialize(KVirtualAddress management_region, size_t manage | ||||
|     // Free each region to its corresponding heap.
 | ||||
|     size_t reserved_sizes[MaxManagerCount] = {}; | ||||
|     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; | ||||
|     for (const auto& it : m_system.Kernel().MemoryLayout().GetPhysicalMemoryRegionTree()) { | ||||
|         if (it.IsDerivedFrom(KMemoryRegionType_DramUserPool)) { | ||||
| @ -137,13 +138,13 @@ void KMemoryManager::Initialize(KVirtualAddress management_region, size_t manage | ||||
|                 } | ||||
| 
 | ||||
|                 // 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.
 | ||||
|                 if (ini_last != cur_last) { | ||||
|                     ASSERT(cur_end != 0); | ||||
|                     manager.Free(ini_end, cur_end - ini_end); | ||||
|                     manager.Free(ini_end, (cur_end - ini_end) / PageSize); | ||||
|                 } | ||||
|             } else { | ||||
|                 // Ensure there's no partial overlap with the ini image.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user