mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-01 03:57:15 +02:00
Kernel: Move kernel region checks from x86 page fault handler to MM
Ideally the x86 fault handler would only do x86 specific things and delegate the rest of the work to MemoryManager. This patch moves some of the address checks to a more generic place.
This commit is contained in:
Notes:
sideshowbarker
2024-07-18 03:23:00 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/a12e19c0152
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user