Skip to content

Commit c318e45

Browse files
committed
Refactor sipi and init some
1 parent f467f3c commit c318e45

File tree

3 files changed

+47
-63
lines changed

3 files changed

+47
-63
lines changed

Diff for: openhcl/virt_mshv_vtl/src/processor/hardware_cvm/apic.rs

+22-5
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,27 @@ use crate::processor::HardwareIsolatedBacking;
88
use crate::UhProcessor;
99
use hcl::GuestVtl;
1010
use virt::vp::MpState;
11+
use virt::Processor;
1112
use virt_support_apic::ApicWork;
1213

1314
pub(crate) trait ApicBacking<'b, B: HardwareIsolatedBacking> {
1415
fn vp(&mut self) -> &mut UhProcessor<'b, B>;
1516

16-
fn handle_init(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError>;
17-
fn handle_sipi(&mut self, vtl: GuestVtl, vector: u8) -> Result<(), UhRunVpError>;
17+
fn handle_init(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
18+
let vp_info = self.vp().inner.vp_info;
19+
let mut access = self.vp().access_state(vtl.into());
20+
virt::vp::x86_init(&mut access, &vp_info).map_err(UhRunVpError::State)?;
21+
Ok(())
22+
}
23+
24+
fn handle_sipi(&mut self, vtl: GuestVtl, base: u64, selector: u16) -> Result<(), UhRunVpError>;
1825
fn handle_nmi(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError>;
1926
fn handle_interrupt(&mut self, vtl: GuestVtl, vector: u8) -> Result<(), UhRunVpError>;
20-
fn handle_extint(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError>;
27+
28+
fn handle_extint(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
29+
tracelimit::warn_ratelimited!(?vtl, "extint not supported");
30+
Ok(())
31+
}
2132
}
2233

2334
pub(crate) fn poll_apic_core<'b, B: HardwareIsolatedBacking, T: ApicBacking<'b, B>>(
@@ -53,13 +64,19 @@ pub(crate) fn poll_apic_core<'b, B: HardwareIsolatedBacking, T: ApicBacking<'b,
5364
// INIT and SIPI are quite cold.
5465
if init {
5566
if !*apic_backing.vp().inner.hcvm_vtl1_enabled.lock() {
67+
debug_assert_eq!(vtl, GuestVtl::Vtl0);
5668
apic_backing.handle_init(vtl)?;
5769
}
5870
}
5971

6072
if let Some(vector) = sipi {
61-
if !*apic_backing.vp().inner.hcvm_vtl1_enabled.lock() {
62-
apic_backing.handle_sipi(vtl, vector)?;
73+
if apic_backing.vp().backing.cvm_state_mut().lapics[vtl].activity == MpState::WaitForSipi {
74+
if !*apic_backing.vp().inner.hcvm_vtl1_enabled.lock() {
75+
debug_assert_eq!(vtl, GuestVtl::Vtl0);
76+
let base = (vector as u64) << 12;
77+
let selector = (vector as u16) << 8;
78+
apic_backing.handle_sipi(vtl, base, selector)?;
79+
}
6380
}
6481
}
6582

Diff for: openhcl/virt_mshv_vtl/src/processor/snp/mod.rs

+10-26
Original file line numberDiff line numberDiff line change
@@ -753,33 +753,17 @@ impl<'b> hardware_cvm::apic::ApicBacking<'b, SnpBacked> for UhProcessor<'b, SnpB
753753
Ok(())
754754
}
755755

756-
fn handle_init(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
757-
assert_eq!(vtl, GuestVtl::Vtl0);
758-
let vp_info = self.inner.vp_info;
759-
let mut access = self.access_state(vtl.into());
760-
vp::x86_init(&mut access, &vp_info).map_err(UhRunVpError::State)?;
761-
Ok(())
762-
}
763-
764-
fn handle_sipi(&mut self, vtl: GuestVtl, vector: u8) -> Result<(), UhRunVpError> {
765-
assert_eq!(vtl, GuestVtl::Vtl0);
766-
if self.backing.cvm.lapics[vtl].activity == MpState::WaitForSipi {
767-
let mut vmsa = self.runner.vmsa_mut(vtl);
768-
let address = (vector as u64) << 12;
769-
vmsa.set_cs(hv_seg_to_snp(&hvdef::HvX64SegmentRegister {
770-
base: address,
771-
limit: 0xffff,
772-
selector: (address >> 4) as u16,
773-
attributes: 0x9b,
774-
}));
775-
vmsa.set_rip(0);
776-
self.backing.cvm.lapics[vtl].activity = MpState::Running;
777-
}
778-
Ok(())
779-
}
756+
fn handle_sipi(&mut self, vtl: GuestVtl, base: u64, selector: u16) -> Result<(), UhRunVpError> {
757+
let mut vmsa = self.runner.vmsa_mut(vtl);
758+
vmsa.set_cs(hv_seg_to_snp(&hvdef::HvX64SegmentRegister {
759+
base,
760+
limit: 0xffff,
761+
selector,
762+
attributes: 0x9b,
763+
}));
764+
vmsa.set_rip(0);
765+
self.backing.cvm.lapics[vtl].activity = MpState::Running;
780766

781-
fn handle_extint(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
782-
tracelimit::warn_ratelimited!(?vtl, "extint not supported");
783767
Ok(())
784768
}
785769
}

Diff for: openhcl/virt_mshv_vtl/src/processor/tdx/mod.rs

+15-32
Original file line numberDiff line numberDiff line change
@@ -1205,39 +1205,22 @@ impl<'b> hardware_cvm::apic::ApicBacking<'b, TdxBacked> for TdxApicScanner<'_, '
12051205
Ok(())
12061206
}
12071207

1208-
fn handle_init(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
1209-
let vp_info = self.vp.inner.vp_info;
1210-
{
1211-
let mut access = self.vp.access_state(vtl.into());
1212-
vp::x86_init(&mut access, &vp_info).map_err(UhRunVpError::State)?;
1213-
}
1214-
Ok(())
1215-
}
1216-
1217-
fn handle_sipi(&mut self, vtl: GuestVtl, vector: u8) -> Result<(), UhRunVpError> {
1218-
if self.vp.backing.cvm.lapics[vtl].activity == MpState::WaitForSipi {
1219-
let address = (vector as u64) << 12;
1220-
self.vp
1221-
.write_segment(
1222-
vtl,
1223-
TdxSegmentReg::Cs,
1224-
SegmentRegister {
1225-
base: address,
1226-
limit: 0xffff,
1227-
selector: (address >> 4) as u16,
1228-
attributes: 0x9b,
1229-
},
1230-
)
1231-
.unwrap();
1232-
self.vp.runner.tdx_enter_guest_state_mut().rip = 0;
1233-
self.vp.backing.cvm.lapics[vtl].activity = MpState::Running;
1234-
}
1235-
1236-
Ok(())
1237-
}
1208+
fn handle_sipi(&mut self, vtl: GuestVtl, base: u64, selector: u16) -> Result<(), UhRunVpError> {
1209+
self.vp
1210+
.write_segment(
1211+
vtl,
1212+
TdxSegmentReg::Cs,
1213+
SegmentRegister {
1214+
base,
1215+
limit: 0xffff,
1216+
selector,
1217+
attributes: 0x9b,
1218+
},
1219+
)
1220+
.unwrap();
1221+
self.vp.runner.tdx_enter_guest_state_mut().rip = 0;
1222+
self.vp.backing.cvm.lapics[vtl].activity = MpState::Running;
12381223

1239-
fn handle_extint(&mut self, vtl: GuestVtl) -> Result<(), UhRunVpError> {
1240-
tracelimit::warn_ratelimited!(?vtl, "extint not supported");
12411224
Ok(())
12421225
}
12431226
}

0 commit comments

Comments
 (0)