[Zion] Map user stacks in as regular MemoryObjects.
This allows us to easily track the physical memory so it can be freed when the thread exits. It also simplifies the page fault handler as it just needs to check regular mappings to find a user stack.
This commit is contained in:
parent
ba1b4df702
commit
2dd69f5844
6 changed files with 29 additions and 42 deletions
|
|
@ -18,12 +18,18 @@ AddressSpace::AddressSpace() {
|
|||
InitializePml4(cr3_);
|
||||
}
|
||||
|
||||
uint64_t AddressSpace::AllocateUserStack() {
|
||||
return user_stacks_.NewUserStack();
|
||||
glcr::ErrorOr<uint64_t> AddressSpace::AllocateUserStack() {
|
||||
uint64_t base = user_stacks_.NewUserStack();
|
||||
auto mem_object = glcr::StaticCastRefPtr<MemoryObject>(
|
||||
glcr::MakeRefCounted<VariableMemoryObject>(kUserStackSize));
|
||||
RET_ERR(MapInMemoryObject(base, mem_object));
|
||||
return base;
|
||||
}
|
||||
|
||||
void AddressSpace::FreeUserStack(uint64_t rsp) {
|
||||
return user_stacks_.FreeUserStack(rsp);
|
||||
glcr::ErrorCode AddressSpace::FreeUserStack(uint64_t base) {
|
||||
RET_ERR(FreeAddressRange(base, base + kUserStackSize));
|
||||
user_stacks_.FreeUserStack(base);
|
||||
return glcr::OK;
|
||||
}
|
||||
|
||||
uint64_t AddressSpace::GetNextMemMapAddr(uint64_t size, uint64_t align) {
|
||||
|
|
@ -70,11 +76,6 @@ bool AddressSpace::HandlePageFault(uint64_t vaddr) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (user_stacks_.IsValidStack(vaddr)) {
|
||||
MapPage(cr3_, vaddr, phys_mem::AllocatePage());
|
||||
return true;
|
||||
}
|
||||
|
||||
auto offset_or = mapping_tree_.GetPhysicalPageAtVaddr(vaddr);
|
||||
if (!offset_or.ok()) {
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue