[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2] x86/nestedsvm: write back V_NMI and V_NMI_MASK on nested #VMEXIT


  • To: andrew.cooper3@xxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: chunjie.zhu@xxxxxxxxxx
  • Date: Fri, 16 Oct 2026 15:06:11 +0800
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tCo/O8qV3DYeEsbKQVxj9TqqiACRExlHBv0HCth0tsY=; b=Wf7dqTU4lsbDn0gSO9+6FdTJSE4WX8YoaZyiLjTePWzGWyocX7sY05mKmemZBpIKlYh0xy9DyYDf4wTrY3zUAOseNoHs8lzVGzRN8u8JOkA+ARB5ID6BVBJ07LmVG9KQxYDdyCPtA8B3jUY7d5idDO85G590Uwz49W7vUxHbLqcDCYV/WPbngdxPgO0Dxr/OD30FYxb+XDmUaWzoHb36nbcradE6QMa+ufl9zl0c7eixryEJMwlzT9Q0JhY4wOn8YHj8FMr4uXVx82cQAuoZerN+aiwhBhbNF3jJ1lH83xA4/jQz4nEMA0hzDAMP9DhNY13ai+9/DvP//hAZZIP+Sw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GB6Mq3SP2Tv3pj6r54bMCBKub5QJoleOXkcJapqzKWs4Z2Gzla+QPBiNTGAzZbt9EUUcKKc8OAvh8ayhXC1lbygVlHQc/CZhd1gmZ7kQP083ePBYhZZn5OBtqKIVaqJQEtt8607e38Urbi3/KEIXpzJr5NT/W/K3BBO/+ccZ1TMTbqrWRBqgcQJrp0r258DUrnfqCl34pTDQwv7oElfyX+JpQ1geRA/8hEckEbjeFyyZPjmo4MnO2uLFrby7KcQdGa33IPPfNhAZd8A8OjxXGhVKUcLIWdQCJVum2kgOrQHYquUEcs+mY+8pwC5qrVc8mkD2cP2svbB9xuI3ogUa/A==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-Id:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: chunjie.zhu@xxxxxxxxxx, jason.andryuk@xxxxxxx, jbeulich@xxxxxxxx, roger@xxxxxxxxxxxxxx, teddy.astie@xxxxxxxxxx
  • Delivery-date: Fri, 16 Oct 2026 07:06:41 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

From: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>

When V_NMI_ENABLE is set, the processor manages V_NMI and V_NMI_MASK
automatically (including on IRET), and writes both back to the VMCB on
VMEXIT (APM vol.2 rev 3.44, "NMI Virtualization").

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.

Fixes: 86a203ab8d38 ("x86/svm: Support vNMI on capable hardware")
Signed-off-by: Chunjie Zhu <chunjie.zhu@xxxxxxxxxx>
---
v2:
 * Reword commit message: the processor manages V_NMI/V_NMI_MASK itself.
 * Add Fixes: tag.
 * Cite APM by revision and section title.
---
 xen/arch/x86/hvm/svm/nestedsvm.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index faacfe007832..3a0afa98129e 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1027,12 +1027,19 @@ 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, the processor manages V_NMI and
+     * V_NMI_MASK itself and writes both back on #VMEXIT (APM vol.2 rev 3.44,
+     * "NMI Virtualization").
      */
     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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.