mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-22 05:30:24 +00:00
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>
This commit is contained in:
parent
97f6097f04
commit
a4abeaf980
@ -1699,6 +1699,39 @@ uint64_t vlapic_get_apicbase(const struct acrn_vlapic *vlapic)
|
|||||||
return vlapic->msr_apicbase;
|
return vlapic->msr_apicbase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ptapic_accept_intr(struct acrn_vlapic *vlapic, uint32_t vector, __unused bool level)
|
||||||
|
{
|
||||||
|
pr_err("Invalid op %s, VM%u, vCPU%u, vector %u", __func__,
|
||||||
|
vlapic->vm->vm_id, vlapic->vcpu->vcpu_id, vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ptapic_inject_intr(struct acrn_vlapic *vlapic,
|
||||||
|
__unused bool guest_irq_enabled, __unused bool injected)
|
||||||
|
{
|
||||||
|
pr_err("Invalid op %s, VM%u, vCPU%u", __func__, vlapic->vm->vm_id, vlapic->vcpu->vcpu_id);
|
||||||
|
return injected;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ptapic_has_pending_delivery_intr(__unused struct acrn_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ptapic_invalid(__unused uint32_t offset)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct acrn_apicv_ops ptapic_ops = {
|
||||||
|
.accept_intr = ptapic_accept_intr,
|
||||||
|
.inject_intr = ptapic_inject_intr,
|
||||||
|
.has_pending_delivery_intr = ptapic_has_pending_delivery_intr,
|
||||||
|
.apic_read_access_may_valid = ptapic_invalid,
|
||||||
|
.apic_write_access_may_valid = ptapic_invalid,
|
||||||
|
.x2apic_read_msr_may_valid = ptapic_invalid,
|
||||||
|
.x2apic_write_msr_may_valid = ptapic_invalid,
|
||||||
|
};
|
||||||
|
|
||||||
int32_t vlapic_set_apicbase(struct acrn_vlapic *vlapic, uint64_t new)
|
int32_t vlapic_set_apicbase(struct acrn_vlapic *vlapic, uint64_t new)
|
||||||
{
|
{
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
@ -1722,6 +1755,9 @@ int32_t vlapic_set_apicbase(struct acrn_vlapic *vlapic, uint64_t new)
|
|||||||
if (change_in_vlapic_mode) {
|
if (change_in_vlapic_mode) {
|
||||||
if ((new & APICBASE_LAPIC_MODE) ==
|
if ((new & APICBASE_LAPIC_MODE) ==
|
||||||
(APICBASE_XAPIC | APICBASE_X2APIC)) {
|
(APICBASE_XAPIC | APICBASE_X2APIC)) {
|
||||||
|
if (is_lapic_pt_configured(vcpu->vm)) {
|
||||||
|
vlapic_reset(vlapic, &ptapic_ops);
|
||||||
|
}
|
||||||
vlapic->msr_apicbase = new;
|
vlapic->msr_apicbase = new;
|
||||||
vlapic_build_x2apic_id(vlapic);
|
vlapic_build_x2apic_id(vlapic);
|
||||||
switch_apicv_mode_x2apic(vlapic->vcpu);
|
switch_apicv_mode_x2apic(vlapic->vcpu);
|
||||||
|
Loading…
Reference in New Issue
Block a user