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

Re: [PATCH v1 07/28] x86/hvm: avic: add VMCB state initialization


  • To: dmukhin@xxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
  • Date: Mon, 9 Nov 2026 14:26:33 +0000
  • 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=kLqC/2brOXWuIvQGplGN134ubFIUqk+AhHUSWOEAOXg=; b=Tzcqd2i9mbJzARyNEfzYqN/yxtZ+0aBkAkw/IX+21wY+O4jzAY2AkixXwg6YGVdoS4kPV4xUIrsg7+3jQLAQemMrugr40EOuIND/2maaIZUAFPngFC4g4Mp8D0r8ixvBqj3Vez6r49rDB+BycG6OMRIpbIcsPYmvQh6CGXGNQU6s4FAgeUXcrSsL5eyKrmQsVcrWrSygk6KP1C2ciO/Hzrc0b7qoM1+7qM4tT7RKErTpdMaCzTMFpApCmeuhxD38wpemuq0U9D0WEu7h/hvvOEPgo4qR6JipL3pW7wcsEqBNYj+RsAvW7rwd5uK9RhhspIK+DmnYSSnXtnIsT1WUig==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AsZb93IbsagnxblXfDJIT+/tEe8bUlA8XqmHr4hneDMymDomRmTBcCmYuI1dNCj8St1TsrIeYMu03RLgXBUMCuVFGHFLm0PAhEVKRBhjNLVD6OC+rvYMGvs5mrBLaUayJ3vP9h/8ed9YbD7iR8/yGqVCxb1ZkBz2IEBBPed+fXe8WSRY5YRdH9mg6sF800FlWTKGj8TJ5KITh16UEJ4Thcv1ZgLyNQtiUzSLSr5/2ZuUC19oR+aDCAnoedUW3o9wK/Vf+noSXQu/rVXFtn3AtjNwLN/1wEzpTWSVkhgJSIcayj2tojthF46GI6a3a3UDztjvUjD7AqIVFC+RooiC7Q==
  • 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: andrew.cooper3@xxxxxxxxxx, jason.andryuk@xxxxxxx, jbeulich@xxxxxxxx, roger@xxxxxxxxxxxxxx, teddy.astie@xxxxxxxxxx, dmukhin@xxxxxxx
  • Delivery-date: Mon, 09 Nov 2026 14:26:58 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 11/5/26 1:33 AM, dmukhin@xxxxxxxx wrote:
From: Denis Mukhin <dmukhin@xxxxxxxx>

Update SVM VMCB with AVIC-related data types as per [1].

Install AVIC backing page and logical/physical APIC ID tables mappings
into VMCB.

Set VMCB 'avic_enable' bit to 1 in case of successful initialization.

[1] AMD APM Volumes 1-5 "15.29 Advanced Virtual Interrupt Controller".
Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
  xen/arch/x86/hvm/svm/avic.c | 110 ++++++++++++++++++++++++++++++++++++
  xen/arch/x86/hvm/svm/avic.h |   3 +
  xen/arch/x86/hvm/svm/vmcb.c |   7 +++
  xen/arch/x86/hvm/svm/vmcb.h |  19 +++++--
  4 files changed, 135 insertions(+), 4 deletions(-)

diff --git a/xen/arch/x86/hvm/svm/avic.c b/xen/arch/x86/hvm/svm/avic.c
index 2c0e113ae34e..bc98661a7057 100644
--- a/xen/arch/x86/hvm/svm/avic.c
+++ b/xen/arch/x86/hvm/svm/avic.c
@@ -9,6 +9,16 @@
  #include <xen/param.h>
#include "avic.h"
+#include "vmcb.h"
+
+#define AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK        GENMASK_ULL(51, 12U)
+#define AVIC_PHYSICAL_ID_TABLE_SIZE_MASK                (0xFFULL)
+
+/*
+ * For AVIC, the max index allowed for physical APIC ID table is 0xfe (254), as
+ * 0xff is a broadcast to all CPUs, i.e. can't be targeted individually.
+ */
+#define AVIC_MAX_PHYSICAL_ID                            (0xFEU)
bool __read_mostly svm_avic_enable; @@ -125,6 +135,106 @@ void svm_avic_domain_relinquish_resources(struct domain *d)
      }
  }
+static bool avic_vcpu_supported(struct vcpu *v)
+{
+    struct domain *d = v->domain;
+    unsigned int id;
+
+    if ( !svm_avic_enable || !has_vlapic(d) )
+        return false;
+
+    if ( d->max_vcpus * 2 >= AVIC_PHYSICAL_ID_TABLE_SIZE_MASK )
+    {
+        gprintk(XENLOG_WARNING,
+                "%pv: AVIC: unsupported domain max_vcpus %u\n",
+                v, d->max_vcpus);
+        return false;
+    }
+
+    id = GET_xAPIC_ID(vlapic_reg_read(v, APIC_ID));
+    if ( id > AVIC_MAX_PHYSICAL_ID )
+    {
+        gprintk(XENLOG_WARNING,
+                "%pv: AVIC: unsupported APIC ID %u\n",
+                v, id);
+        return false;
+    }
+
+    return true;
+}
+
+static void avic_vcpu_enable(const struct vcpu *v, bool enable)
+{
+    const struct svm_vcpu *sv = &v->arch.hvm.svm;
+    struct vmcb_struct *vmcb = sv->vmcb;
+
+    vmcb->_vintr.fields.x2avic_enable = 0;
+    vmcb->_vintr.fields.avic_enable = enable;
+    vmcb->cleanbits.avic = 0;
+
+    printk(XENLOG_INFO
+           "%pv: AVIC: %s: apic_id=%#x avic_physical_id=%#"PRIx64" 
max_vcpus=%u\n",
+           v,
+           enable ? "enable" : "disable",
+           GET_xAPIC_ID(vlapic_reg_read(v, APIC_ID)),
+           sv->avic_physical_id ? ACCESS_ONCE(*sv->avic_physical_id) :
+                                  0xDEADDEADUL,
+           v->domain->max_vcpus);
+}

This is called from svm_avic_vmcb_destroy() which may be called after
domain_relinquish_resources(). Dereferencing avic_physical_id hits a page
fault since the page is already unmapped by then.

Ross



 


Rackspace

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