Kernel: Allow zero-fill page faults on kernel-only pages
We were short-circuiting the page fault handler a little too eagerly for page-not-present faults in kernel memory. If the current page directory already has up-to-date mapps for kernel memory, allow it to progress to checking for zero-fill conditions. This will enable us to have lazily populated kernel regions.
This commit is contained in:
parent
da615e46cd
commit
a0bb592b4f
Notes:
sideshowbarker
2024-07-19 12:51:11 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/a0bb592b4f8
1 changed files with 6 additions and 4 deletions
|
@ -416,12 +416,14 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
|
|||
#endif
|
||||
ASSERT(fault.vaddr() != m_quickmap_addr);
|
||||
if (fault.type() == PageFault::Type::PageNotPresent && fault.vaddr().get() >= 0xc0000000) {
|
||||
auto* current_page_directory = reinterpret_cast<PageDirectoryEntry*>(cpu_cr3());
|
||||
u32 page_directory_index = (fault.vaddr().get() >> 22) & 0x3ff;
|
||||
auto& kernel_pde = kernel_page_directory().entries()[page_directory_index];
|
||||
if (kernel_pde.is_present()) {
|
||||
dbgprintf("NP(kernel): copying new kernel mapping for L%x into current page directory\n", fault.vaddr().get());
|
||||
auto* current_page_directory = reinterpret_cast<PageDirectoryEntry*>(cpu_cr3());
|
||||
current_page_directory[page_directory_index].copy_from({}, kernel_pde);
|
||||
auto& current_pde = current_page_directory[page_directory_index];
|
||||
|
||||
if (kernel_pde.is_present() && !current_pde.is_present()) {
|
||||
dbg() << "NP(kernel): Copying new kernel mapping for " << fault.vaddr() << " into current page directory";
|
||||
current_pde.copy_from({}, kernel_pde);
|
||||
flush_tlb(fault.vaddr().page_base());
|
||||
return PageFaultResponse::Continue;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue