From 5d94525c7a1bd68a9928d531821b24a515529df9 Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 6 Nov 2022 18:12:25 +0100 Subject: [PATCH] Kernel: Figure out why a program is misbehaving --- kernel/include/utils/PageFaultReason.h | 4 ++++ kernel/src/interrupts/Entry.cpp | 8 ++++++++ kernel/src/utils/PageFaultReason.cpp | 20 ++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 kernel/include/utils/PageFaultReason.h create mode 100644 kernel/src/utils/PageFaultReason.cpp diff --git a/kernel/include/utils/PageFaultReason.h b/kernel/include/utils/PageFaultReason.h new file mode 100644 index 00000000..7f9d88da --- /dev/null +++ b/kernel/include/utils/PageFaultReason.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void determine_user_page_fault_reason(uintptr_t faulting_address); \ No newline at end of file diff --git a/kernel/src/interrupts/Entry.cpp b/kernel/src/interrupts/Entry.cpp index 1431a292..37f86b22 100644 --- a/kernel/src/interrupts/Entry.cpp +++ b/kernel/src/interrupts/Entry.cpp @@ -5,6 +5,7 @@ #include "interrupts/Interrupts.h" #include "io/Serial.h" #include "log/Log.h" +#include "memory/VMM.h" #include "misc/hang.h" #include "panic/Panic.h" #include "std/assert.h" @@ -12,6 +13,7 @@ #include "sys/Syscall.h" #include "thread/Scheduler.h" #include "trace/StackTracer.h" +#include "utils/PageFaultReason.h" extern "C" void common_handler(Context* context) { @@ -28,6 +30,8 @@ extern "C" void common_handler(Context* context) if (context->cs == 0x8) { int_panic(context, "GPF in kernel task"); } else { + VMM::enter_syscall_context(); + kerrorln("General protection fault at RIP %lx, cs %ld, ss %ld, RSP %lx, error code %ld", context->rip, context->cs, context->ss, context->rsp, context->error_code); kinfoln("Stack trace:"); @@ -44,6 +48,8 @@ extern "C" void common_handler(Context* context) if (context->cs == 0x8) { int_panic(context, "Page fault in kernel task"); } else { + VMM::enter_syscall_context(); + kerrorln("Page fault in ring 3 (RIP %lx), while trying to access %lx, error code %ld", context->rip, context->cr2, context->error_code); kinfoln("Stack trace:"); @@ -51,6 +57,8 @@ extern "C" void common_handler(Context* context) StackTracer tracer(context->rbp); tracer.trace_with_ip(context->rip); + determine_user_page_fault_reason(context->cr2); + Scheduler::task_misbehave(context, -3); } } diff --git a/kernel/src/utils/PageFaultReason.cpp b/kernel/src/utils/PageFaultReason.cpp new file mode 100644 index 00000000..054a2294 --- /dev/null +++ b/kernel/src/utils/PageFaultReason.cpp @@ -0,0 +1,20 @@ +#define MODULE "mem" + +#include "utils/PageFaultReason.h" +#include "log/Log.h" + +#define PROGRAM_STACK_BOTTOM 0x100000 + +void determine_user_page_fault_reason(uintptr_t faulting_address) +{ + if (faulting_address < 0x1000) + { + kinfoln("Address 0x%lx looks like a nullptr dereference", faulting_address); + return; + } + if (faulting_address < PROGRAM_STACK_BOTTOM && (PROGRAM_STACK_BOTTOM - faulting_address) < 0x1000) + { + kinfoln("Address 0x%lx looks like a stack overflow", faulting_address); + return; + } +} \ No newline at end of file