Kernel: Make userspace stack on-demand allocated
Also bump the hardlimit of stack size from 512 KiB->32 MiB. This still feels quite low but is much better than before :D
This commit is contained in:
parent
f5bbcc017c
commit
72f85dce2b
|
@ -35,7 +35,9 @@ namespace Kernel
|
||||||
// FIXME: kernel stack does NOT have to be this big, but my recursive AML interpreter
|
// FIXME: kernel stack does NOT have to be this big, but my recursive AML interpreter
|
||||||
// stack overflows on some machines with 8 page stack
|
// stack overflows on some machines with 8 page stack
|
||||||
static constexpr size_t kernel_stack_size { PAGE_SIZE * 16 };
|
static constexpr size_t kernel_stack_size { PAGE_SIZE * 16 };
|
||||||
static constexpr size_t userspace_stack_size { PAGE_SIZE * 128 };
|
|
||||||
|
// TODO: userspace stack is hard limited to 32 MiB, maybe make this dynamic?
|
||||||
|
static constexpr size_t userspace_stack_size { 32 << 20 };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static BAN::ErrorOr<Thread*> create_kernel(entry_t, void*);
|
static BAN::ErrorOr<Thread*> create_kernel(entry_t, void*);
|
||||||
|
|
|
@ -143,7 +143,7 @@ namespace Kernel
|
||||||
BAN::ErrorOr<bool> VirtualRange::allocate_page_for_demand_paging(vaddr_t vaddr)
|
BAN::ErrorOr<bool> VirtualRange::allocate_page_for_demand_paging(vaddr_t vaddr)
|
||||||
{
|
{
|
||||||
ASSERT(contains(vaddr));
|
ASSERT(contains(vaddr));
|
||||||
ASSERT(&PageTable::current() == &m_page_table);
|
vaddr &= PAGE_ADDR_MASK;
|
||||||
|
|
||||||
if (m_preallocated)
|
if (m_preallocated)
|
||||||
return false;
|
return false;
|
||||||
|
@ -158,8 +158,11 @@ namespace Kernel
|
||||||
if (m_paddrs[index] == 0)
|
if (m_paddrs[index] == 0)
|
||||||
return BAN::Error::from_errno(ENOMEM);
|
return BAN::Error::from_errno(ENOMEM);
|
||||||
|
|
||||||
|
PageTable::with_fast_page(m_paddrs[index], []{
|
||||||
|
memset(PageTable::fast_page_as_ptr(), 0x00, PAGE_SIZE);
|
||||||
|
});
|
||||||
|
|
||||||
m_page_table.map_page_at(m_paddrs[index], vaddr, m_flags);
|
m_page_table.map_page_at(m_paddrs[index], vaddr, m_flags);
|
||||||
memset(reinterpret_cast<void*>(vaddr), 0, PAGE_SIZE);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,7 @@ namespace Kernel
|
||||||
stack_addr_start, USERSPACE_END,
|
stack_addr_start, USERSPACE_END,
|
||||||
userspace_stack_size,
|
userspace_stack_size,
|
||||||
PageTable::Flags::UserSupervisor | PageTable::Flags::ReadWrite | PageTable::Flags::Present,
|
PageTable::Flags::UserSupervisor | PageTable::Flags::ReadWrite | PageTable::Flags::Present,
|
||||||
true, true
|
false, true
|
||||||
));
|
));
|
||||||
|
|
||||||
thread_deleter.disable();
|
thread_deleter.disable();
|
||||||
|
@ -217,6 +217,7 @@ namespace Kernel
|
||||||
save_sse();
|
save_sse();
|
||||||
memcpy(thread->m_sse_storage, m_sse_storage, sizeof(m_sse_storage));
|
memcpy(thread->m_sse_storage, m_sse_storage, sizeof(m_sse_storage));
|
||||||
|
|
||||||
|
TRY(thread->userspace_stack().allocate_page_for_demand_paging(thread->userspace_stack_top() - PAGE_SIZE));
|
||||||
PageTable::with_fast_page(thread->userspace_stack().paddr_of(thread->userspace_stack_top() - PAGE_SIZE), [=] {
|
PageTable::with_fast_page(thread->userspace_stack().paddr_of(thread->userspace_stack_top() - PAGE_SIZE), [=] {
|
||||||
PageTable::fast_page_as<void*>(PAGE_SIZE - sizeof(uintptr_t)) = arg;
|
PageTable::fast_page_as<void*>(PAGE_SIZE - sizeof(uintptr_t)) = arg;
|
||||||
});
|
});
|
||||||
|
@ -299,6 +300,10 @@ namespace Kernel
|
||||||
|
|
||||||
vaddr_t vaddr = userspace_stack_top() - needed_size;
|
vaddr_t vaddr = userspace_stack_top() - needed_size;
|
||||||
|
|
||||||
|
const size_t page_count = BAN::Math::div_round_up(needed_size, PAGE_SIZE);
|
||||||
|
for (size_t i = 0; i < page_count; i++)
|
||||||
|
TRY(m_userspace_stack->allocate_page_for_demand_paging(vaddr + i * PAGE_SIZE));
|
||||||
|
|
||||||
const auto stack_copy_buf =
|
const auto stack_copy_buf =
|
||||||
[this](BAN::ConstByteSpan buffer, vaddr_t vaddr) -> void
|
[this](BAN::ConstByteSpan buffer, vaddr_t vaddr) -> void
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue