diff --git a/kernel/arch/i686/PageTable.cpp b/kernel/arch/i686/PageTable.cpp index 9073df2a..90a35bc8 100644 --- a/kernel/arch/i686/PageTable.cpp +++ b/kernel/arch/i686/PageTable.cpp @@ -497,13 +497,13 @@ namespace Kernel return true; } - bool PageTable::reserve_page(vaddr_t vaddr, bool only_free) + bool PageTable::reserve_page(vaddr_t vaddr, bool only_free, bool send_smp_message) { SpinLockGuard _(m_lock); ASSERT(vaddr % PAGE_SIZE == 0); if (only_free && !is_page_free(vaddr)) return false; - map_page_at(0, vaddr, Flags::Reserved); + map_page_at(0, vaddr, Flags::Reserved, MemoryType::Normal, send_smp_message); return true; } @@ -517,7 +517,14 @@ namespace Kernel if (only_free && !is_range_free(vaddr, bytes)) return false; for (size_t offset = 0; offset < bytes; offset += PAGE_SIZE) - reserve_page(vaddr + offset); + reserve_page(vaddr + offset, true, false); + Processor::broadcast_smp_message({ + .type = Processor::SMPMessage::Type::FlushTLB, + .flush_tlb = { + .vaddr = vaddr, + .page_count = bytes / PAGE_SIZE, + } + }); return true; } diff --git a/kernel/arch/x86_64/PageTable.cpp b/kernel/arch/x86_64/PageTable.cpp index d844a3ab..6cd16d62 100644 --- a/kernel/arch/x86_64/PageTable.cpp +++ b/kernel/arch/x86_64/PageTable.cpp @@ -814,13 +814,13 @@ namespace Kernel return page_data & s_page_addr_mask; } - bool PageTable::reserve_page(vaddr_t vaddr, bool only_free) + bool PageTable::reserve_page(vaddr_t vaddr, bool only_free, bool send_smp_message) { SpinLockGuard _(m_lock); ASSERT(vaddr % PAGE_SIZE == 0); if (only_free && !is_page_free(vaddr)) return false; - map_page_at(0, vaddr, Flags::Reserved); + map_page_at(0, vaddr, Flags::Reserved, MemoryType::Normal, send_smp_message); return true; } @@ -834,7 +834,14 @@ namespace Kernel if (only_free && !is_range_free(vaddr, bytes)) return false; for (size_t offset = 0; offset < bytes; offset += PAGE_SIZE) - reserve_page(vaddr + offset); + reserve_page(vaddr + offset, true, false); + Processor::broadcast_smp_message({ + .type = Processor::SMPMessage::Type::FlushTLB, + .flush_tlb = { + .vaddr = vaddr, + .page_count = bytes / PAGE_SIZE, + } + }); return true; } diff --git a/kernel/include/kernel/Memory/PageTable.h b/kernel/include/kernel/Memory/PageTable.h index d6a4ca31..21f8f852 100644 --- a/kernel/include/kernel/Memory/PageTable.h +++ b/kernel/include/kernel/Memory/PageTable.h @@ -112,7 +112,7 @@ namespace Kernel bool is_page_free(vaddr_t) const; bool is_range_free(vaddr_t, size_t bytes) const; - bool reserve_page(vaddr_t, bool only_free = true); + bool reserve_page(vaddr_t, bool only_free = true, bool send_smp_message = true); bool reserve_range(vaddr_t, size_t bytes, bool only_free = true); vaddr_t reserve_free_page(vaddr_t first_address, vaddr_t last_address = UINTPTR_MAX);