mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-25 02:13:24 +00:00
Enable global page and add a global TLB flushing function
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
989970429a
commit
cf5cfb3475
@ -60,6 +60,21 @@ pub fn tlb_flush(vaddr: Vaddr) {
|
|||||||
tlb::flush(VirtAddr::new(vaddr as u64));
|
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)]
|
#[derive(Clone, Copy, Pod)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct PageTableEntry(usize);
|
pub struct PageTableEntry(usize);
|
||||||
|
@ -77,7 +77,11 @@ pub fn read_tsc() -> u64 {
|
|||||||
fn enable_common_cpu_features() {
|
fn enable_common_cpu_features() {
|
||||||
use x86_64::registers::{control::Cr4Flags, model_specific::EferFlags, xcontrol::XCr0Flags};
|
use x86_64::registers::{control::Cr4Flags, model_specific::EferFlags, xcontrol::XCr0Flags};
|
||||||
let mut cr4 = x86_64::registers::control::Cr4::read();
|
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 {
|
unsafe {
|
||||||
x86_64::registers::control::Cr4::write(cr4);
|
x86_64::registers::control::Cr4::write(cr4);
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,7 @@ pub fn init() {
|
|||||||
.get()
|
.get()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.activate_unchecked();
|
.activate_unchecked();
|
||||||
|
crate::arch::mm::tlb_flush_all_including_global();
|
||||||
}
|
}
|
||||||
invoke_ffi_init_funcs();
|
invoke_ffi_init_funcs();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user