Skip to content

Commit 6a25a01

Browse files
committed
feat: 添加 setup_current_cpu 方法以设置当前 CPU 的 VMID 并处理 TLB 失效
1 parent aa0347e commit 6a25a01

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

src/vcpu.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::fmt::Arguments;
2+
13
use aarch64_cpu::registers::*;
24
use axerrno::AxResult;
35
use axvm_types::{
@@ -88,23 +90,43 @@ impl Aarch64VCpu {
8890
}
8991

9092
pub fn set_dtb_addr(&mut self, dtb_addr: GuestPhysAddr) -> AxResult {
91-
debug!("set vcpu dtb addr:{dtb_addr:?}");
93+
debug!("vCPU{} set vcpu dtb addr:{dtb_addr:?}", self.mpidr);
9294
self.ctx.set_argument(dtb_addr.as_usize());
9395
Ok(())
9496
}
9597

9698
pub fn set_entry(&mut self, entry: GuestPhysAddr) -> AxResult {
97-
debug!("set vcpu entry:{entry:?}");
99+
debug!("vCPU{} set vcpu entry:{entry:?}", self.mpidr);
98100
self.set_elr(entry.as_usize());
99101
Ok(())
100102
}
101103

102104
pub fn set_ept_root(&mut self, ept_root: HostPhysAddr) -> AxResult {
103-
debug!("set vcpu ept root:{ept_root:#x}");
105+
debug!("vCPU{} set vcpu ept root:{ept_root:#x}", self.mpidr);
104106
self.guest_system_regs.vttbr_el2 = ept_root.as_usize() as u64;
105107
Ok(())
106108
}
107109

110+
pub fn setup_current_cpu(&mut self, vmid: usize) -> AxResult {
111+
// Set VMID then invalidate stage-2 TLB for this VMID to avoid stale translations.
112+
let vmid_mask: u64 = 0xffff << 48;
113+
let mut vttbr = self.guest_system_regs.vttbr_el2;
114+
vttbr = (vttbr & !vmid_mask) | ((vmid as u64 & 0xffff) << 48);
115+
VTTBR_EL2.set(vttbr);
116+
117+
unsafe {
118+
core::arch::asm!(
119+
"dsb ishst", // ensure VTTBR write visible before TLB invalidation
120+
"tlbi vmalls12e1is", // invalidate stage-2 by VMID (inner-shareable)
121+
"dsb ish", // ensure completion of invalidation
122+
"isb", // sync context
123+
options(nostack, preserves_flags)
124+
);
125+
}
126+
127+
Ok(())
128+
}
129+
108130
pub fn run(&mut self) -> AxResult<AxVCpuExitReason> {
109131
// Run guest.
110132
let exit_reson = unsafe {

0 commit comments

Comments
 (0)