mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 12:21:18 +00:00
kern: increase stack region size when thread resource limit is increased
This commit is contained in:
parent
7f2cbba543
commit
ea82889e6c
4 changed files with 14 additions and 14 deletions
|
@ -187,7 +187,7 @@ namespace ams::kern {
|
||||||
|
|
||||||
static void InitializeLinearMemoryRegionTrees();
|
static void InitializeLinearMemoryRegionTrees();
|
||||||
|
|
||||||
static size_t GetResourceRegionSizeForInit();
|
static size_t GetResourceRegionSizeForInit(bool use_extra_resource);
|
||||||
|
|
||||||
static MESOSPHERE_NOINLINE_IF_DEBUG auto GetKernelRegionExtents() { return GetVirtualMemoryRegionTree().GetDerivedRegionExtents(KMemoryRegionType_Kernel); }
|
static MESOSPHERE_NOINLINE_IF_DEBUG auto GetKernelRegionExtents() { return GetVirtualMemoryRegionTree().GetDerivedRegionExtents(KMemoryRegionType_Kernel); }
|
||||||
static MESOSPHERE_NOINLINE_IF_DEBUG auto GetKernelCodeRegionExtents() { return GetVirtualMemoryRegionTree().GetDerivedRegionExtents(KMemoryRegionType_KernelCode); }
|
static MESOSPHERE_NOINLINE_IF_DEBUG auto GetKernelCodeRegionExtents() { return GetVirtualMemoryRegionTree().GetDerivedRegionExtents(KMemoryRegionType_KernelCode); }
|
||||||
|
|
|
@ -126,11 +126,8 @@ namespace ams::kern {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t KMemoryLayout::GetResourceRegionSizeForInit() {
|
size_t KMemoryLayout::GetResourceRegionSizeForInit(bool use_extra_resource) {
|
||||||
/* Calculate resource region size based on whether we allow extra threads. */
|
return KernelResourceSize + (use_extra_resource ? KernelSlabHeapAdditionalSize : 0);
|
||||||
const bool use_extra_resources = KSystemControl::Init::ShouldIncreaseThreadResourceLimit();
|
|
||||||
|
|
||||||
return KernelResourceSize + (use_extra_resources ? KernelSlabHeapAdditionalSize : 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,12 +34,12 @@ namespace ams::kern::init {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/* Global Allocator. */
|
/* Global Allocator. */
|
||||||
KInitialPageAllocator g_initial_page_allocator;
|
constinit KInitialPageAllocator g_initial_page_allocator;
|
||||||
|
|
||||||
/* Global initial arguments array. */
|
/* Global initial arguments array. */
|
||||||
KPhysicalAddress g_init_arguments_phys_addr[cpu::NumCores];
|
constinit KPhysicalAddress g_init_arguments_phys_addr[cpu::NumCores];
|
||||||
|
|
||||||
KInitArguments g_init_arguments[cpu::NumCores];
|
constinit KInitArguments g_init_arguments[cpu::NumCores];
|
||||||
|
|
||||||
/* Page table attributes. */
|
/* Page table attributes. */
|
||||||
constexpr PageTableEntry KernelRoDataAttribute(PageTableEntry::Permission_KernelR, PageTableEntry::PageAttribute_NormalMemory, PageTableEntry::Shareable_InnerShareable, PageTableEntry::MappingFlag_Mapped);
|
constexpr PageTableEntry KernelRoDataAttribute(PageTableEntry::Permission_KernelR, PageTableEntry::PageAttribute_NormalMemory, PageTableEntry::Shareable_InnerShareable, PageTableEntry::MappingFlag_Mapped);
|
||||||
|
@ -263,14 +263,17 @@ namespace ams::kern::init {
|
||||||
const KVirtualAddress misc_region_start = GetRandomAlignedRegion(misc_region_size, MiscRegionAlign, init_pt, KMemoryLayout::GetVirtualMemoryRegionTree(), KMemoryRegionType_Kernel);
|
const KVirtualAddress misc_region_start = GetRandomAlignedRegion(misc_region_size, MiscRegionAlign, init_pt, KMemoryLayout::GetVirtualMemoryRegionTree(), KMemoryRegionType_Kernel);
|
||||||
MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetVirtualMemoryRegionTree().Insert(GetInteger(misc_region_start), misc_region_size, KMemoryRegionType_KernelMisc));
|
MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetVirtualMemoryRegionTree().Insert(GetInteger(misc_region_start), misc_region_size, KMemoryRegionType_KernelMisc));
|
||||||
|
|
||||||
|
/* Determine if we'll use extra thread resources. */
|
||||||
|
const bool use_extra_resources = KSystemControl::Init::ShouldIncreaseThreadResourceLimit();
|
||||||
|
|
||||||
/* Setup the stack region. */
|
/* Setup the stack region. */
|
||||||
constexpr size_t StackRegionSize = 14_MB;
|
const size_t stack_region_size = use_extra_resources ? 24_MB : 14_MB;
|
||||||
constexpr size_t StackRegionAlign = KernelAslrAlignment;
|
constexpr size_t StackRegionAlign = KernelAslrAlignment;
|
||||||
const KVirtualAddress stack_region_start = GetRandomAlignedRegion(StackRegionSize, StackRegionAlign, init_pt, KMemoryLayout::GetVirtualMemoryRegionTree(), KMemoryRegionType_Kernel);
|
const KVirtualAddress stack_region_start = GetRandomAlignedRegion(stack_region_size, StackRegionAlign, init_pt, KMemoryLayout::GetVirtualMemoryRegionTree(), KMemoryRegionType_Kernel);
|
||||||
MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetVirtualMemoryRegionTree().Insert(GetInteger(stack_region_start), StackRegionSize, KMemoryRegionType_KernelStack));
|
MESOSPHERE_INIT_ABORT_UNLESS(KMemoryLayout::GetVirtualMemoryRegionTree().Insert(GetInteger(stack_region_start), stack_region_size, KMemoryRegionType_KernelStack));
|
||||||
|
|
||||||
/* Determine the size of the resource region. */
|
/* Determine the size of the resource region. */
|
||||||
const size_t resource_region_size = KMemoryLayout::GetResourceRegionSizeForInit();
|
const size_t resource_region_size = KMemoryLayout::GetResourceRegionSizeForInit(use_extra_resources);
|
||||||
|
|
||||||
/* Determine the size of the slab region. */
|
/* Determine the size of the slab region. */
|
||||||
const size_t slab_region_size = util::AlignUp(CalculateTotalSlabHeapSize(), PageSize);
|
const size_t slab_region_size = util::AlignUp(CalculateTotalSlabHeapSize(), PageSize);
|
||||||
|
|
|
@ -161,7 +161,7 @@ namespace ams::kern::init::loader {
|
||||||
const uintptr_t init_array_end_offset = layout->init_array_end_offset;
|
const uintptr_t init_array_end_offset = layout->init_array_end_offset;
|
||||||
|
|
||||||
/* Determine the size of the resource region. */
|
/* Determine the size of the resource region. */
|
||||||
const size_t resource_region_size = KMemoryLayout::GetResourceRegionSizeForInit();
|
const size_t resource_region_size = KMemoryLayout::GetResourceRegionSizeForInit(KSystemControl::Init::ShouldIncreaseThreadResourceLimit());
|
||||||
const uintptr_t resource_end_address = base_address + resource_offset + resource_region_size;
|
const uintptr_t resource_end_address = base_address + resource_offset + resource_region_size;
|
||||||
|
|
||||||
/* Setup the INI1 header in memory for the kernel. */
|
/* Setup the INI1 header in memory for the kernel. */
|
||||||
|
|
Loading…
Reference in a new issue