yuzu-emu
/
yuzu
Archived
1
0
Fork 0

hle: kernel: Move slab resource counts to Kernel.

This commit is contained in:
bunnei 2021-05-04 21:35:42 -07:00
parent d2c4dbde9e
commit b805ee653f
4 changed files with 52 additions and 33 deletions

View File

@ -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();

View File

@ -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

View File

@ -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();
} }

View File

@ -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;