forked from Bananymous/banan-os
				
			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
 | ||||
| 		//        stack overflows on some machines with 8 page stack
 | ||||
| 		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: | ||||
| 		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) | ||||
| 	{ | ||||
| 		ASSERT(contains(vaddr)); | ||||
| 		ASSERT(&PageTable::current() == &m_page_table); | ||||
| 		vaddr &= PAGE_ADDR_MASK; | ||||
| 
 | ||||
| 		if (m_preallocated) | ||||
| 			return false; | ||||
|  | @ -158,8 +158,11 @@ namespace Kernel | |||
| 		if (m_paddrs[index] == 0) | ||||
| 			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); | ||||
| 		memset(reinterpret_cast<void*>(vaddr), 0, PAGE_SIZE); | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
|  |  | |||
|  | @ -138,7 +138,7 @@ namespace Kernel | |||
| 			stack_addr_start, USERSPACE_END, | ||||
| 			userspace_stack_size, | ||||
| 			PageTable::Flags::UserSupervisor | PageTable::Flags::ReadWrite | PageTable::Flags::Present, | ||||
| 			true, true | ||||
| 			false, true | ||||
| 		)); | ||||
| 
 | ||||
| 		thread_deleter.disable(); | ||||
|  | @ -217,6 +217,7 @@ namespace Kernel | |||
| 		save_sse(); | ||||
| 		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::fast_page_as<void*>(PAGE_SIZE - sizeof(uintptr_t)) = arg; | ||||
| 		}); | ||||
|  | @ -299,6 +300,10 @@ namespace Kernel | |||
| 
 | ||||
| 		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 = | ||||
| 			[this](BAN::ConstByteSpan buffer, vaddr_t vaddr) -> void | ||||
| 			{ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue