diff options
| author | 2022-02-26 10:46:31 -0800 | |
|---|---|---|
| committer | 2022-02-27 18:00:09 -0800 | |
| commit | f87f076162e6d95cc444e35e086f168e5e6da712 (patch) | |
| tree | cdf64a251b790ba5b9950e88c4123624b7f4611b /src/core/hle/kernel/kernel.cpp | |
| parent | hle: kernel: k_page_heap: GetPhysicalAddr can be const. (diff) | |
| download | yuzu-f87f076162e6d95cc444e35e086f168e5e6da712.tar.gz yuzu-f87f076162e6d95cc444e35e086f168e5e6da712.tar.xz yuzu-f87f076162e6d95cc444e35e086f168e5e6da712.zip | |
hle: kernel: k_memory_manager: Rework for latest kernel behavior.
- Updates the KMemoryManager implementation against latest documentation.
- Reworks KMemoryLayout to be accessed throughout the kernel.
- Fixes an issue with pool sizes being incorrectly reported.
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 797f47021..eda67d933 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -70,13 +70,12 @@ struct KernelCore::Impl { | |||
| 70 | 70 | ||
| 71 | // Derive the initial memory layout from the emulated board | 71 | // Derive the initial memory layout from the emulated board |
| 72 | Init::InitializeSlabResourceCounts(kernel); | 72 | Init::InitializeSlabResourceCounts(kernel); |
| 73 | KMemoryLayout memory_layout; | 73 | DeriveInitialMemoryLayout(); |
| 74 | DeriveInitialMemoryLayout(memory_layout); | ||
| 75 | Init::InitializeSlabHeaps(system, memory_layout); | 74 | Init::InitializeSlabHeaps(system, memory_layout); |
| 76 | 75 | ||
| 77 | // Initialize kernel memory and resources. | 76 | // Initialize kernel memory and resources. |
| 78 | InitializeSystemResourceLimit(kernel, system.CoreTiming(), memory_layout); | 77 | InitializeSystemResourceLimit(kernel, system.CoreTiming()); |
| 79 | InitializeMemoryLayout(memory_layout); | 78 | InitializeMemoryLayout(); |
| 80 | InitializePageSlab(); | 79 | InitializePageSlab(); |
| 81 | InitializeSchedulers(); | 80 | InitializeSchedulers(); |
| 82 | InitializeSuspendThreads(); | 81 | InitializeSuspendThreads(); |
| @@ -219,8 +218,7 @@ struct KernelCore::Impl { | |||
| 219 | 218 | ||
| 220 | // Creates the default system resource limit | 219 | // Creates the default system resource limit |
| 221 | void InitializeSystemResourceLimit(KernelCore& kernel, | 220 | void InitializeSystemResourceLimit(KernelCore& kernel, |
| 222 | const Core::Timing::CoreTiming& core_timing, | 221 | const Core::Timing::CoreTiming& core_timing) { |
| 223 | const KMemoryLayout& memory_layout) { | ||
| 224 | system_resource_limit = KResourceLimit::Create(system.Kernel()); | 222 | system_resource_limit = KResourceLimit::Create(system.Kernel()); |
| 225 | system_resource_limit->Initialize(&core_timing); | 223 | system_resource_limit->Initialize(&core_timing); |
| 226 | 224 | ||
| @@ -353,7 +351,7 @@ struct KernelCore::Impl { | |||
| 353 | return schedulers[thread_id]->GetCurrentThread(); | 351 | return schedulers[thread_id]->GetCurrentThread(); |
| 354 | } | 352 | } |
| 355 | 353 | ||
| 356 | void DeriveInitialMemoryLayout(KMemoryLayout& memory_layout) { | 354 | void DeriveInitialMemoryLayout() { |
| 357 | // Insert the root region for the virtual memory tree, from which all other regions will | 355 | // Insert the root region for the virtual memory tree, from which all other regions will |
| 358 | // derive. | 356 | // derive. |
| 359 | memory_layout.GetVirtualMemoryRegionTree().InsertDirectly( | 357 | memory_layout.GetVirtualMemoryRegionTree().InsertDirectly( |
| @@ -616,20 +614,16 @@ struct KernelCore::Impl { | |||
| 616 | linear_region_start); | 614 | linear_region_start); |
| 617 | } | 615 | } |
| 618 | 616 | ||
| 619 | void InitializeMemoryLayout(const KMemoryLayout& memory_layout) { | 617 | void InitializeMemoryLayout() { |
| 620 | const auto system_pool = memory_layout.GetKernelSystemPoolRegionPhysicalExtents(); | 618 | const auto system_pool = memory_layout.GetKernelSystemPoolRegionPhysicalExtents(); |
| 621 | const auto applet_pool = memory_layout.GetKernelAppletPoolRegionPhysicalExtents(); | 619 | const auto applet_pool = memory_layout.GetKernelAppletPoolRegionPhysicalExtents(); |
| 622 | const auto application_pool = memory_layout.GetKernelApplicationPoolRegionPhysicalExtents(); | 620 | const auto application_pool = memory_layout.GetKernelApplicationPoolRegionPhysicalExtents(); |
| 623 | 621 | ||
| 624 | // Initialize memory managers | 622 | // Initialize the memory manager. |
| 625 | memory_manager = std::make_unique<KMemoryManager>(system); | 623 | memory_manager = std::make_unique<KMemoryManager>(system); |
| 626 | memory_manager->InitializeManager(KMemoryManager::Pool::Application, | 624 | const auto& management_region = memory_layout.GetPoolManagementRegion(); |
| 627 | application_pool.GetAddress(), | 625 | ASSERT(management_region.GetEndAddress() != 0); |
| 628 | application_pool.GetEndAddress()); | 626 | memory_manager->Initialize(management_region.GetAddress(), management_region.GetSize()); |
| 629 | memory_manager->InitializeManager(KMemoryManager::Pool::Applet, applet_pool.GetAddress(), | ||
| 630 | applet_pool.GetEndAddress()); | ||
| 631 | memory_manager->InitializeManager(KMemoryManager::Pool::System, system_pool.GetAddress(), | ||
| 632 | system_pool.GetEndAddress()); | ||
| 633 | 627 | ||
| 634 | // Setup memory regions for emulated processes | 628 | // Setup memory regions for emulated processes |
| 635 | // TODO(bunnei): These should not be hardcoded regions initialized within the kernel | 629 | // TODO(bunnei): These should not be hardcoded regions initialized within the kernel |
| @@ -770,6 +764,9 @@ struct KernelCore::Impl { | |||
| 770 | Kernel::KSharedMemory* irs_shared_mem{}; | 764 | Kernel::KSharedMemory* irs_shared_mem{}; |
| 771 | Kernel::KSharedMemory* time_shared_mem{}; | 765 | Kernel::KSharedMemory* time_shared_mem{}; |
| 772 | 766 | ||
| 767 | // Memory layout | ||
| 768 | KMemoryLayout memory_layout; | ||
| 769 | |||
| 773 | // Threads used for services | 770 | // Threads used for services |
| 774 | std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; | 771 | std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; |
| 775 | Common::ThreadWorker service_threads_manager; | 772 | Common::ThreadWorker service_threads_manager; |
| @@ -1135,6 +1132,10 @@ const KWorkerTaskManager& KernelCore::WorkerTaskManager() const { | |||
| 1135 | return impl->worker_task_manager; | 1132 | return impl->worker_task_manager; |
| 1136 | } | 1133 | } |
| 1137 | 1134 | ||
| 1135 | const KMemoryLayout& KernelCore::MemoryLayout() const { | ||
| 1136 | return impl->memory_layout; | ||
| 1137 | } | ||
| 1138 | |||
| 1138 | bool KernelCore::IsPhantomModeForSingleCore() const { | 1139 | bool KernelCore::IsPhantomModeForSingleCore() const { |
| 1139 | return impl->IsPhantomModeForSingleCore(); | 1140 | return impl->IsPhantomModeForSingleCore(); |
| 1140 | } | 1141 | } |