From ff6b43734c9750b1319e62f60bae170df5313771 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Mon, 29 Nov 2021 21:18:59 +0200 Subject: [PATCH] Kernel: Add Region::clear_to_zero This helper method can be used to quickly and efficiently zero out a region. --- Kernel/Memory/Region.cpp | 13 +++++++++++++ Kernel/Memory/Region.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/Kernel/Memory/Region.cpp b/Kernel/Memory/Region.cpp index 1e89f8dd84..8bb78447af 100644 --- a/Kernel/Memory/Region.cpp +++ b/Kernel/Memory/Region.cpp @@ -293,6 +293,19 @@ void Region::remap() TODO(); } +void Region::clear_to_zero() +{ + VERIFY(vmobject().is_anonymous()); + SpinlockLocker locker(vmobject().m_lock); + for (auto i = 0u; i < page_count(); ++i) { + auto page = physical_page_slot(i); + VERIFY(page); + if (page->is_shared_zero_page()) + continue; + page = MM.shared_zero_page(); + } +} + PageFaultResponse Region::handle_fault(PageFault const& fault) { auto page_index_in_region = page_index_from_address(fault.vaddr()); diff --git a/Kernel/Memory/Region.h b/Kernel/Memory/Region.h index 2f1f8af8e0..8a86317b40 100644 --- a/Kernel/Memory/Region.h +++ b/Kernel/Memory/Region.h @@ -182,6 +182,8 @@ public: void remap(); + void clear_to_zero(); + [[nodiscard]] bool is_syscall_region() const { return m_syscall_region; } void set_syscall_region(bool b) { m_syscall_region = b; }