From cf5cfb34755fe6813cb13d6744486fd875e9a040 Mon Sep 17 00:00:00 2001 From: Zhang Junyang Date: Sun, 5 May 2024 22:02:43 +0800 Subject: [PATCH] Enable global page and add a global TLB flushing function --- framework/aster-frame/src/arch/x86/mm/mod.rs | 15 +++++++++++++++ framework/aster-frame/src/arch/x86/mod.rs | 6 +++++- framework/aster-frame/src/lib.rs | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/framework/aster-frame/src/arch/x86/mm/mod.rs b/framework/aster-frame/src/arch/x86/mm/mod.rs index be7add079..f1d611fc4 100644 --- a/framework/aster-frame/src/arch/x86/mm/mod.rs +++ b/framework/aster-frame/src/arch/x86/mm/mod.rs @@ -60,6 +60,21 @@ pub fn tlb_flush(vaddr: Vaddr) { tlb::flush(VirtAddr::new(vaddr as u64)); } +pub fn tlb_flush_all_including_global() { + // Safety: updates to CR4 here only change the global-page bit, the side effect + // is only to invalidate the TLB, which doesn't affect the memory safety. + unsafe { + // To invalidate all entries, including global-page + // entries, disable global-page extensions (CR4.PGE=0). + x86_64::registers::control::Cr4::update(|cr4| { + *cr4 -= x86_64::registers::control::Cr4Flags::PAGE_GLOBAL; + }); + x86_64::registers::control::Cr4::update(|cr4| { + *cr4 |= x86_64::registers::control::Cr4Flags::PAGE_GLOBAL; + }); + } +} + #[derive(Clone, Copy, Pod)] #[repr(C)] pub struct PageTableEntry(usize); diff --git a/framework/aster-frame/src/arch/x86/mod.rs b/framework/aster-frame/src/arch/x86/mod.rs index 5d6437685..460e0f62f 100644 --- a/framework/aster-frame/src/arch/x86/mod.rs +++ b/framework/aster-frame/src/arch/x86/mod.rs @@ -77,7 +77,11 @@ pub fn read_tsc() -> u64 { fn enable_common_cpu_features() { use x86_64::registers::{control::Cr4Flags, model_specific::EferFlags, xcontrol::XCr0Flags}; let mut cr4 = x86_64::registers::control::Cr4::read(); - cr4 |= Cr4Flags::FSGSBASE | Cr4Flags::OSXSAVE | Cr4Flags::OSFXSR | Cr4Flags::OSXMMEXCPT_ENABLE; + cr4 |= Cr4Flags::FSGSBASE + | Cr4Flags::OSXSAVE + | Cr4Flags::OSFXSR + | Cr4Flags::OSXMMEXCPT_ENABLE + | Cr4Flags::PAGE_GLOBAL; unsafe { x86_64::registers::control::Cr4::write(cr4); } diff --git a/framework/aster-frame/src/lib.rs b/framework/aster-frame/src/lib.rs index 9982f95bf..8ee364f3e 100644 --- a/framework/aster-frame/src/lib.rs +++ b/framework/aster-frame/src/lib.rs @@ -79,6 +79,7 @@ pub fn init() { .get() .unwrap() .activate_unchecked(); + crate::arch::mm::tlb_flush_all_including_global(); } invoke_ffi_init_funcs(); }