hle: kernel: Move slab resource counts to Kernel.
This commit is contained in:
parent
d2c4dbde9e
commit
b805ee653f
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user