mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	kernel: Initialize memory layout for new VMM.
This commit is contained in:
		
							parent
							
								
									11c02a50e9
								
							
						
					
					
						commit
						8f75524e55
					
				@ -18,15 +18,20 @@
 | 
				
			|||||||
#include "core/core.h"
 | 
					#include "core/core.h"
 | 
				
			||||||
#include "core/core_timing.h"
 | 
					#include "core/core_timing.h"
 | 
				
			||||||
#include "core/core_timing_util.h"
 | 
					#include "core/core_timing_util.h"
 | 
				
			||||||
 | 
					#include "core/device_memory.h"
 | 
				
			||||||
#include "core/hardware_properties.h"
 | 
					#include "core/hardware_properties.h"
 | 
				
			||||||
#include "core/hle/kernel/client_port.h"
 | 
					#include "core/hle/kernel/client_port.h"
 | 
				
			||||||
#include "core/hle/kernel/errors.h"
 | 
					#include "core/hle/kernel/errors.h"
 | 
				
			||||||
#include "core/hle/kernel/handle_table.h"
 | 
					#include "core/hle/kernel/handle_table.h"
 | 
				
			||||||
#include "core/hle/kernel/kernel.h"
 | 
					#include "core/hle/kernel/kernel.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/memory/memory_layout.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/memory/memory_manager.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/memory/slab_heap.h"
 | 
				
			||||||
#include "core/hle/kernel/physical_core.h"
 | 
					#include "core/hle/kernel/physical_core.h"
 | 
				
			||||||
#include "core/hle/kernel/process.h"
 | 
					#include "core/hle/kernel/process.h"
 | 
				
			||||||
#include "core/hle/kernel/resource_limit.h"
 | 
					#include "core/hle/kernel/resource_limit.h"
 | 
				
			||||||
#include "core/hle/kernel/scheduler.h"
 | 
					#include "core/hle/kernel/scheduler.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/shared_memory.h"
 | 
				
			||||||
#include "core/hle/kernel/synchronization.h"
 | 
					#include "core/hle/kernel/synchronization.h"
 | 
				
			||||||
#include "core/hle/kernel/thread.h"
 | 
					#include "core/hle/kernel/thread.h"
 | 
				
			||||||
#include "core/hle/kernel/time_manager.h"
 | 
					#include "core/hle/kernel/time_manager.h"
 | 
				
			||||||
