Enable global page and add a global TLB flushing function

This commit is contained in:
Zhang Junyang
2024-05-05 22:02:43 +08:00
committed by Tate, Hongliang Tian
parent 989970429a
commit cf5cfb3475
3 changed files with 21 additions and 1 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -79,6 +79,7 @@ pub fn init() {
.get()
.unwrap()
.activate_unchecked();
crate::arch::mm::tlb_flush_all_including_global();
}
invoke_ffi_init_funcs();
}