diff options
| author | 2022-11-05 13:25:29 -0400 | |
|---|---|---|
| committer | 2022-11-05 13:25:29 -0400 | |
| commit | 4c198bbf06fe7b72d4718cf3571e99b6169e9f47 (patch) | |
| tree | 3f091be57ce7198ee53b721b160a454ef6dee913 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #9189 from vonchenplus/stupid (diff) | |
| parent | core: hle: kernel: Address review comments. (diff) | |
| download | yuzu-4c198bbf06fe7b72d4718cf3571e99b6169e9f47.tar.gz yuzu-4c198bbf06fe7b72d4718cf3571e99b6169e9f47.tar.xz yuzu-4c198bbf06fe7b72d4718cf3571e99b6169e9f47.zip | |
Merge pull request #9173 from bunnei/kern-update-15
Kernel: Various updates for FW 15.0.x
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 127 |
1 files changed, 108 insertions, 19 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 09c36ee09..47b760a9c 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -28,10 +28,12 @@ | |||
| 28 | #include "core/hle/kernel/k_handle_table.h" | 28 | #include "core/hle/kernel/k_handle_table.h" |
| 29 | #include "core/hle/kernel/k_memory_layout.h" | 29 | #include "core/hle/kernel/k_memory_layout.h" |
| 30 | #include "core/hle/kernel/k_memory_manager.h" | 30 | #include "core/hle/kernel/k_memory_manager.h" |
| 31 | #include "core/hle/kernel/k_page_buffer.h" | ||
| 31 | #include "core/hle/kernel/k_process.h" | 32 | #include "core/hle/kernel/k_process.h" |
| 32 | #include "core/hle/kernel/k_resource_limit.h" | 33 | #include "core/hle/kernel/k_resource_limit.h" |
| 33 | #include "core/hle/kernel/k_scheduler.h" | 34 | #include "core/hle/kernel/k_scheduler.h" |
| 34 | #include "core/hle/kernel/k_shared_memory.h" | 35 | #include "core/hle/kernel/k_shared_memory.h" |
| 36 | #include "core/hle/kernel/k_system_resource.h" | ||
| 35 | #include "core/hle/kernel/k_thread.h" | 37 | #include "core/hle/kernel/k_thread.h" |
| 36 | #include "core/hle/kernel/k_worker_task_manager.h" | 38 | #include "core/hle/kernel/k_worker_task_manager.h" |
| 37 | #include "core/hle/kernel/kernel.h" | 39 | #include "core/hle/kernel/kernel.h" |
| @@ -47,6 +49,11 @@ MICROPROFILE_DEFINE(Kernel_SVC, "Kernel", "SVC", MP_RGB(70, 200, 70)); | |||
| 47 | namespace Kernel { | 49 | namespace Kernel { |
| 48 | 50 | ||
| 49 | struct KernelCore::Impl { | 51 | struct KernelCore::Impl { |
| 52 | static constexpr size_t ApplicationMemoryBlockSlabHeapSize = 20000; | ||
| 53 | static constexpr size_t SystemMemoryBlockSlabHeapSize = 10000; | ||
| 54 | static constexpr size_t BlockInfoSlabHeapSize = 4000; | ||
| 55 | static constexpr size_t ReservedDynamicPageCount = 64; | ||
| 56 | |||
| 50 | explicit Impl(Core::System& system_, KernelCore& kernel_) | 57 | explicit Impl(Core::System& system_, KernelCore& kernel_) |
| 51 | : time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"}, | 58 | : time_manager{system_}, service_threads_manager{1, "ServiceThreadsManager"}, |
| 52 | service_thread_barrier{2}, system{system_} {} | 59 | service_thread_barrier{2}, system{system_} {} |
| @@ -71,7 +78,6 @@ struct KernelCore::Impl { | |||
| 71 | // Initialize kernel memory and resources. | 78 | // Initialize kernel memory and resources. |
| 72 | InitializeSystemResourceLimit(kernel, system.CoreTiming()); | 79 | InitializeSystemResourceLimit(kernel, system.CoreTiming()); |
| 73 | InitializeMemoryLayout(); | 80 | InitializeMemoryLayout(); |
| 74 | Init::InitializeKPageBufferSlabHeap(system); | ||
| 75 | InitializeShutdownThreads(); | 81 | InitializeShutdownThreads(); |
| 76 | InitializePhysicalCores(); | 82 | InitializePhysicalCores(); |
| 77 | InitializePreemption(kernel); | 83 | InitializePreemption(kernel); |
| @@ -81,7 +87,8 @@ struct KernelCore::Impl { | |||
| 81 | const auto& pt_heap_region = memory_layout->GetPageTableHeapRegion(); | 87 | const auto& pt_heap_region = memory_layout->GetPageTableHeapRegion(); |
| 82 | ASSERT(pt_heap_region.GetEndAddress() != 0); | 88 | ASSERT(pt_heap_region.GetEndAddress() != 0); |
| 83 | 89 | ||
| 84 | InitializeResourceManagers(pt_heap_region.GetAddress(), pt_heap_region.GetSize()); | 90 | InitializeResourceManagers(kernel, pt_heap_region.GetAddress(), |
| 91 | pt_heap_region.GetSize()); | ||
| 85 | } | 92 | } |
| 86 | 93 | ||
| 87 | RegisterHostThread(); | 94 | RegisterHostThread(); |
| @@ -253,16 +260,82 @@ struct KernelCore::Impl { | |||
| 253 | system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event); | 260 | system.CoreTiming().ScheduleLoopingEvent(time_interval, time_interval, preemption_event); |
| 254 | } | 261 | } |
| 255 | 262 | ||
| 256 | void InitializeResourceManagers(VAddr address, size_t size) { | 263 | void InitializeResourceManagers(KernelCore& kernel, VAddr address, size_t size) { |
| 257 | dynamic_page_manager = std::make_unique<KDynamicPageManager>(); | 264 | // Ensure that the buffer is suitable for our use. |
| 258 | memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>(); | 265 | ASSERT(Common::IsAligned(address, PageSize)); |
| 266 | ASSERT(Common::IsAligned(size, PageSize)); | ||
| 267 | |||
| 268 | // Ensure that we have space for our reference counts. | ||
| 269 | const size_t rc_size = | ||
| 270 | Common::AlignUp(KPageTableSlabHeap::CalculateReferenceCountSize(size), PageSize); | ||
| 271 | ASSERT(rc_size < size); | ||
| 272 | size -= rc_size; | ||
| 273 | |||
| 274 | // Initialize the resource managers' shared page manager. | ||
| 275 | resource_manager_page_manager = std::make_unique<KDynamicPageManager>(); | ||
| 276 | resource_manager_page_manager->Initialize( | ||
| 277 | address, size, std::max<size_t>(PageSize, KPageBufferSlabHeap::BufferSize)); | ||
| 278 | |||
| 279 | // Initialize the KPageBuffer slab heap. | ||
| 280 | page_buffer_slab_heap.Initialize(system); | ||
| 281 | |||
| 282 | // Initialize the fixed-size slabheaps. | ||
| 283 | app_memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>(); | ||
| 284 | sys_memory_block_heap = std::make_unique<KMemoryBlockSlabHeap>(); | ||
| 285 | block_info_heap = std::make_unique<KBlockInfoSlabHeap>(); | ||
| 286 | app_memory_block_heap->Initialize(resource_manager_page_manager.get(), | ||
| 287 | ApplicationMemoryBlockSlabHeapSize); | ||
| 288 | sys_memory_block_heap->Initialize(resource_manager_page_manager.get(), | ||
| 289 | SystemMemoryBlockSlabHeapSize); | ||
| 290 | block_info_heap->Initialize(resource_manager_page_manager.get(), BlockInfoSlabHeapSize); | ||
| 291 | |||
| 292 | // Reserve all but a fixed number of remaining pages for the page table heap. | ||
| 293 | const size_t num_pt_pages = resource_manager_page_manager->GetCount() - | ||
| 294 | resource_manager_page_manager->GetUsed() - | ||
| 295 | ReservedDynamicPageCount; | ||
| 296 | page_table_heap = std::make_unique<KPageTableSlabHeap>(); | ||
| 297 | |||
| 298 | // TODO(bunnei): Pass in address once we support kernel virtual memory allocations. | ||
| 299 | page_table_heap->Initialize( | ||
| 300 | resource_manager_page_manager.get(), num_pt_pages, | ||
| 301 | /*GetPointer<KPageTableManager::RefCount>(address + size)*/ nullptr); | ||
| 302 | |||
| 303 | // Setup the slab managers. | ||
| 304 | KDynamicPageManager* const app_dynamic_page_manager = nullptr; | ||
| 305 | KDynamicPageManager* const sys_dynamic_page_manager = | ||
| 306 | /*KTargetSystem::IsDynamicResourceLimitsEnabled()*/ true | ||
| 307 | ? resource_manager_page_manager.get() | ||
| 308 | : nullptr; | ||
| 259 | app_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>(); | 309 | app_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>(); |
| 260 | 310 | sys_memory_block_manager = std::make_unique<KMemoryBlockSlabManager>(); | |
| 261 | dynamic_page_manager->Initialize(address, size); | 311 | app_block_info_manager = std::make_unique<KBlockInfoManager>(); |
| 262 | static constexpr size_t ApplicationMemoryBlockSlabHeapSize = 20000; | 312 | sys_block_info_manager = std::make_unique<KBlockInfoManager>(); |
| 263 | memory_block_heap->Initialize(dynamic_page_manager.get(), | 313 | app_page_table_manager = std::make_unique<KPageTableManager>(); |
| 264 | ApplicationMemoryBlockSlabHeapSize); | 314 | sys_page_table_manager = std::make_unique<KPageTableManager>(); |
| 265 | app_memory_block_manager->Initialize(nullptr, memory_block_heap.get()); | 315 | |
| 316 | app_memory_block_manager->Initialize(app_dynamic_page_manager, app_memory_block_heap.get()); | ||
| 317 | sys_memory_block_manager->Initialize(sys_dynamic_page_manager, sys_memory_block_heap.get()); | ||
| 318 | |||
| 319 | app_block_info_manager->Initialize(app_dynamic_page_manager, block_info_heap.get()); | ||
| 320 | sys_block_info_manager->Initialize(sys_dynamic_page_manager, block_info_heap.get()); | ||
| 321 | |||
| 322 | app_page_table_manager->Initialize(app_dynamic_page_manager, page_table_heap.get()); | ||
| 323 | sys_page_table_manager->Initialize(sys_dynamic_page_manager, page_table_heap.get()); | ||
| 324 | |||
| 325 | // Check that we have the correct number of dynamic pages available. | ||
| 326 | ASSERT(resource_manager_page_manager->GetCount() - | ||
| 327 | resource_manager_page_manager->GetUsed() == | ||
| 328 | ReservedDynamicPageCount); | ||
| 329 | |||
| 330 | // Create the system page table managers. | ||
| 331 | app_system_resource = std::make_unique<KSystemResource>(kernel); | ||
| 332 | sys_system_resource = std::make_unique<KSystemResource>(kernel); | ||
| 333 | |||
| 334 | // Set the managers for the system resources. | ||
| 335 | app_system_resource->SetManagers(*app_memory_block_manager, *app_block_info_manager, | ||
| 336 | *app_page_table_manager); | ||
| 337 | sys_system_resource->SetManagers(*sys_memory_block_manager, *sys_block_info_manager, | ||
| 338 | *sys_page_table_manager); | ||
| 266 | } | 339 | } |
| 267 | 340 | ||
| 268 | void InitializeShutdownThreads() { | 341 | void InitializeShutdownThreads() { |
| @@ -446,6 +519,9 @@ struct KernelCore::Impl { | |||
| 446 | ASSERT(memory_layout->GetVirtualMemoryRegionTree().Insert( | 519 | ASSERT(memory_layout->GetVirtualMemoryRegionTree().Insert( |
| 447 | misc_region_start, misc_region_size, KMemoryRegionType_KernelMisc)); | 520 | misc_region_start, misc_region_size, KMemoryRegionType_KernelMisc)); |
| 448 | 521 | ||
| 522 | // Determine if we'll use extra thread resources. | ||
| 523 | const bool use_extra_resources = KSystemControl::Init::ShouldIncreaseThreadResourceLimit(); | ||
| 524 | |||
| 449 | // Setup the stack region. | 525 | // Setup the stack region. |
| 450 | constexpr size_t StackRegionSize = 14_MiB; | 526 | constexpr size_t StackRegionSize = 14_MiB; |
| 451 | constexpr size_t StackRegionAlign = KernelAslrAlignment; | 527 | constexpr size_t StackRegionAlign = KernelAslrAlignment; |
| @@ -456,7 +532,8 @@ struct KernelCore::Impl { | |||
| 456 | stack_region_start, StackRegionSize, KMemoryRegionType_KernelStack)); | 532 | stack_region_start, StackRegionSize, KMemoryRegionType_KernelStack)); |
| 457 | 533 | ||
| 458 | // Determine the size of the resource region. | 534 | // Determine the size of the resource region. |
| 459 | const size_t resource_region_size = memory_layout->GetResourceRegionSizeForInit(); | 535 | const size_t resource_region_size = |
| 536 | memory_layout->GetResourceRegionSizeForInit(use_extra_resources); | ||
| 460 | 537 | ||
| 461 | // Determine the size of the slab region. | 538 | // Determine the size of the slab region. |
| 462 | const size_t slab_region_size = | 539 | const size_t slab_region_size = |
| @@ -751,6 +828,8 @@ struct KernelCore::Impl { | |||
| 751 | Init::KSlabResourceCounts slab_resource_counts{}; | 828 | Init::KSlabResourceCounts slab_resource_counts{}; |
| 752 | KResourceLimit* system_resource_limit{}; | 829 | KResourceLimit* system_resource_limit{}; |
| 753 | 830 | ||
| 831 | KPageBufferSlabHeap page_buffer_slab_heap; | ||
| 832 | |||
| 754 | std::shared_ptr<Core::Timing::EventType> preemption_event; | 833 | std::shared_ptr<Core::Timing::EventType> preemption_event; |
| 755 | 834 | ||
| 756 | // This is the kernel's handle table or supervisor handle table which | 835 | // This is the kernel's handle table or supervisor handle table which |
| @@ -776,10 +855,20 @@ struct KernelCore::Impl { | |||
| 776 | // Kernel memory management | 855 | // Kernel memory management |
| 777 | std::unique_ptr<KMemoryManager> memory_manager; | 856 | std::unique_ptr<KMemoryManager> memory_manager; |
| 778 | 857 | ||
| 779 | // Dynamic slab managers | 858 | // Resource managers |
| 780 | std::unique_ptr<KDynamicPageManager> dynamic_page_manager; | 859 | std::unique_ptr<KDynamicPageManager> resource_manager_page_manager; |
| 781 | std::unique_ptr<KMemoryBlockSlabHeap> memory_block_heap; | 860 | std::unique_ptr<KPageTableSlabHeap> page_table_heap; |
| 861 | std::unique_ptr<KMemoryBlockSlabHeap> app_memory_block_heap; | ||
| 862 | std::unique_ptr<KMemoryBlockSlabHeap> sys_memory_block_heap; | ||
| 863 | std::unique_ptr<KBlockInfoSlabHeap> block_info_heap; | ||
| 864 | std::unique_ptr<KPageTableManager> app_page_table_manager; | ||
| 865 | std::unique_ptr<KPageTableManager> sys_page_table_manager; | ||
| 782 | std::unique_ptr<KMemoryBlockSlabManager> app_memory_block_manager; | 866 | std::unique_ptr<KMemoryBlockSlabManager> app_memory_block_manager; |
| 867 | std::unique_ptr<KMemoryBlockSlabManager> sys_memory_block_manager; | ||
| 868 | std::unique_ptr<KBlockInfoManager> app_block_info_manager; | ||
| 869 | std::unique_ptr<KBlockInfoManager> sys_block_info_manager; | ||
| 870 | std::unique_ptr<KSystemResource> app_system_resource; | ||
| 871 | std::unique_ptr<KSystemResource> sys_system_resource; | ||
| 783 | 872 | ||
| 784 | // Shared memory for services | 873 | // Shared memory for services |
| 785 | Kernel::KSharedMemory* hid_shared_mem{}; | 874 | Kernel::KSharedMemory* hid_shared_mem{}; |
| @@ -1057,12 +1146,12 @@ const KMemoryManager& KernelCore::MemoryManager() const { | |||
| 1057 | return *impl->memory_manager; | 1146 | return *impl->memory_manager; |
| 1058 | } | 1147 | } |
| 1059 | 1148 | ||
| 1060 | KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() { | 1149 | KSystemResource& KernelCore::GetSystemSystemResource() { |
| 1061 | return *impl->app_memory_block_manager; | 1150 | return *impl->sys_system_resource; |
| 1062 | } | 1151 | } |
| 1063 | 1152 | ||
| 1064 | const KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() const { | 1153 | const KSystemResource& KernelCore::GetSystemSystemResource() const { |
| 1065 | return *impl->app_memory_block_manager; | 1154 | return *impl->sys_system_resource; |
| 1066 | } | 1155 | } |
| 1067 | 1156 | ||
| 1068 | Kernel::KSharedMemory& KernelCore::GetHidSharedMem() { | 1157 | Kernel::KSharedMemory& KernelCore::GetHidSharedMem() { |