|
|
|
@ -105,7 +105,7 @@ struct KernelCore::Impl {
|
|
|
|
|
void Initialize(KernelCore& kernel) {
|
|
|
|
|
Shutdown();
|
|
|
|
|
|
|
|
|
|
InitializeResourceLimits(kernel);
|
|
|
|
|
InitializeSystemResourceLimit(kernel);
|
|
|
|
|
InitializeThreads();
|
|
|
|
|
InitializeTimers();
|
|
|
|
|
}
|
|
|
|
@ -118,7 +118,7 @@ struct KernelCore::Impl {
|
|
|
|
|
process_list.clear();
|
|
|
|
|
current_process = nullptr;
|
|
|
|
|
|
|
|
|
|
resource_limits.fill(nullptr);
|
|
|
|
|
system_resource_limit = nullptr;
|
|
|
|
|
|
|
|
|
|
thread_wakeup_callback_handle_table.Clear();
|
|
|
|
|
thread_wakeup_event_type = nullptr;
|
|
|
|
@ -129,63 +129,17 @@ struct KernelCore::Impl {
|
|
|
|
|
named_ports.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InitializeResourceLimits(KernelCore& kernel) {
|
|
|
|
|
// Create the four resource limits that the system uses
|
|
|
|
|
// Create the APPLICATION resource limit
|
|
|
|
|
SharedPtr<ResourceLimit> resource_limit = ResourceLimit::Create(kernel, "Applications");
|
|
|
|
|
resource_limit->max_priority = 0x18;
|
|
|
|
|
resource_limit->max_commit = 0x4000000;
|
|
|
|
|
resource_limit->max_threads = 0x20;
|
|
|
|
|
resource_limit->max_events = 0x20;
|
|
|
|
|
resource_limit->max_mutexes = 0x20;
|
|
|
|
|
resource_limit->max_semaphores = 0x8;
|
|
|
|
|
resource_limit->max_timers = 0x8;
|
|
|
|
|
resource_limit->max_shared_mems = 0x10;
|
|
|
|
|
resource_limit->max_address_arbiters = 0x2;
|
|
|
|
|
resource_limit->max_cpu_time = 0x1E;
|
|
|
|
|
resource_limits[static_cast<u8>(ResourceLimitCategory::APPLICATION)] = resource_limit;
|
|
|
|
|
|
|
|
|
|
// Create the SYS_APPLET resource limit
|
|
|
|
|
resource_limit = ResourceLimit::Create(kernel, "System Applets");
|
|
|
|
|
resource_limit->max_priority = 0x4;
|
|
|
|
|
resource_limit->max_commit = 0x5E00000;
|
|
|
|
|
resource_limit->max_threads = 0x1D;
|
|
|
|
|
resource_limit->max_events = 0xB;
|
|
|
|
|
resource_limit->max_mutexes = 0x8;
|
|
|
|
|
resource_limit->max_semaphores = 0x4;
|
|
|
|
|
resource_limit->max_timers = 0x4;
|
|
|
|
|
resource_limit->max_shared_mems = 0x8;
|
|
|
|
|
resource_limit->max_address_arbiters = 0x3;
|
|
|
|
|
resource_limit->max_cpu_time = 0x2710;
|
|
|
|
|
resource_limits[static_cast<u8>(ResourceLimitCategory::SYS_APPLET)] = resource_limit;
|
|
|
|
|
|
|
|
|
|
// Create the LIB_APPLET resource limit
|
|
|
|
|
resource_limit = ResourceLimit::Create(kernel, "Library Applets");
|
|
|
|
|
resource_limit->max_priority = 0x4;
|
|
|
|
|
resource_limit->max_commit = 0x600000;
|
|
|
|
|
resource_limit->max_threads = 0xE;
|
|
|
|
|
resource_limit->max_events = 0x8;
|
|
|
|
|
resource_limit->max_mutexes = 0x8;
|
|
|
|
|
resource_limit->max_semaphores = 0x4;
|
|
|
|
|
resource_limit->max_timers = 0x4;
|
|
|
|
|
resource_limit->max_shared_mems = 0x8;
|
|
|
|
|
resource_limit->max_address_arbiters = 0x1;
|
|
|
|
|
resource_limit->max_cpu_time = 0x2710;
|
|
|
|
|
resource_limits[static_cast<u8>(ResourceLimitCategory::LIB_APPLET)] = resource_limit;
|
|
|
|
|
|
|
|
|
|
// Create the OTHER resource limit
|
|
|
|
|
resource_limit = ResourceLimit::Create(kernel, "Others");
|
|
|
|
|
resource_limit->max_priority = 0x4;
|
|
|
|
|
resource_limit->max_commit = 0x2180000;
|
|
|
|
|
resource_limit->max_threads = 0xE1;
|
|
|
|
|
resource_limit->max_events = 0x108;
|
|
|
|
|
resource_limit->max_mutexes = 0x25;
|
|
|
|
|
resource_limit->max_semaphores = 0x43;
|
|
|
|
|
resource_limit->max_timers = 0x2C;
|
|
|
|
|
resource_limit->max_shared_mems = 0x1F;
|
|
|
|
|
resource_limit->max_address_arbiters = 0x2D;
|
|
|
|
|
resource_limit->max_cpu_time = 0x3E8;
|
|
|
|
|
resource_limits[static_cast<u8>(ResourceLimitCategory::OTHER)] = resource_limit;
|
|
|
|
|
// Creates the default system resource limit
|
|
|
|
|
void InitializeSystemResourceLimit(KernelCore& kernel) {
|
|
|
|
|
system_resource_limit = ResourceLimit::Create(kernel, "System");
|
|
|
|
|
|
|
|
|
|
// If setting the default system values fails, then something seriously wrong has occurred.
|
|
|
|
|
ASSERT(system_resource_limit->SetLimitValue(ResourceType::PhysicalMemory, 0x200000000)
|
|
|
|
|
.IsSuccess());
|
|
|
|
|
ASSERT(system_resource_limit->SetLimitValue(ResourceType::Threads, 800).IsSuccess());
|
|
|
|
|
ASSERT(system_resource_limit->SetLimitValue(ResourceType::Events, 700).IsSuccess());
|
|
|
|
|
ASSERT(system_resource_limit->SetLimitValue(ResourceType::TransferMemory, 200).IsSuccess());
|
|
|
|
|
ASSERT(system_resource_limit->SetLimitValue(ResourceType::Sessions, 900).IsSuccess());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InitializeThreads() {
|
|
|
|
@ -208,7 +162,7 @@ struct KernelCore::Impl {
|
|
|
|
|
std::vector<SharedPtr<Process>> process_list;
|
|
|
|
|
Process* current_process = nullptr;
|
|
|
|
|
|
|
|
|
|
std::array<SharedPtr<ResourceLimit>, 4> resource_limits;
|
|
|
|
|
SharedPtr<ResourceLimit> system_resource_limit;
|
|
|
|
|
|
|
|
|
|
/// The event type of the generic timer callback event
|
|
|
|
|
CoreTiming::EventType* timer_callback_event_type = nullptr;
|
|
|
|
@ -239,9 +193,8 @@ void KernelCore::Shutdown() {
|
|
|
|
|
impl->Shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SharedPtr<ResourceLimit> KernelCore::ResourceLimitForCategory(
|
|
|
|
|
ResourceLimitCategory category) const {
|
|
|
|
|
return impl->resource_limits.at(static_cast<std::size_t>(category));
|
|
|
|
|
SharedPtr<ResourceLimit> KernelCore::GetSystemResourceLimit() const {
|
|
|
|
|
return impl->system_resource_limit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SharedPtr<Thread> KernelCore::RetrieveThreadFromWakeupCallbackHandleTable(Handle handle) const {
|
|
|
|
|