@ -110,6 +115,7 @@ struct KernelCore::Impl {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        InitializePhysicalCores();
 | 
					        InitializePhysicalCores();
 | 
				
			||||||
        InitializeSystemResourceLimit(kernel);
 | 
					        InitializeSystemResourceLimit(kernel);
 | 
				
			||||||
 | 
					        InitializeMemoryLayout();
 | 
				
			||||||
        InitializeThreads();
 | 
					        InitializeThreads();
 | 
				
			||||||
        InitializePreemption();
 | 
					        InitializePreemption();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -237,6 +243,57 @@ struct KernelCore::Impl {
 | 
				
			|||||||
        return result;
 | 
					        return result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void InitializeMemoryLayout() {
 | 
				
			||||||
 | 
					        // Initialize memory layout
 | 
				
			||||||
 | 
					        constexpr Memory::MemoryLayout layout{Memory::MemoryLayout::GetDefaultLayout()};
 | 
				
			||||||
 | 
					        constexpr std::size_t hid_size{0x40000};
 | 
				
			||||||
 | 
					        constexpr std::size_t font_size{0x1100000};
 | 
				
			||||||
 | 
					        constexpr std::size_t irs_size{0x8000};
 | 
				
			||||||
 | 
					        constexpr std::size_t time_size{0x1000};
 | 
				
			||||||
 | 
					        constexpr PAddr hid_addr{layout.System().StartAddress()};
 | 
				
			||||||
 | 
					        constexpr PAddr font_pa{layout.System().StartAddress() + hid_size};
 | 
				
			||||||
 | 
					        constexpr PAddr irs_addr{layout.System().StartAddress() + hid_size + font_size};
 | 
				
			||||||
 | 
					        constexpr PAddr time_addr{layout.System().StartAddress() + hid_size + font_size + irs_size};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Initialize memory manager
 | 
				
			||||||
 | 
					        memory_manager = std::make_unique<Memory::MemoryManager>();
 | 
				
			||||||
 | 
					        memory_manager->InitializeManager(Memory::MemoryManager::Pool::Application,
 | 
				
			||||||
 | 
					                                          layout.Application().StartAddress(),
 | 
				
			||||||
 | 
					                                          layout.Application().EndAddress());
 | 
				
			||||||
 | 
					        memory_manager->InitializeManager(Memory::MemoryManager::Pool::Applet,
 | 
				
			||||||
 | 
					                                          layout.Applet().StartAddress(),
 | 
				
			||||||
 | 
					                                          layout.Applet().EndAddress());
 | 
				
			||||||
 | 
					        memory_manager->InitializeManager(Memory::MemoryManager::Pool::System,
 | 
				
			||||||
 | 
					                                          layout.System().StartAddress(),
 | 
				
			||||||
 | 
					                                          layout.System().EndAddress());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        hid_shared_mem = Kernel::SharedMemory::Create(
 | 
				
			||||||
 | 
					            system.Kernel(), system.DeviceMemory(), nullptr,
 | 
				
			||||||
 | 
					            {hid_addr, hid_size / Memory::PageSize}, Memory::MemoryPermission::None,
 | 
				
			||||||
 | 
					            Memory::MemoryPermission::Read, hid_addr, hid_size, "HID:SharedMemory");
 | 
				
			||||||
 | 
					        font_shared_mem = Kernel::SharedMemory::Create(
 | 
				
			||||||
 | 
					            system.Kernel(), system.DeviceMemory(), nullptr,
 | 
				
			||||||
 | 
					            {font_pa, font_size / Memory::PageSize}, Memory::MemoryPermission::None,
 | 
				
			||||||
 | 
					            Memory::MemoryPermission::Read, font_pa, font_size, "Font:SharedMemory");
 | 
				
			||||||
 | 
					        irs_shared_mem = Kernel::SharedMemory::Create(
 | 
				
			||||||
 | 
					            system.Kernel(), system.DeviceMemory(), nullptr,
 | 
				
			||||||
 | 
					            {irs_addr, irs_size / Memory::PageSize}, Memory::MemoryPermission::None,
 | 
				
			||||||
 | 
					            Memory::MemoryPermission::Read, irs_addr, irs_size, "IRS:SharedMemory");
 | 
				
			||||||
 | 
					        time_shared_mem = Kernel::SharedMemory::Create(
 | 
				
			||||||
 | 
					            system.Kernel(), system.DeviceMemory(), nullptr,
 | 
				
			||||||
 | 
					            {time_addr, time_size / Memory::PageSize}, Memory::MemoryPermission::None,
 | 
				
			||||||
 | 
					            Memory::MemoryPermission::Read, time_addr, time_size, "Time:SharedMemory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Allocate slab heaps
 | 
				
			||||||
 | 
					        user_slab_heap_pages = std::make_unique<Memory::SlabHeap<Memory::Page>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Initialize slab heaps
 | 
				
			||||||
 | 
					        constexpr u64 user_slab_heap_size{0x3de000};
 | 
				
			||||||
 | 
					        user_slab_heap_pages->Initialize(
 | 
				
			||||||
 | 
					            system.DeviceMemory().GetPointer(Core::DramMemoryMap::SlabHeapBase),
 | 
				
			||||||
 | 
					            user_slab_heap_size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::atomic<u32> next_object_id{0};
 | 
					    std::atomic<u32> next_object_id{0};
 | 
				
			||||||
    std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
 | 
					    std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
 | 
				
			||||||
    std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
 | 
					    std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
 | 
				
			||||||
@ -271,6 +328,16 @@ struct KernelCore::Impl {
 | 
				
			|||||||
    std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads;
 | 
					    std::bitset<Core::Hardware::NUM_CPU_CORES> registered_core_threads;
 | 
				
			||||||
    std::mutex register_thread_mutex;
 | 
					    std::mutex register_thread_mutex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Kernel memory management
 | 
				
			||||||
 | 
					    std::unique_ptr<Memory::MemoryManager> memory_manager;
 | 
				
			||||||
 | 
					    std::unique_ptr<Memory::SlabHeap<Memory::Page>> user_slab_heap_pages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Shared memory for services
 | 
				
			||||||
 | 
					    std::shared_ptr<Kernel::SharedMemory> hid_shared_mem;
 | 
				
			||||||
 | 
					    std::shared_ptr<Kernel::SharedMemory> font_shared_mem;
 | 
				
			||||||
 | 
					    std::shared_ptr<Kernel::SharedMemory> irs_shared_mem;
 | 
				
			||||||
 | 
					    std::shared_ptr<Kernel::SharedMemory> time_shared_mem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // System context
 | 
					    // System context
 | 
				
			||||||
    Core::System& system;
 | 
					    Core::System& system;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@ -437,4 +504,52 @@ Core::EmuThreadHandle KernelCore::GetCurrentEmuThreadID() const {
 | 
				
			|||||||
    return impl->GetCurrentEmuThreadID();
 | 
					    return impl->GetCurrentEmuThreadID();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Memory::MemoryManager& KernelCore::MemoryManager() {
 | 
				
			||||||
 | 
					    return *impl->memory_manager;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Memory::MemoryManager& KernelCore::MemoryManager() const {
 | 
				
			||||||
 | 
					    return *impl->memory_manager;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() {
 | 
				
			||||||
 | 
					    return *impl->user_slab_heap_pages;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Memory::SlabHeap<Memory::Page>& KernelCore::GetUserSlabHeapPages() const {
 | 
				
			||||||
 | 
					    return *impl->user_slab_heap_pages;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kernel::SharedMemory& KernelCore::GetHidSharedMem() {
 | 
				
			||||||
 | 
					    return *impl->hid_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Kernel::SharedMemory& KernelCore::GetHidSharedMem() const {
 | 
				
			||||||
 | 
					    return *impl->hid_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kernel::SharedMemory& KernelCore::GetFontSharedMem() {
 | 
				
			||||||
 | 
					    return *impl->font_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Kernel::SharedMemory& KernelCore::GetFontSharedMem() const {
 | 
				
			||||||
 | 
					    return *impl->font_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kernel::SharedMemory& KernelCore::GetIrsSharedMem() {
 | 
				
			||||||
 | 
					    return *impl->irs_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Kernel::SharedMemory& KernelCore::GetIrsSharedMem() const {
 | 
				
			||||||
 | 
					    return *impl->irs_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kernel::SharedMemory& KernelCore::GetTimeSharedMem() {
 | 
				
			||||||
 | 
					    return *impl->time_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Kernel::SharedMemory& KernelCore::GetTimeSharedMem() const {
 | 
				
			||||||
 | 
					    return *impl->time_shared_mem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace Kernel
 | 
					} // namespace Kernel
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@
 | 
				
			|||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <unordered_map>
 | 
					#include <unordered_map>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include "core/hle/kernel/memory/memory_types.h"
 | 
				
			||||||
#include "core/hle/kernel/object.h"
 | 
					#include "core/hle/kernel/object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Core {
 | 
					namespace Core {
 | 
				
			||||||
@ -23,6 +24,12 @@ struct EventType;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Kernel {
 | 
					namespace Kernel {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Memory {
 | 
				
			||||||
 | 
					class MemoryManager;
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					class SlabHeap;
 | 
				
			||||||
 | 
					} // namespace Memory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AddressArbiter;
 | 
					class AddressArbiter;
 | 
				
			||||||
class ClientPort;
 | 
					class ClientPort;
 | 
				
			||||||
class GlobalScheduler;
 | 
					class GlobalScheduler;
 | 
				
			||||||
@ -31,6 +38,7 @@ class PhysicalCore;
 | 
				
			|||||||
class Process;
 | 
					class Process;
 | 
				
			||||||
class ResourceLimit;
 | 
					class ResourceLimit;
 | 
				
			||||||
class Scheduler;
 | 
					class Scheduler;
 | 
				
			||||||
 | 
					class SharedMemory;
 | 
				
			||||||
class Synchronization;
 | 
					class Synchronization;
 | 
				
			||||||
class Thread;
 | 
					class Thread;
 | 
				
			||||||
class TimeManager;
 | 
					class TimeManager;
 | 
				
			||||||
@ -147,6 +155,42 @@ public:
 | 
				
			|||||||
    /// Register the current thread as a non CPU core thread.
 | 
					    /// Register the current thread as a non CPU core thread.
 | 
				
			||||||
    void RegisterHostThread();
 | 
					    void RegisterHostThread();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the virtual memory manager for the kernel.
 | 
				
			||||||
 | 
					    Memory::MemoryManager& MemoryManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the virtual memory manager for the kernel.
 | 
				
			||||||
 | 
					    const Memory::MemoryManager& MemoryManager() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the slab heap allocated for user space pages.
 | 
				
			||||||
 | 
					    Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the slab heap allocated for user space pages.
 | 
				
			||||||
 | 
					    const Memory::SlabHeap<Memory::Page>& GetUserSlabHeapPages() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for HID services.
 | 
				
			||||||
 | 
					    Kernel::SharedMemory& GetHidSharedMem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for HID services.
 | 
				
			||||||
 | 
					    const Kernel::SharedMemory& GetHidSharedMem() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for font services.
 | 
				
			||||||
 | 
					    Kernel::SharedMemory& GetFontSharedMem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for font services.
 | 
				
			||||||
 | 
					    const Kernel::SharedMemory& GetFontSharedMem() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for IRS services.
 | 
				
			||||||
 | 
					    Kernel::SharedMemory& GetIrsSharedMem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for IRS services.
 | 
				
			||||||
 | 
					    const Kernel::SharedMemory& GetIrsSharedMem() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for Time services.
 | 
				
			||||||
 | 
					    Kernel::SharedMemory& GetTimeSharedMem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Gets the shared memory object for Time services.
 | 
				
			||||||
 | 
					    const Kernel::SharedMemory& GetTimeSharedMem() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    friend class Object;
 | 
					    friend class Object;
 | 
				
			||||||
    friend class Process;
 | 
					    friend class Process;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user