Handle pagefaults caused by running of the stack

This commit is contained in:
Thomas Lovén 2018-03-07 21:17:06 +01:00
parent 28c82567a0
commit 4c4e7136cc

View File

@ -34,7 +34,22 @@ registers *proc_pagefault(registers *r)
PANIC("Page fault in kernel\n"); PANIC("Page fault in kernel\n");
} }
PANIC("Page fault in process\n"); uint64_t fault_addr = read_cr2();
uint64_t stack = PROCESS()->stack;
if(fault_addr + PAGE_SIZE >= stack)
{
// Page fault happened just below stack. Add another page to it.
// Unless it's about to run into brk.
if(stack - PAGE_SIZE <= PROCESS()->brk)
PANIC("Stack overflow in process %d\n", PROCESS()->pid);
stack -= PAGE_SIZE;
vmm_set_page(PROCESS()->P4, stack, pmm_alloc(), PAGE_USER | PAGE_WRITE | PAGE_PRESENT);
PROCESS()->stack = stack;
return r;
}
PANIC("Page fault in process\n");
return r; return r;
} }