Browse Source

Kernel: Enable the x86 WP bit to catch invalid memory writes in ring 0

Setting this bit will cause the CPU to generate a page fault when
writing to read-only memory, even if we're executing in the kernel.

Seemingly the only change needed to make this work was to have the
inode-backed page fault handler use a temporary mapping for writing
the read-from-disk data into the newly-allocated physical page.
Andreas Kling 5 years ago
parent
commit
ae2d72377d
2 changed files with 6 additions and 3 deletions
  1. 1 1
      Kernel/VM/MemoryManager.cpp
  2. 5 2
      Kernel/VM/Region.cpp

+ 1 - 1
Kernel/VM/MemoryManager.cpp

@@ -174,7 +174,7 @@ void MemoryManager::initialize_paging()
     asm volatile("movl %%eax, %%cr3" ::"a"(kernel_page_directory().cr3()));
     asm volatile(
         "movl %%cr0, %%eax\n"
-        "orl $0x80000001, %%eax\n"
+        "orl $0x80010001, %%eax\n"
         "movl %%eax, %%cr0\n" ::
             : "%eax", "memory");
 

+ 5 - 2
Kernel/VM/Region.cpp

@@ -431,8 +431,11 @@ PageFaultResponse Region::handle_inode_fault(size_t page_index_in_region)
         kprintf("MM: handle_inode_fault was unable to allocate a physical page\n");
         return PageFaultResponse::ShouldCrash;
     }
-    remap_page(page_index_in_region);
-    u8* dest_ptr = vaddr().offset(page_index_in_region * PAGE_SIZE).as_ptr();
+
+    u8* dest_ptr = MM.quickmap_page(*vmobject_physical_page_entry);
     memcpy(dest_ptr, page_buffer, PAGE_SIZE);
+    MM.unquickmap_page();
+
+    remap_page(page_index_in_region);
     return PageFaultResponse::Continue;
 }