From 28c82567a0415c58198ee7f591517c4d3c7a4f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Tue, 6 Mar 2018 10:28:35 +0100 Subject: [PATCH] Process page fault handler --- src/kernel/proc/process.c | 6 ++++++ src/kernel/proc/procmm.c | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/kernel/proc/process.c b/src/kernel/proc/process.c index 9e6b4ca..3d9acd4 100644 --- a/src/kernel/proc/process.c +++ b/src/kernel/proc/process.c @@ -21,10 +21,16 @@ struct process *sched_proc = 0; struct process *_proc = 0; void procmm_init(struct process *p); +registers *proc_pagefault(registers *r); uint64_t next_pid = 1; struct process *new_process(void (*function)(void)) { + if(next_pid == 1) + { + bind_interrupt(14, proc_pagefault); + } + struct process *proc = P2V(pmm_calloc()); proc->pid = next_pid++; proc->stack_ptr = incptr(proc, PAGE_SIZE - sizeof(struct swtch_stack)); diff --git a/src/kernel/proc/procmm.c b/src/kernel/proc/procmm.c index 0c8c9f3..c30ebdc 100644 --- a/src/kernel/proc/procmm.c +++ b/src/kernel/proc/procmm.c @@ -4,6 +4,7 @@ #include #include #include +#include void procmm_init(struct process *p) { @@ -22,3 +23,18 @@ uint64_t procmm_brk(struct process *p, void *addr) } return p->brk; } + +registers *proc_pagefault(registers *r) +{ + if(!(r->rflags & (3<<12))) + { + debug_error("Page fault in kernel!\n"); + debug("Interrupt number: %d Error code: %d\n", r->int_no, r->err_code); + debug_print_registers(r); + PANIC("Page fault in kernel\n"); + } + + PANIC("Page fault in process\n"); + + return r; +}