Skip to content

Commit a4abeaf

Browse files
lyan3wenlingz
authored andcommitted
hv: enforce no interrupt to RT VM via vlapic once lapic pt
Because we depend on guest OS to switch x2apic mode to enable lapic pass-thru, vlapic is working at the early stage of booting, eg: in virtual boot loader. After lapic pass-thru enabled, no interrupt should be injected via vlapic any more. This commit resets the vlapic to clear the pending status and adds ptapic_ops to enforce that no more interrupt accepted/injected via vlapic. Tracked-On: #3227 Signed-off-by: Yan, Like <like.yan@intel.com>
1 parent 97f6097 commit a4abeaf

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

hypervisor/arch/x86/guest/vlapic.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,6 +1699,39 @@ uint64_t vlapic_get_apicbase(const struct acrn_vlapic *vlapic)
16991699
return vlapic->msr_apicbase;
17001700
}
17011701

1702+
static void ptapic_accept_intr(struct acrn_vlapic *vlapic, uint32_t vector, __unused bool level)
1703+
{
1704+
pr_err("Invalid op %s, VM%u, vCPU%u, vector %u", __func__,
1705+
vlapic->vm->vm_id, vlapic->vcpu->vcpu_id, vector);
1706+
}
1707+
1708+
static bool ptapic_inject_intr(struct acrn_vlapic *vlapic,
1709+
__unused bool guest_irq_enabled, __unused bool injected)
1710+
{
1711+
pr_err("Invalid op %s, VM%u, vCPU%u", __func__, vlapic->vm->vm_id, vlapic->vcpu->vcpu_id);
1712+
return injected;
1713+
}
1714+
1715+
static bool ptapic_has_pending_delivery_intr(__unused struct acrn_vcpu *vcpu)
1716+
{
1717+
return false;
1718+
}
1719+
1720+
static bool ptapic_invalid(__unused uint32_t offset)
1721+
{
1722+
return false;
1723+
}
1724+
1725+
static const struct acrn_apicv_ops ptapic_ops = {
1726+
.accept_intr = ptapic_accept_intr,
1727+
.inject_intr = ptapic_inject_intr,
1728+
.has_pending_delivery_intr = ptapic_has_pending_delivery_intr,
1729+
.apic_read_access_may_valid = ptapic_invalid,
1730+
.apic_write_access_may_valid = ptapic_invalid,
1731+
.x2apic_read_msr_may_valid = ptapic_invalid,
1732+
.x2apic_write_msr_may_valid = ptapic_invalid,
1733+
};
1734+
17021735
int32_t vlapic_set_apicbase(struct acrn_vlapic *vlapic, uint64_t new)
17031736
{
17041737
int32_t ret = 0;
@@ -1722,6 +1755,9 @@ int32_t vlapic_set_apicbase(struct acrn_vlapic *vlapic, uint64_t new)
17221755
if (change_in_vlapic_mode) {
17231756
if ((new & APICBASE_LAPIC_MODE) ==
17241757
(APICBASE_XAPIC | APICBASE_X2APIC)) {
1758+
if (is_lapic_pt_configured(vcpu->vm)) {
1759+
vlapic_reset(vlapic, &ptapic_ops);
1760+
}
17251761
vlapic->msr_apicbase = new;
17261762
vlapic_build_x2apic_id(vlapic);
17271763
switch_apicv_mode_x2apic(vlapic->vcpu);

0 commit comments

Comments
 (0)