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

[RFC PATCH v1 05/26] xen/arm/cca: track Realm-owned granules


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Koichiro Den <den@xxxxxxxxxxxxx>
  • Date: Fri, 15 May 2026 13:07:51 +0900
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; 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=je+2e5JLShwscO+d0I1NHDPQJTM0lMJ5BSNSbA846H8=; b=odapd3Be5VkQtBbRH1uwN0il268YOIwXXv1evWs55d2udpriuVqsx2pB2WfSpdh8gFKBUAQ+Y5hqfT6O1DXyVwiKjJNlZ+vETnhk1ujADMbouvgWhPs5ppegHYVMNohvVQNshqz2pI1+PEhuALw2xwjB31+BUkV5O2Abx+P2jgvxn+Ow3ksIetfAro5577HNpYPIuPQC0m+glR1KXQ9uoLDQcZTzRTlnXqVs1OBIDvONWGMJ0r/HIoxM5b8yLvI3imNYRjltq5TnsQIueq5abrKpXu8no37bAicm8vvwm7e9UxHV6/XJ8DBqUITpxetuVyW7dwNPE6oSm5weOPz0vw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mtKwuIZPDKs9Nc7vf3KMSPtl+i/TN1cJbJ9RR4x2hRnLhZqU3r0MYSpZXelSshVm5oNGx2lcqAB8+pUqVfVD2I48hE1ct5eK/2OcD4KzOFIji/dflXpu9zUzQFBYUo7EipgVqUY3HILJvVtx1ZKb5hdV6PuZuIEsC0W37KjXkxaxfjcC8Bram4bQMIGZYnAs3Sk6+iDqFFhzaU63JgqynQGVkAuY2GJgTS2eLumEeKLgnb7v1SrbtcCK3Smu7KjZRNnW6c8HTexLAVn1MV2+bQfnvuMy1wLZE9cEPnfrDe994k8tkKUoA/eXMAy6hhjKEMSZRRysqyeMn7GOiFSVeg==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=valinux.co.jp header.i="@valinux.co.jp" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, "Daniel P. Smith" <dpsmith@xxxxxxxxxxxxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Fri, 15 May 2026 04:08:38 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Track pages once ownership has moved from Xen to the RMM. Teardown uses
these records to hand them back in the right RMI order.

Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
---
 xen/arch/arm/cca/state.c       | 19 ++++++++++++++++
 xen/arch/arm/include/asm/cca.h | 40 ++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/xen/arch/arm/cca/state.c b/xen/arch/arm/cca/state.c
index a47d9cd7b6fd..66375965a1b4 100644
--- a/xen/arch/arm/cca/state.c
+++ b/xen/arch/arm/cca/state.c
@@ -10,17 +10,36 @@
 
 static void arm_cca_reset_domain_state(struct domain *d)
 {
+    unsigned int i;
+
     d->arch.cca.realm_active = false;
     d->arch.cca.rd = INVALID_PADDR;
     d->arch.cca.rmi_features0 = 0;
     d->arch.cca.rmi_features1 = 0;
+    d->arch.cca.rd_page = NULL;
+    d->arch.cca.rtt_root_page = NULL;
+    d->arch.cca.nr_realm_sro_pages = 0;
+    d->arch.cca.rtts = NULL;
+    d->arch.cca.nr_rtts = 0;
+    d->arch.cca.data_pages = NULL;
+    d->arch.cca.nr_data_pages = 0;
+
+    for ( i = 0; i < ARRAY_SIZE(d->arch.cca.realm_sro_pages); ++i )
+        d->arch.cca.realm_sro_pages[i] = NULL;
 }
 
 static void arm_cca_reset_vcpu_state(struct vcpu *v)
 {
+    unsigned int i;
+
     v->arch.cca.rec = INVALID_PADDR;
     v->arch.cca.run = NULL;
     v->arch.cca.run_pa = INVALID_PADDR;
+    v->arch.cca.rec_page = NULL;
+    v->arch.cca.nr_aux = 0;
+
+    for ( i = 0; i < ARRAY_SIZE(v->arch.cca.aux_pages); ++i )
+        v->arch.cca.aux_pages[i] = NULL;
 }
 
 void arm_cca_domain_init(struct domain *d)
diff --git a/xen/arch/arm/include/asm/cca.h b/xen/arch/arm/include/asm/cca.h
index 1be43327119e..6bf644fbcee5 100644
--- a/xen/arch/arm/include/asm/cca.h
+++ b/xen/arch/arm/include/asm/cca.h
@@ -14,20 +14,60 @@
  */
 #define ARM_CCA_MAX_REC_AUX 16U
 
+/*
+ * Xen implementation cap for pages accepted by one memory-transferring SRO,
+ * not an RMI architectural limit.  Switch to dynamic tracking if a real RMM
+ * needs more.
+ */
+#define ARM_CCA_MAX_SRO_DONATION_PAGES 64U
+
 struct domain;
 struct vcpu;
+struct page_info;
+
+struct arm_cca_rtt_record {
+    paddr_t ipa;
+    paddr_t pa;
+    unsigned int level;
+};
+
+struct arm_cca_data_page_record {
+    paddr_t ipa;
+    paddr_t pa;
+};
 
 struct arm_cca_domain_state {
     bool realm_active;
     paddr_t rd;
     unsigned long rmi_features0;
     unsigned long rmi_features1;
+
+    /*
+     * Host references for granules whose RMM state is no longer represented
+     * by Xen's page allocator alone.  They let relinquish complete the
+     * reverse DEN0137 2.0-bet1 A2.3.6 transitions before the pages are
+     * returned to Xen.
+     */
+    struct page_info *rd_page;
+    struct page_info *rtt_root_page;
+    struct page_info *realm_sro_pages[ARM_CCA_MAX_SRO_DONATION_PAGES];
+    unsigned int nr_realm_sro_pages;
+
+    struct arm_cca_rtt_record *rtts;
+    unsigned int nr_rtts;
+
+    struct arm_cca_data_page_record *data_pages;
+    unsigned long nr_data_pages;
 };
 
 struct arm_cca_vcpu_state {
     paddr_t rec;
     void *run;
     paddr_t run_pa;
+
+    struct page_info *rec_page;
+    struct page_info *aux_pages[ARM_CCA_MAX_REC_AUX];
+    unsigned int nr_aux;
 };
 
 void arm_cca_domain_init(struct domain *d);
-- 
2.51.0




 


Rackspace

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