瀏覽代碼

x86: Simplify region unmapping a bit

Add PageTableEntry::clear() to zero out a whole PTE, and use that for
unmapping instead of clearing individual fields.
Andreas Kling 5 年之前
父節點
當前提交
a9d7902bb7
共有 3 個文件被更改,包括 5 次插入8 次删除
  1. 2 0
      Kernel/Arch/i386/CPU.h
  2. 1 2
      Kernel/VM/MemoryManager.cpp
  3. 2 6
      Kernel/VM/Region.cpp

+ 2 - 0
Kernel/Arch/i386/CPU.h

@@ -215,6 +215,8 @@ public:
     bool is_execute_disabled() const { return raw() & NoExecute; }
     void set_execute_disabled(bool b) { set_bit(NoExecute, b); }
 
+    void clear() { m_raw = 0; }
+
     void set_bit(u64 bit, bool value)
     {
         if (value)

+ 1 - 2
Kernel/VM/MemoryManager.cpp

@@ -559,8 +559,7 @@ void MemoryManager::unquickmap_page()
     ASSERT_INTERRUPTS_DISABLED();
     ASSERT(m_quickmap_in_use);
     auto& pte = boot_pd3_pde1023_pt[0];
-    pte.set_physical_page_base(0);
-    pte.set_present(false);
+    pte.clear();
     flush_tlb(VirtualAddress(0xffe00000));
     m_quickmap_in_use = false;
 }

+ 2 - 6
Kernel/VM/Region.cpp

@@ -255,8 +255,7 @@ void Region::map_individual_page_impl(size_t page_index)
     auto& pte = MM.ensure_pte(*m_page_directory, page_vaddr);
     auto& physical_page = vmobject().physical_pages()[first_page_index() + page_index];
     if (!physical_page) {
-        pte.set_physical_page_base(0);
-        pte.set_present(false);
+        pte.clear();
     } else {
         pte.set_cache_disabled(!m_cacheable);
         pte.set_physical_page_base(physical_page->paddr().get());
@@ -290,10 +289,7 @@ void Region::unmap(ShouldDeallocateVirtualMemoryRange deallocate_range)
     for (size_t i = 0; i < page_count(); ++i) {
         auto vaddr = this->vaddr().offset(i * PAGE_SIZE);
         auto& pte = MM.ensure_pte(*m_page_directory, vaddr);
-        pte.set_physical_page_base(0);
-        pte.set_present(false);
-        pte.set_writable(false);
-        pte.set_user_allowed(false);
+        pte.clear();
         MM.flush_tlb(vaddr);
 #ifdef MM_DEBUG
         auto& physical_page = vmobject().physical_pages()[first_page_index() + i];