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

[RFC PATCH v1 15/26] xen/arm/cca: create Realm descriptors


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Koichiro Den <den@xxxxxxxxxxxxx>
  • Date: Fri, 15 May 2026 13:08:01 +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=FZtK/SKYZCbPqZPdtBWTxkdfuoOJCT3QfZZUH1rHysw=; b=mUx+ftlah+frn9InSWv9C5utTgOaDEm+tKlekXtfxjhqO93nwvlMZE2m4IuGxJsuItZ0wHRJ/zFIQ7+rN624iGd/SUN0XWJrFis4/X84f7awXuSpi7wZQRoSJx7RFq4kCt1CzDooYPRu+TjvPfd8cgy6cBUknZwumajbRVvuA7hiRbrA0pA9iWqrlIy0ERZDfyWVYCunDOK0GO1KpVI+zZ+dKR/64hliLs4wbA7xAmhwX15IX5K5Ue3paPymLbFMa8vIhvab7nuaYS34zplZZih7A9CkFfx0isoFUNQmEBn12ugFDd+TFPJrbNEyGnuqx7RixxqW37eLTg7XHlVnqA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jp+/O/GeQwJmOb7MFT9Ek25aZ7U4EoVMvKSVMZq10HtD+NcaUo7+kcbVRPi0jFXqQV12YIjtR975uXDySqNnb5oM9WfVGH7CqbZv5dO8O2+SXIyOmd77dD2vx8QdFTzGUOr9ADCbwhY3SzFH091ARmHHcFaepMXU8ofWkbm0dEArwjPM486vI4KArCNV7AHfmsvICQEkBjHr9MXKnvYPQNVBlARsGqYst+HCspE5mhy6101a8h5K3yaRvDlNjzAiUuoqpo05g5IeCKgcE4xMd7TcaGXG/1gZSMjvU1aAKy1AluN2kYAQKlU77toOLehL3uzi8BRdbLvLB7MFtkRL6w==
  • 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:12:36 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Create the RD, root RTT and Realm parameter block for RMI_REALM_CREATE.
Record the delegated pages straight away so abort cleanup can find them.

Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
---
 xen/arch/arm/cca/build.c | 116 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 116 insertions(+)

diff --git a/xen/arch/arm/cca/build.c b/xen/arch/arm/cca/build.c
index f333813e10a0..66d9c88da161 100644
--- a/xen/arch/arm/cca/build.c
+++ b/xen/arch/arm/cca/build.c
@@ -409,3 +409,119 @@ static int arm_cca_validate_realm_features(struct domain 
*d)
 
     return arm_cca_validate_realm_features1(d);
 }
+
+static int arm_cca_rmi_realm_create_complete(struct domain *d, paddr_t rd,
+                                             paddr_t params,
+                                             uint64_t *rmi_result)
+{
+    struct arm_cca_sro_mem_xfer xfer = {
+        .pages = d->arch.cca.realm_sro_pages,
+        .nr_pages = &d->arch.cca.nr_realm_sro_pages,
+        .max_pages = ARRAY_SIZE(d->arch.cca.realm_sro_pages),
+        .abandoned_pages = &d->arch.cca.abandoned_pages,
+    };
+    struct arm_smccc_res res;
+    int rc;
+
+    rc = arm_cca_rmi_realm_create(rd, params, &res);
+    rc = arm_cca_sro_complete_mem_transfer(rc, &res, &xfer);
+    rc = arm_cca_build_record_rmi_failure(rmi_result, rc, &res);
+
+    if ( rc != 0 && d->arch.cca.nr_realm_sro_pages != 0 )
+        d->arch.cca.build_unrecoverable = true;
+
+    return rc;
+}
+
+/* DEN0137 2.0-bet1 - D1.2.1 Realm creation flow. */
+static int arm_cca_create_realm(struct domain *d, uint64_t *rmi_result)
+{
+    struct arm_cca_rmi_realm_params *params;
+    struct page_info *params_pg = NULL;
+    struct page_info *rd_pg = NULL;
+    struct page_info *rtt_root_pg = NULL;
+    bool rd_delegated = false, rtt_root_delegated = false;
+    void *va;
+    int rc = -ENOMEM;
+
+    rc = arm_cca_validate_realm_features(d);
+    if ( rc != 0 )
+        return rc;
+
+    rd_pg = arm_cca_alloc_host_page();
+    if ( !rd_pg )
+        goto out;
+
+    rtt_root_pg = arm_cca_alloc_host_page();
+    if ( !rtt_root_pg )
+        goto out;
+
+    params_pg = arm_cca_alloc_host_page();
+    if ( !params_pg )
+        goto out;
+
+    rc = arm_cca_delegate_granule(page_to_maddr(rd_pg));
+    if ( rc != 0 )
+        goto out;
+    rd_delegated = true;
+    d->arch.cca.rd_page = rd_pg;
+
+    rc = arm_cca_delegate_granule(page_to_maddr(rtt_root_pg));
+    if ( rc != 0 )
+        goto out;
+    rtt_root_delegated = true;
+    d->arch.cca.rtt_root_page = rtt_root_pg;
+
+    va = map_domain_page(page_to_mfn(params_pg));
+    params = va;
+    arm_cca_realm_params_init(params);
+    /*
+     * Initial Xen CCA supports only shared MEC Realms.  Set the policy
+     * explicitly even though RMI_MEC_POLICY_SHARED is encoded as zero.
+     */
+    params->flags0 = ARM_CCA_RMI_REALM_FLAGS0_MEC_POLICY(
+        ARM_CCA_RMI_MEC_POLICY_SHARED);
+    params->s2sz = p2m_ipa_bits;
+    params->hash_algo = ARM_CCA_RMI_HASH_SHA_256;
+    params->num_bps = arm_cca_feature_field(
+        d->arch.cca.rmi_features0,
+        ARM_CCA_RMI_FEATURE_REGISTER_0_NUM_BPS_SHIFT,
+        ARM_CCA_RMI_FEATURE_REGISTER_0_NUM_BPS_WIDTH);
+    params->num_wps = arm_cca_feature_field(
+        d->arch.cca.rmi_features0,
+        ARM_CCA_RMI_FEATURE_REGISTER_0_NUM_WPS_SHIFT,
+        ARM_CCA_RMI_FEATURE_REGISTER_0_NUM_WPS_WIDTH);
+    params->sve_vl = 0;
+    params->rtt_base = page_to_maddr(rtt_root_pg);
+    params->rtt_level_start = 0;
+    params->rtt_num_start = 1;
+    unmap_domain_page(va);
+
+    d->arch.cca.rd = page_to_maddr(rd_pg);
+
+    rc = arm_cca_rmi_realm_create_complete(d, d->arch.cca.rd,
+                                           page_to_maddr(params_pg),
+                                           rmi_result);
+    if ( rc != 0 )
+        goto out;
+
+    rc = 0;
+
+out:
+    if ( params_pg )
+        free_domheap_page(params_pg);
+
+    if ( rc != 0 )
+    {
+        if ( arm_cca_free_build_page(d, rtt_root_pg, rtt_root_delegated) )
+            d->arch.cca.rtt_root_page = NULL;
+
+        if ( arm_cca_free_build_page(d, rd_pg, rd_delegated) )
+        {
+            d->arch.cca.rd = INVALID_PADDR;
+            d->arch.cca.rd_page = NULL;
+        }
+    }
+
+    return rc;
+}
-- 
2.51.0




 


Rackspace

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