ソースを参照

Kernel: Crash process instead of panicking on KSYMS access

Also do the same for READONLY_AFTER_INIT and UNMAP_AFTER_INIT.
Idan Horowitz 3 年 前
コミット
6b08b18a9a
1 ファイル変更10 行追加5 行削除
  1. 10 5
      Kernel/Memory/MemoryManager.cpp

+ 10 - 5
Kernel/Memory/MemoryManager.cpp

@@ -711,16 +711,21 @@ PageFaultResponse MemoryManager::handle_page_fault(PageFault const& fault)
         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_ro_after_init, &end_of_ro_after_init)) {
+        dbgln("Attempt to write into READONLY_AFTER_INIT section");
+        return PageFaultResponse::ShouldCrash;
+    }
 
     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)");
+        dbgln("Attempt to access UNMAP_AFTER_INIT section ({:p}: {})", fault.vaddr(), kernel_symbol ? kernel_symbol->name : "(Unknown)");
+        return PageFaultResponse::ShouldCrash;
     }
 
-    if (faulted_in_range(&start_of_kernel_ksyms, &end_of_kernel_ksyms))
-        PANIC("Attempt to access KSYMS section");
+    if (faulted_in_range(&start_of_kernel_ksyms, &end_of_kernel_ksyms)) {
+        dbgln("Attempt to access KSYMS section");
+        return PageFaultResponse::ShouldCrash;
+    }
 
     if (Processor::current_in_irq()) {
         dbgln("CPU[{}] BUG! Page fault while handling IRQ! code={}, vaddr={}, irq level: {}",