|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH v1 15/26] xen/arm/cca: create Realm descriptors
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |