|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1] x86/nestedsvm: write back V_NMI and V_NMI_MASK on nested #VMEXIT
From: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>
With V_NMI_ENABLE set, the processor clears V_NMI and sets V_NMI_MASK when
it takes the virtual NMI, and writes both back to the VMCB on #VMEXIT
(APM vol.2 15.21.10).
nsvm_vmcb_prepare4vmexit() only propagated V_TPR, V_IRQ and (conditionally)
V_GIF from the L2 shadow VMCB into vmcb12. V_NMI and V_NMI_MASK were never
copied back, so L1 kept seeing whatever it had last written, regardless of
what happened in L2.
Copy both back when L1 has enabled vNMI for its guest.
Signed-off-by: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>
---
xen/arch/x86/hvm/svm/nestedsvm.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index faacfe007832..ecd89eb43f06 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1027,12 +1027,18 @@ nsvm_vmcb_prepare4vmexit(struct vcpu *v, struct
cpu_user_regs *regs)
/*
* Virtual Interrupts. #VMEXIT writes back V_TPR and V_IRQ (APM vol.2
* 15.6); the remaining fields do not change. Copy vGIF back only if
- * enabled in L1.
+ * enabled in L1. With vNMI enabled, #VMEXIT also writes back V_NMI and
+ * V_NMI_MASK (APM vol.2 15.21.10).
*/
ns_vmcb->_vintr.fields.tpr = n2vmcb->_vintr.fields.tpr;
ns_vmcb->_vintr.fields.irq = n2vmcb->_vintr.fields.irq;
if ( ns_vmcb->_vintr.fields.vgif_enable )
ns_vmcb->_vintr.fields.vgif = n2vmcb->_vintr.fields.vgif;
+ if ( ns_vmcb->_vintr.fields.vnmi_enable )
+ {
+ ns_vmcb->_vintr.fields.vnmi_pending =
n2vmcb->_vintr.fields.vnmi_pending;
+ ns_vmcb->_vintr.fields.vnmi_blocking =
n2vmcb->_vintr.fields.vnmi_blocking;
+ }
/* Interrupt state */
ns_vmcb->int_stat = n2vmcb->int_stat;
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |