From 4c4e7136cce90f264176a77bc6eb7127c6315dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Wed, 7 Mar 2018 21:17:06 +0100 Subject: [PATCH] Handle pagefaults caused by running of the stack --- src/kernel/proc/procmm.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/kernel/proc/procmm.c b/src/kernel/proc/procmm.c index c30ebdc..c9edee0 100644 --- a/src/kernel/proc/procmm.c +++ b/src/kernel/proc/procmm.c @@ -34,7 +34,22 @@ registers *proc_pagefault(registers *r) 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; }