mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 09:53: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));
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -79,6 +79,7 @@ pub fn init() {
|
||||
.get()
|
||||
.unwrap()
|
||||
.activate_unchecked();
|
||||
crate::arch::mm::tlb_flush_all_including_global();
|
||||
}
|
||||
invoke_ffi_init_funcs();
|
||||
}
|
||||
|
Reference in New Issue
Block a user