hle: kernel: Move slab resource counts to Kernel.
This commit is contained in:
		| @@ -25,7 +25,7 @@ | |||||||
|  |  | ||||||
| namespace Kernel::Init { | namespace Kernel::Init { | ||||||
|  |  | ||||||
| #define SLAB_COUNT(CLASS) g_slab_resource_counts.num_##CLASS | #define SLAB_COUNT(CLASS) kernel.SlabResourceCounts().num_##CLASS | ||||||
|  |  | ||||||
| #define FOREACH_SLAB_TYPE(HANDLER, ...)                                                            \ | #define FOREACH_SLAB_TYPE(HANDLER, ...)                                                            \ | ||||||
|     HANDLER(KProcess, (SLAB_COUNT(KProcess)), ##__VA_ARGS__)                                       \ |     HANDLER(KProcess, (SLAB_COUNT(KProcess)), ##__VA_ARGS__)                                       \ | ||||||
| @@ -67,26 +67,6 @@ constexpr size_t SlabCountKBeta = 6; | |||||||
|  |  | ||||||
| constexpr size_t SlabCountExtraKThread = 160; | constexpr size_t SlabCountExtraKThread = 160; | ||||||
|  |  | ||||||
| // Global to hold our resource counts. |  | ||||||
| KSlabResourceCounts g_slab_resource_counts = { |  | ||||||
|     .num_KProcess = SlabCountKProcess, |  | ||||||
|     .num_KThread = SlabCountKThread, |  | ||||||
|     .num_KEvent = SlabCountKEvent, |  | ||||||
|     .num_KInterruptEvent = SlabCountKInterruptEvent, |  | ||||||
|     .num_KPort = SlabCountKPort, |  | ||||||
|     .num_KSharedMemory = SlabCountKSharedMemory, |  | ||||||
|     .num_KTransferMemory = SlabCountKTransferMemory, |  | ||||||
|     .num_KCodeMemory = SlabCountKCodeMemory, |  | ||||||
|     .num_KDeviceAddressSpace = SlabCountKDeviceAddressSpace, |  | ||||||
|     .num_KSession = SlabCountKSession, |  | ||||||
|     .num_KLightSession = SlabCountKLightSession, |  | ||||||
|     .num_KObjectName = SlabCountKObjectName, |  | ||||||
|     .num_KResourceLimit = SlabCountKResourceLimit, |  | ||||||
|     .num_KDebug = SlabCountKDebug, |  | ||||||
|     .num_KAlpha = SlabCountKAlpha, |  | ||||||
|     .num_KBeta = SlabCountKBeta, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| VAddr InitializeSlabHeap(Core::System& system, KMemoryLayout& memory_layout, VAddr address, | VAddr InitializeSlabHeap(Core::System& system, KMemoryLayout& memory_layout, VAddr address, | ||||||
|                          size_t num_objects) { |                          size_t num_objects) { | ||||||
| @@ -105,19 +85,35 @@ VAddr InitializeSlabHeap(Core::System& system, KMemoryLayout& memory_layout, VAd | |||||||
|  |  | ||||||
| } // namespace | } // namespace | ||||||
|  |  | ||||||
| const KSlabResourceCounts& GetSlabResourceCounts() { | KSlabResourceCounts KSlabResourceCounts::CreateDefault() { | ||||||
|     return g_slab_resource_counts; |     return { | ||||||
|  |         .num_KProcess = SlabCountKProcess, | ||||||
|  |         .num_KThread = SlabCountKThread, | ||||||
|  |         .num_KEvent = SlabCountKEvent, | ||||||
|  |         .num_KInterruptEvent = SlabCountKInterruptEvent, | ||||||
|  |         .num_KPort = SlabCountKPort, | ||||||
|  |         .num_KSharedMemory = SlabCountKSharedMemory, | ||||||
|  |         .num_KTransferMemory = SlabCountKTransferMemory, | ||||||
|  |         .num_KCodeMemory = SlabCountKCodeMemory, | ||||||
|  |         .num_KDeviceAddressSpace = SlabCountKDeviceAddressSpace, | ||||||
|  |         .num_KSession = SlabCountKSession, | ||||||
|  |         .num_KLightSession = SlabCountKLightSession, | ||||||
|  |         .num_KObjectName = SlabCountKObjectName, | ||||||
|  |         .num_KResourceLimit = SlabCountKResourceLimit, | ||||||
|  |         .num_KDebug = SlabCountKDebug, | ||||||
|  |         .num_KAlpha = SlabCountKAlpha, | ||||||
|  |         .num_KBeta = SlabCountKBeta, | ||||||
|  |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
| void InitializeSlabResourceCounts() { | void InitializeSlabResourceCounts(KernelCore& kernel) { | ||||||
|     // Note: Nintendo initializes all fields here, but we initialize all constants at compile-time. |     kernel.SlabResourceCounts() = KSlabResourceCounts::CreateDefault(); | ||||||
|  |  | ||||||
|     if (KSystemControl::Init::ShouldIncreaseThreadResourceLimit()) { |     if (KSystemControl::Init::ShouldIncreaseThreadResourceLimit()) { | ||||||
|         g_slab_resource_counts.num_KThread += SlabCountExtraKThread; |         kernel.SlabResourceCounts().num_KThread += SlabCountExtraKThread; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t CalculateTotalSlabHeapSize() { | size_t CalculateTotalSlabHeapSize(const KernelCore& kernel) { | ||||||
|     size_t size = 0; |     size_t size = 0; | ||||||
|  |  | ||||||
| #define ADD_SLAB_SIZE(NAME, COUNT, ...)                                                            \ | #define ADD_SLAB_SIZE(NAME, COUNT, ...)                                                            \ | ||||||
| @@ -138,6 +134,8 @@ size_t CalculateTotalSlabHeapSize() { | |||||||
| } | } | ||||||
|  |  | ||||||
| void InitializeSlabHeaps(Core::System& system, KMemoryLayout& memory_layout) { | 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. |     // Get the start of the slab region, since that's where we'll be working. | ||||||
|     VAddr address = memory_layout.GetSlabRegionAddress(); |     VAddr address = memory_layout.GetSlabRegionAddress(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,12 +9,15 @@ class System; | |||||||
| } // namespace Core | } // namespace Core | ||||||
|  |  | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
|  | class KernelCore; | ||||||
| class KMemoryLayout; | class KMemoryLayout; | ||||||
| } // namespace Kernel | } // namespace Kernel | ||||||
|  |  | ||||||
| namespace Kernel::Init { | namespace Kernel::Init { | ||||||
|  |  | ||||||
| struct KSlabResourceCounts { | struct KSlabResourceCounts { | ||||||
|  |     static KSlabResourceCounts CreateDefault(); | ||||||
|  |  | ||||||
|     size_t num_KProcess; |     size_t num_KProcess; | ||||||
|     size_t num_KThread; |     size_t num_KThread; | ||||||
|     size_t num_KEvent; |     size_t num_KEvent; | ||||||
| @@ -33,10 +36,8 @@ struct KSlabResourceCounts { | |||||||
|     size_t num_KBeta; |     size_t num_KBeta; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void InitializeSlabResourceCounts(); | void InitializeSlabResourceCounts(KernelCore& kernel); | ||||||
| const KSlabResourceCounts& GetSlabResourceCounts(); | size_t CalculateTotalSlabHeapSize(const KernelCore& kernel); | ||||||
|  |  | ||||||
| size_t CalculateTotalSlabHeapSize(); |  | ||||||
| void InitializeSlabHeaps(Core::System& system, KMemoryLayout& memory_layout); | void InitializeSlabHeaps(Core::System& system, KMemoryLayout& memory_layout); | ||||||
|  |  | ||||||
| } // namespace Kernel::Init | } // namespace Kernel::Init | ||||||
|   | |||||||
| @@ -69,6 +69,7 @@ struct KernelCore::Impl { | |||||||
|         InitializePhysicalCores(); |         InitializePhysicalCores(); | ||||||
|  |  | ||||||
|         // Derive the initial memory layout from the emulated board |         // Derive the initial memory layout from the emulated board | ||||||
|  |         Init::InitializeSlabResourceCounts(kernel); | ||||||
|         KMemoryLayout memory_layout; |         KMemoryLayout memory_layout; | ||||||
|         DeriveInitialMemoryLayout(memory_layout); |         DeriveInitialMemoryLayout(memory_layout); | ||||||
|         Init::InitializeSlabHeaps(system, memory_layout); |         Init::InitializeSlabHeaps(system, memory_layout); | ||||||
| @@ -395,7 +396,7 @@ struct KernelCore::Impl { | |||||||
|  |  | ||||||
|         // Determine the size of the slab region. |         // Determine the size of the slab region. | ||||||
|         const size_t slab_region_size = |         const size_t slab_region_size = | ||||||
|             Common::AlignUp(Init::CalculateTotalSlabHeapSize(), PageSize); |             Common::AlignUp(Init::CalculateTotalSlabHeapSize(system.Kernel()), PageSize); | ||||||
|         ASSERT(slab_region_size <= resource_region_size); |         ASSERT(slab_region_size <= resource_region_size); | ||||||
|  |  | ||||||
|         // Setup the slab region. |         // Setup the slab region. | ||||||
| @@ -642,6 +643,7 @@ struct KernelCore::Impl { | |||||||
|     std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; |     std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; | ||||||
|     Kernel::TimeManager time_manager; |     Kernel::TimeManager time_manager; | ||||||
|  |  | ||||||
|  |     Init::KSlabResourceCounts slab_resource_counts{}; | ||||||
|     KResourceLimit* system_resource_limit{}; |     KResourceLimit* system_resource_limit{}; | ||||||
|  |  | ||||||
|     std::shared_ptr<Core::Timing::EventType> preemption_event; |     std::shared_ptr<Core::Timing::EventType> preemption_event; | ||||||
| @@ -995,6 +997,14 @@ void KernelCore::ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> servi | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() { | ||||||
|  |     return impl->slab_resource_counts; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Init::KSlabResourceCounts& KernelCore::SlabResourceCounts() const { | ||||||
|  |     return impl->slab_resource_counts; | ||||||
|  | } | ||||||
|  |  | ||||||
| bool KernelCore::IsPhantomModeForSingleCore() const { | bool KernelCore::IsPhantomModeForSingleCore() const { | ||||||
|     return impl->IsPhantomModeForSingleCore(); |     return impl->IsPhantomModeForSingleCore(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -51,6 +51,10 @@ class ServiceThread; | |||||||
| class Synchronization; | class Synchronization; | ||||||
| class TimeManager; | class TimeManager; | ||||||
|  |  | ||||||
|  | namespace Init { | ||||||
|  | struct KSlabResourceCounts; | ||||||
|  | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| class KSlabHeap; | class KSlabHeap; | ||||||
|  |  | ||||||
| @@ -292,6 +296,12 @@ public: | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// Gets the current slab resource counts. | ||||||
|  |     Init::KSlabResourceCounts& SlabResourceCounts(); | ||||||
|  |  | ||||||
|  |     /// Gets the current slab resource counts. | ||||||
|  |     const Init::KSlabResourceCounts& SlabResourceCounts() const; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     friend class KProcess; |     friend class KProcess; | ||||||
|     friend class KThread; |     friend class KThread; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei