summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp127
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));
47namespace Kernel { 49namespace Kernel {
48 50
49struct KernelCore::Impl { 51struct 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
1060KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() { 1149KSystemResource& KernelCore::GetSystemSystemResource() {
1061 return *impl->app_memory_block_manager; 1150 return *impl->sys_system_resource;
1062} 1151}
1063 1152
1064const KMemoryBlockSlabManager& KernelCore::GetApplicationMemoryBlockManager() const { 1153const KSystemResource& KernelCore::GetSystemSystemResource() const {
1065 return *impl->app_memory_block_manager; 1154 return *impl->sys_system_resource;
1066} 1155}
1067 1156
1068Kernel::KSharedMemory& KernelCore::GetHidSharedMem() { 1157Kernel::KSharedMemory& KernelCore::GetHidSharedMem() {