mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 16:18:12 +00:00
Kernel: On kernel NP fault, always copy into *active* page directory
If we were using a ProcessPagingScope to temporarily go into another process's page tables, things would fall apart when hitting a kernel NP fault, since we'd clone the kernel page directory entry into the *currently active process's* page directory rather than cloning it into the *currently active* page directory.
This commit is contained in:
parent
2d7a993db3
commit
da6c8fe3f8
1 changed files with 5 additions and 3 deletions
|
@ -407,9 +407,11 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
|
|||
ASSERT(fault.vaddr() != m_quickmap_addr);
|
||||
if (fault.is_not_present() && fault.vaddr().get() >= 0xc0000000) {
|
||||
u32 page_directory_index = (fault.vaddr().get() >> 22) & 0x3ff;
|
||||
if (kernel_page_directory().entries()[page_directory_index].is_present()) {
|
||||
dbgprintf("NP(kernel): copying new kernel mapping for L%x into process\n", fault.vaddr().get());
|
||||
current->process().page_directory().entries()[page_directory_index].copy_from({}, kernel_page_directory().entries()[page_directory_index]);
|
||||
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);
|
||||
flush_tlb(fault.vaddr().page_base());
|
||||
return PageFaultResponse::Continue;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue