|
@@ -12,6 +12,7 @@
|
|
|
#include <Kernel/CMOS.h>
|
|
|
#include <Kernel/FileSystem/Inode.h>
|
|
|
#include <Kernel/Heap/kmalloc.h>
|
|
|
+#include <Kernel/KSyms.h>
|
|
|
#include <Kernel/Memory/AnonymousVMObject.h>
|
|
|
#include <Kernel/Memory/MemoryManager.h>
|
|
|
#include <Kernel/Memory/PageDirectory.h>
|
|
@@ -720,6 +721,22 @@ Region* MemoryManager::find_region_from_vaddr(VirtualAddress vaddr)
|
|
|
PageFaultResponse MemoryManager::handle_page_fault(PageFault const& fault)
|
|
|
{
|
|
|
VERIFY_INTERRUPTS_DISABLED();
|
|
|
+
|
|
|
+ auto faulted_in_range = [&fault](auto const* start, auto const* end) {
|
|
|
+ return fault.vaddr() >= VirtualAddress { start } && fault.vaddr() < VirtualAddress { end };
|
|
|
+ };
|
|
|
+
|
|
|
+ if (faulted_in_range(&start_of_ro_after_init, &end_of_ro_after_init))
|
|
|
+ PANIC("Attempt to write into READONLY_AFTER_INIT section");
|
|
|
+
|
|
|
+ if (faulted_in_range(&start_of_unmap_after_init, &end_of_unmap_after_init)) {
|
|
|
+ auto const* kernel_symbol = symbolicate_kernel_address(fault.vaddr().get());
|
|
|
+ PANIC("Attempt to access UNMAP_AFTER_INIT section ({:p}: {})", fault.vaddr(), kernel_symbol ? kernel_symbol->name : "(Unknown)");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (faulted_in_range(&start_of_kernel_ksyms, &end_of_kernel_ksyms))
|
|
|
+ PANIC("Attempt to access KSYMS section");
|
|
|
+
|
|
|
if (Processor::current_in_irq()) {
|
|
|
dbgln("CPU[{}] BUG! Page fault while handling IRQ! code={}, vaddr={}, irq level: {}",
|
|
|
Processor::current_id(), fault.code(), fault.vaddr(), Processor::current_in_irq());
|