summaryrefslogtreecommitdiff
path: root/services/std_svc
diff options
context:
space:
mode:
authorManish Pandey <manish.pandey2@arm.com>2022-07-21 13:07:07 +0100
committerManish V Badarkhe <Manish.Badarkhe@arm.com>2022-10-06 14:02:25 +0100
commit67471e75b3cf48c361e71894a666bce4395bbb35 (patch)
treea18aca29a39e5f4e50634f23a1a095cf39e5cc69 /services/std_svc
parent2c265975a76977c6373636f5f28e114d1b73e10e (diff)
downloadarm-trusted-firmware-67471e75b3cf48c361e71894a666bce4395bbb35.tar.gz
feat(drtm): flush dcache before DLME launch
Flush the data cache range before DLME launch to ensure that data passed by DCE preamble is committed. Signed-off-by: Manish Pandey <manish.pandey2@arm.com> Change-Id: I9946fd3420a17b86d9f1483e8b2cd5880033454e
Diffstat (limited to 'services/std_svc')
-rw-r--r--services/std_svc/drtm/drtm_main.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/services/std_svc/drtm/drtm_main.c b/services/std_svc/drtm/drtm_main.c
index c98d829b3..e0f5c1784 100644
--- a/services/std_svc/drtm/drtm_main.c
+++ b/services/std_svc/drtm/drtm_main.c
@@ -322,8 +322,8 @@ static enum drtm_retc drtm_dl_check_args(uint64_t x1,
uint64_t dlme_start, dlme_end;
uint64_t dlme_img_start, dlme_img_ep, dlme_img_end;
uint64_t dlme_data_start, dlme_data_end;
- uintptr_t args_mapping;
- size_t args_mapping_size;
+ uintptr_t va_mapping;
+ size_t va_mapping_size;
struct_drtm_dl_args *a;
struct_drtm_dl_args args_buf;
int rc;
@@ -334,16 +334,16 @@ static enum drtm_retc drtm_dl_check_args(uint64_t x1,
return INVALID_PARAMETERS;
}
- args_mapping_size = ALIGNED_UP(sizeof(struct_drtm_dl_args), DRTM_PAGE_SIZE);
+ va_mapping_size = ALIGNED_UP(sizeof(struct_drtm_dl_args), DRTM_PAGE_SIZE);
/* check DRTM parameters are within NS address region */
- rc = plat_drtm_validate_ns_region(x1, args_mapping_size);
+ rc = plat_drtm_validate_ns_region(x1, va_mapping_size);
if (rc != 0) {
ERROR("DRTM: parameters lies within secure memory\n");
return INVALID_PARAMETERS;
}
- rc = mmap_add_dynamic_region_alloc_va(x1, &args_mapping, args_mapping_size,
+ rc = mmap_add_dynamic_region_alloc_va(x1, &va_mapping, va_mapping_size,
MT_MEMORY | MT_NS | MT_RO |
MT_SHAREABILITY_ISH);
if (rc != 0) {
@@ -351,15 +351,14 @@ static enum drtm_retc drtm_dl_check_args(uint64_t x1,
__func__, rc);
return INTERNAL_ERROR;
}
- a = (struct_drtm_dl_args *)args_mapping;
- /*
- * TODO: invalidate all data cache before reading the data passed by the
- * DCE Preamble. This is required to avoid / defend against racing with
- * cache evictions.
- */
+ a = (struct_drtm_dl_args *)va_mapping;
+
+ /* Sanitize cache of data passed in args by the DCE Preamble. */
+ flush_dcache_range(va_mapping, va_mapping_size);
+
args_buf = *a;
- rc = mmap_remove_dynamic_region(args_mapping, args_mapping_size);
+ rc = mmap_remove_dynamic_region(va_mapping, va_mapping_size);
if (rc) {
ERROR("%s(): mmap_remove_dynamic_region() failed unexpectedly"
" rc=%d\n", __func__, rc);
@@ -458,6 +457,28 @@ static enum drtm_retc drtm_dl_check_args(uint64_t x1,
}
}
+ /*
+ * Map and sanitize the cache of data range passed by DCE Preamble. This
+ * is required to avoid / defend against racing with cache evictions
+ */
+ va_mapping_size = ALIGNED_UP((dlme_end - dlme_start), DRTM_PAGE_SIZE);
+ rc = mmap_add_dynamic_region_alloc_va(dlme_img_start, &va_mapping, va_mapping_size,
+ MT_MEMORY | MT_NS | MT_RO |
+ MT_SHAREABILITY_ISH);
+ if (rc != 0) {
+ ERROR("DRTM: %s: mmap_add_dynamic_region_alloc_va() failed rc=%d\n",
+ __func__, rc);
+ return INTERNAL_ERROR;
+ }
+ flush_dcache_range(va_mapping, va_mapping_size);
+
+ rc = mmap_remove_dynamic_region(va_mapping, va_mapping_size);
+ if (rc) {
+ ERROR("%s(): mmap_remove_dynamic_region() failed unexpectedly"
+ " rc=%d\n", __func__, rc);
+ panic();
+ }
+
*a_out = *a;
return SUCCESS;
}