|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH v1 17/26] xen/arm/cca: populate Realm DATA granules
Move initial guest RAM out of the p2m, delegate it, and map it into the
Realm with measurement enabled.
Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
---
xen/arch/arm/cca/build.c | 124 +++++++++++++++++++++++++++++++++++++++
1 file changed, 124 insertions(+)
diff --git a/xen/arch/arm/cca/build.c b/xen/arch/arm/cca/build.c
index 10f61b5038ef..8e607e97b99c 100644
--- a/xen/arch/arm/cca/build.c
+++ b/xen/arch/arm/cca/build.c
@@ -664,3 +664,127 @@ static int arm_cca_build_rtts(struct domain *d, paddr_t
base,
return 0;
}
+
+/*
+ * DEN0137 2.0-bet1 - D1.2.3 Initialize memory of New Realm flow.
+ */
+static int arm_cca_create_data_pages(struct domain *d, gfn_t base_gfn,
+ unsigned long nr_pages,
+ uint64_t *rmi_result)
+{
+ struct page_info *scratch_pg;
+ void *scratch;
+ unsigned long i, work = 0;
+ int rc = 0;
+
+ if ( !d->arch.cca.data_pages )
+ {
+ d->arch.cca.data_pages = xzalloc_array(struct arm_cca_data_page_record,
+ nr_pages);
+ if ( !d->arch.cca.data_pages )
+ return -ENOMEM;
+ }
+
+ scratch_pg = arm_cca_alloc_host_page();
+ if ( !scratch_pg )
+ return -ENOMEM;
+
+ scratch = map_domain_page(page_to_mfn(scratch_pg));
+
+ for ( i = d->arch.cca.nr_data_pages; i < nr_pages; ++i )
+ {
+ paddr_t ipa = gfn_to_gaddr(gfn_add(base_gfn, i));
+ struct page_info *page;
+ p2m_type_t p2mt;
+ mfn_t mfn;
+ void *src;
+ struct arm_smccc_res res;
+ bool removed = false, delegated = false;
+
+ page = get_page_from_gfn(d, gfn_x(gfn_add(base_gfn, i)), &p2mt,
+ P2M_ALLOC);
+ if ( !page )
+ {
+ rc = -ENOENT;
+ break;
+ }
+
+ if ( p2mt != p2m_ram_rw )
+ {
+ put_page(page);
+ rc = -EINVAL;
+ break;
+ }
+
+ mfn = page_to_mfn(page);
+ src = map_domain_page(mfn);
+ memcpy(scratch, src, PAGE_SIZE);
+ unmap_domain_page(src);
+
+ rc = guest_physmap_remove_page(d, gfn_add(base_gfn, i), mfn, 0);
+ if ( rc != 0 )
+ {
+ put_page(page);
+ break;
+ }
+ removed = true;
+ d->arch.cca.build_unrecoverable = true;
+
+ rc = arm_cca_delegate_granule(page_to_maddr(page));
+ if ( rc != 0 )
+ goto err_page;
+ delegated = true;
+
+ /*
+ * TODO: If plain RAM should be left out of RIM, have the toolstack
+ * pass explicit measured ranges (kernel, initrd, DTB, etc.) and use
+ * DATA_MAP outside those ranges. Do not infer this from page contents.
+ */
+ rc = arm_cca_rmi_rtt_data_map_init(
+ d->arch.cca.rd, page_to_maddr(page), ipa,
+ page_to_maddr(scratch_pg),
+ ARM_CCA_RMI_DATA_FLAGS_MEASURE_CONTENT, &res);
+ rc = arm_cca_build_record_rmi_failure(rmi_result, rc, &res);
+ if ( rc != 0 )
+ goto err_page;
+
+ d->arch.cca.data_pages[i].ipa = ipa;
+ d->arch.cca.data_pages[i].pa = mfn_to_maddr(mfn);
+ d->arch.cca.nr_data_pages++;
+
+ put_page(page);
+
+ if ( arm_cca_build_should_preempt(++work,
+ ARM_CCA_BUILD_PREEMPT_PAGES,
+ ARM_CCA_BUILD_FORCE_PREEMPT_PAGES) )
+ {
+ rc = -ERESTART;
+ break;
+ }
+
+ continue;
+
+err_page:
+ if ( delegated )
+ {
+ if ( arm_cca_undelegate_build_page(d, page) )
+ delegated = false;
+ else
+ {
+ d->arch.cca.data_pages[i].ipa = INVALID_PADDR;
+ d->arch.cca.data_pages[i].pa = page_to_maddr(page);
+ d->arch.cca.nr_data_pages++;
+ }
+ }
+
+ put_page(page);
+ if ( removed && !delegated )
+ free_domheap_page(page);
+ break;
+ }
+
+ unmap_domain_page(scratch);
+ free_domheap_page(scratch_pg);
+
+ return rc;
+}
--
2.51.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |