Page MenuHomeFreeBSD

D13573.id36864.diff
No OneTemporary

D13573.id36864.diff

Index: sys/amd64/vmm/intel/vmx.c
===================================================================
--- sys/amd64/vmm/intel/vmx.c
+++ sys/amd64/vmm/intel/vmx.c
@@ -3174,9 +3174,29 @@
pir_desc = vlapic_vtx->pir_desc;
pending = atomic_load_acq_long(&pir_desc->pending);
- if (!pending)
- return (0); /* common case */
+ if (!pending) {
+ /*
+ * While a virtual interrupt may have already been
+ * processed the actual delivery maybe pending the
+ * interruptibility of the guest. Recognize a pending
+ * interrupt by reevaluating virtual interrupts
+ * following Section 29.2.1 in the Intel SDM Volume 3.
+ */
+ uint64_t val;
+ uint8_t rvi, ppr;
+ vmx_getreg(vlapic_vtx->vmx, vlapic->vcpuid,
+ VMCS_IDENT(VMCS_GUEST_INTR_STATUS), &val);
+ rvi = val & 0xf0;
+ lapic = vlapic->apic_page;
+ ppr = lapic->ppr & 0xf0;
+ if (rvi > ppr) {
+ return (1);
+ }
+
+ return (0);
+ }
+
/*
* If there is an interrupt pending then it will be recognized only
* if its priority is greater than the processor priority.

File Metadata

Mime Type
text/plain
Expires
Sun, May 24, 3:44 PM (7 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33477921
Default Alt Text
D13573.id36864.diff (1 KB)

Event Timeline