1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 19:17:44 +00:00

Kernel+CrashReporter: Add metadata about page faults to crash reports

Crash reports for page faults now tell you what kind of memory access
failed and where. :^)
This commit is contained in:
Andreas Kling 2021-04-04 20:11:54 +02:00
parent e238435c4f
commit 0b8226811f
4 changed files with 27 additions and 2 deletions

View file

@ -284,7 +284,8 @@ void page_fault_handler(TrapFrame* trap)
PANIC("Attempt to access UNMAP_AFTER_INIT section");
}
auto response = MM.handle_page_fault(PageFault(regs.exception_code, VirtualAddress(fault_address)));
PageFault fault { regs.exception_code, VirtualAddress { fault_address } };
auto response = MM.handle_page_fault(fault);
if (response == PageFaultResponse::ShouldCrash || response == PageFaultResponse::OutOfMemory) {
if (faulted_in_kernel && handle_safe_access_fault(regs, fault_address)) {
@ -328,6 +329,18 @@ void page_fault_handler(TrapFrame* trap)
dbgln("Note: Address {} looks like a possible nullptr dereference", VirtualAddress(fault_address));
}
auto& current_process = current_thread->process();
if (current_process.is_user_process()) {
current_process.set_coredump_metadata("fault_address", String::formatted("{:p}", fault_address));
current_process.set_coredump_metadata("fault_type", fault.type() == PageFault::Type::PageNotPresent ? "NotPresent" : "ProtectionViolation");
String fault_access;
if (fault.is_instruction_fetch())
fault_access = "Execute";
else
fault_access = fault.access() == PageFault::Access::Read ? "Read" : "Write";
current_process.set_coredump_metadata("fault_access", fault_access);
}
handle_crash(regs, "Page Fault", SIGSEGV, response == PageFaultResponse::OutOfMemory);
} else if (response == PageFaultResponse::Continue) {
#if PAGE_FAULT_DEBUG
@ -2397,7 +2410,6 @@ void copy_ptrace_registers_into_kernel_registers(RegisterState& kernel_regs, con
kernel_regs.eip = ptrace_regs.eip;
kernel_regs.eflags = (kernel_regs.eflags & ~safe_eflags_mask) | (ptrace_regs.eflags & safe_eflags_mask);
}
}
#ifdef DEBUG