diff --git a/ostd/src/arch/x86/tdx_guest.rs b/ostd/src/arch/x86/tdx_guest.rs
index 926942854..535614104 100644
--- a/ostd/src/arch/x86/tdx_guest.rs
+++ b/ostd/src/arch/x86/tdx_guest.rs
@@ -6,9 +6,10 @@ use trapframe::TrapFrame;
use crate::{
mm::{
- kspace::{BOOT_PAGE_TABLE, KERNEL_PAGE_TABLE},
+ kspace::KERNEL_PAGE_TABLE,
paddr_to_vaddr,
page_prop::{PageProperty, PrivilegedPageFlags as PrivFlags},
+ page_table::boot_pt,
PAGE_SIZE,
},
prelude::Paddr,
@@ -48,15 +49,12 @@ pub unsafe fn unprotect_gpa_range(gpa: Paddr, page_num: usize) -> Result<(), Pag
priv_flags: prop.priv_flags | PrivFlags::SHARED,
}
};
- {
- let mut boot_pt_lock = BOOT_PAGE_TABLE.lock();
- if let Some(boot_pt) = boot_pt_lock.as_mut() {
- for i in 0..page_num {
- let vaddr = paddr_to_vaddr(gpa + i * PAGE_SIZE);
- boot_pt.protect_base_page(vaddr, protect_op);
- }
+ let _ = boot_pt::with_borrow(|boot_pt| {
+ for i in 0..page_num {
+ let vaddr = paddr_to_vaddr(gpa + i * PAGE_SIZE);
+ boot_pt.protect_base_page(vaddr, protect_op);
}
- }
+ });
// Protect the page in the kernel page table.
let pt = KERNEL_PAGE_TABLE.get().unwrap();
let vaddr = paddr_to_vaddr(gpa);
@@ -93,15 +91,12 @@ pub unsafe fn protect_gpa_range(gpa: Paddr, page_num: usize) -> Result<(), PageC
priv_flags: prop.priv_flags - PrivFlags::SHARED,
}
};
- {
- let mut boot_pt_lock = BOOT_PAGE_TABLE.lock();
- if let Some(boot_pt) = boot_pt_lock.as_mut() {
- for i in 0..page_num {
- let vaddr = paddr_to_vaddr(gpa + i * PAGE_SIZE);
- boot_pt.protect_base_page(vaddr, protect_op);
- }
+ let _ = boot_pt::with_borrow(|boot_pt| {
+ for i in 0..page_num {
+ let vaddr = paddr_to_vaddr(gpa + i * PAGE_SIZE);
+ boot_pt.protect_base_page(vaddr, protect_op);
}
- }
+ });
// Protect the page in the kernel page table.
let pt = KERNEL_PAGE_TABLE.get().unwrap();
let vaddr = paddr_to_vaddr(gpa);
diff --git a/ostd/src/boot/smp.rs b/ostd/src/boot/smp.rs
index 33a52daa9..6c4af1429 100644
--- a/ostd/src/boot/smp.rs
+++ b/ostd/src/boot/smp.rs
@@ -125,6 +125,11 @@ fn ap_early_entry(local_apic_id: u32) -> ! {
}
crate::arch::irq::enable_local();
+ // SAFETY: this function is only called once on this AP.
+ unsafe {
+ crate::mm::kspace::activate_kernel_page_table();
+ }
+
// Mark the AP as started.
let ap_boot_info = AP_BOOT_INFO.get().unwrap();
ap_boot_info
diff --git a/ostd/src/lib.rs b/ostd/src/lib.rs
index b35bb2455..79b6d971b 100644
--- a/ostd/src/lib.rs
+++ b/ostd/src/lib.rs
@@ -82,7 +82,6 @@ pub unsafe fn init() {
logger::init();
mm::page::allocator::init();
- mm::kspace::init_boot_page_table();
mm::kspace::init_kernel_page_table(mm::init_page_meta());
mm::misc_init();
@@ -93,7 +92,10 @@ pub unsafe fn init() {
bus::init();
- mm::kspace::activate_kernel_page_table();
+ // SAFETY: This function is called only once on the BSP.
+ unsafe {
+ mm::kspace::activate_kernel_page_table();
+ }
arch::irq::enable_local();
diff --git a/ostd/src/mm/kspace.rs b/ostd/src/mm/kspace.rs
index 760e73f5b..a9075d17e 100644
--- a/ostd/src/mm/kspace.rs
+++ b/ostd/src/mm/kspace.rs
@@ -39,7 +39,7 @@
//! 39 bits or 57 bits, the memory space just adjust proportionally.
use alloc::vec::Vec;
-use core::{mem::ManuallyDrop, ops::Range};
+use core::ops::Range;
use align_ext::AlignExt;
use log::info;
@@ -52,13 +52,10 @@ use super::{
Page,
},
page_prop::{CachePolicy, PageFlags, PageProperty, PrivilegedPageFlags},
- page_table::{boot_pt::BootPageTable, KernelMode, PageTable},
+ page_table::{KernelMode, PageTable},
MemoryRegionType, Paddr, PagingConstsTrait, Vaddr, PAGE_SIZE,
};
-use crate::{
- arch::mm::{PageTableEntry, PagingConsts},
- sync::SpinLock,
-};
+use crate::arch::mm::{PageTableEntry, PagingConsts};
/// The shortest supported address width is 39 bits. And the literal
/// values are written for 48 bits address width. Adjust the values
@@ -101,12 +98,6 @@ pub fn paddr_to_vaddr(pa: Paddr) -> usize {
pa + LINEAR_MAPPING_BASE_VADDR
}
-/// The boot page table instance.
-///
-/// It is used in the initialization phase before [`KERNEL_PAGE_TABLE`] is activated.
-/// Since we want dropping the boot page table unsafe, it is wrapped in a [`ManuallyDrop`].
-pub static BOOT_PAGE_TABLE: SpinLock