qemu: Track NS bit across SPMC shares and lends
Bug: 284057071
Change-Id: Ice3b2037e017ce40e47ac12f2c9b780585191ac6
diff --git a/plat/qemu/common/qemu_common.c b/plat/qemu/common/qemu_common.c
index 43bd376..35d6bb3 100644
--- a/plat/qemu/common/qemu_common.c
+++ b/plat/qemu/common/qemu_common.c
@@ -13,6 +13,7 @@
#include <common/bl_common.h>
#include <lib/xlat_tables/xlat_tables_v2.h>
#include <services/el3_spmc_ffa_memory.h>
+#include <services/ffa_svc.h>
#if ENABLE_RME
#include <services/rmm_core_manifest.h>
#endif
@@ -187,14 +188,36 @@
return 0;
}
+static int qemu_spmc_mem_set_shared(struct ffa_mtd *desc, bool shared)
+{
+ struct ffa_emad_v1_0 *emad0;
+ struct ffa_comp_mrd *comp;
+ bool secure;
+ int ret;
+
+#if MAKE_FFA_VERSION(1, 1) > FFA_VERSION_COMPILED
+#error "TF-A was compiled for FF-A v1.0"
+#endif
+ assert(is_aligned(desc->emad_offset, 16));
+ emad0 = (struct ffa_emad_v1_0 *)((uint8_t *)desc + desc->emad_offset);
+ comp = (struct ffa_comp_mrd *)((uint8_t *)desc + emad0->comp_mrd_offset);
+ secure = (desc->flags & FFA_MTD_FLAG_TYPE_MASK) == FFA_MTD_FLAG_TYPE_LEND_MEMORY;
+
+ ret = qemu_ffa_comp_set_shared(comp, shared, secure);
+ if (!ret && secure) {
+ desc->memory_region_attributes &= ~FFA_MEM_ATTR_NS_BIT;
+ }
+ return ret;
+}
+
int plat_spmc_shmem_begin(struct ffa_mtd *desc)
{
- return 0;
+ return qemu_spmc_mem_set_shared(desc, true);
}
int plat_spmc_shmem_reclaim(struct ffa_mtd *desc)
{
- return 0;
+ return qemu_spmc_mem_set_shared(desc, false);
}
#endif
diff --git a/plat/qemu/common/qemu_private.h b/plat/qemu/common/qemu_private.h
index 25b14e2..b38659d 100644
--- a/plat/qemu/common/qemu_private.h
+++ b/plat/qemu/common/qemu_private.h
@@ -42,4 +42,6 @@
void qemu_bl2_sync_transfer_list(void);
+int qemu_ffa_comp_set_shared(void *compv, bool shared, bool secure);
+
#endif /* QEMU_PRIVATE_H */
diff --git a/plat/qemu/common/shared_mem.c b/plat/qemu/common/shared_mem.c
index 174d564..0879c83 100644
--- a/plat/qemu/common/shared_mem.c
+++ b/plat/qemu/common/shared_mem.c
@@ -13,6 +13,8 @@
#include <trusty/arm_ffa.h>
#include <trusty/ffa_helpers.h>
+#include "qemu_private.h"
+
#define NS_DRAM0_BITMAP_SIZE DIV_ROUND_UP_2EVAL(NS_DRAM0_SIZE, PAGE_SIZE * 8)
static uint8_t trusty_shmem_shared[NS_DRAM0_BITMAP_SIZE];
static uint8_t trusty_shmem_secure[NS_DRAM0_BITMAP_SIZE];
@@ -85,17 +87,13 @@
return -EBUSY;
}
-
-int plat_mem_set_shared(struct ffa_mtd *mtd, bool shared)
+int qemu_ffa_comp_set_shared(void *compv, bool shared, bool secure)
{
- struct ffa_comp_mrd *comp = trusty_ffa_mtd_get_comp_mrd(mtd);
+ struct ffa_comp_mrd *comp = compv;
size_t count = comp->address_range_count;
struct ffa_cons_mrd *cons_mrd;
int ret = 0;
size_t i;
- bool secure;
-
- secure = trusty_ffa_should_be_secure(mtd);
for (i = 0, cons_mrd = comp->address_range_array; i < count;
i++, cons_mrd++) {
@@ -106,9 +104,6 @@
}
}
- if (secure) {
- mtd->memory_region_attributes &= ~FFA_MEM_ATTR_NONSECURE;
- }
return 0;
err:
@@ -127,3 +122,16 @@
}
return ret;
}
+
+int plat_mem_set_shared(struct ffa_mtd *mtd, bool shared)
+{
+ struct ffa_comp_mrd *comp = trusty_ffa_mtd_get_comp_mrd(mtd);
+ bool secure = trusty_ffa_should_be_secure(mtd);
+ int ret;
+
+ ret = qemu_ffa_comp_set_shared(comp, shared, secure);
+ if (!ret && secure) {
+ mtd->memory_region_attributes &= ~FFA_MEM_ATTR_NONSECURE;
+ }
+ return ret;
+}
diff --git a/plat/qemu/qemu/platform.mk b/plat/qemu/qemu/platform.mk
index e92415f..630496c 100644
--- a/plat/qemu/qemu/platform.mk
+++ b/plat/qemu/qemu/platform.mk
@@ -50,6 +50,9 @@
ifeq (${SPD},trusty)
PLAT_BL_COMMON_SOURCES += ${PLAT_QEMU_COMMON_PATH}/shared_mem.c
endif
+ifeq (${SPMC_AT_EL3},1)
+PLAT_BL_COMMON_SOURCES += ${PLAT_QEMU_COMMON_PATH}/shared_mem.c
+endif
ifneq (${TRUSTED_BOARD_BOOT},0)