test(memory share): multiple receiver hypervisor retrieve request
Checks that the hypervisor retrieve request from section 17.4.3 of FF-A
v1.2 REL0 is supported, when specifying multiple recievers.
Change-Id: I55e9f25aedaa408ab015115d5bab72bf17b22d25
Signed-off-by: Karl Meakin <karl.meakin@arm.com>
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c b/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c
index 42e1948..12ae953 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_memory_sharing.c
@@ -629,7 +629,9 @@
/**
* Helper for performing a hypervisor retrieve request test.
*/
-static test_result_t hypervisor_retrieve_request_test_helper(uint32_t mem_func)
+static test_result_t
+hypervisor_retrieve_request_test_helper(uint32_t mem_func,
+ bool multiple_receivers)
{
struct ffa_memory_region_constituent sent_constituents[] = {{
.address = (void *)share_page,
@@ -651,13 +653,25 @@
.cacheability = FFA_MEMORY_CACHE_WRITE_BACK,
.shareability = FFA_MEMORY_INNER_SHAREABLE,
.security = FFA_MEMORY_SECURITY_NON_SECURE,
- .type = (mem_func != FFA_MEM_SHARE_SMC32)
+ .type = (!multiple_receivers && mem_func != FFA_MEM_SHARE_SMC32)
? FFA_MEMORY_NOT_SPECIFIED_MEM
: FFA_MEMORY_NORMAL_MEM,
};
- struct ffa_memory_access receiver =
- ffa_memory_access_init_permissions_from_mem_func(SP_ID(1), mem_func);
+ struct ffa_memory_access receivers[2] = {
+ ffa_memory_access_init_permissions_from_mem_func(SP_ID(1),
+ mem_func),
+ ffa_memory_access_init_permissions_from_mem_func(SP_ID(2),
+ mem_func),
+ };
+
+ /*
+ * Only pass 1 receiver to `memory_init_and_send` if we are not testing
+ * the multiple-receivers functionality of the hypervisor retrieve
+ * request.
+ */
+ uint32_t receiver_count =
+ multiple_receivers ? ARRAY_SIZE(receivers) : 1;
CHECK_SPMC_TESTING_SETUP(1, 2, expected_sp_uuids);
GET_TFTF_MAILBOX(mb);
@@ -677,7 +691,7 @@
panic();
}
- handle = memory_init_and_send(mb.send, MAILBOX_SIZE, SENDER, &receiver, 1,
+ handle = memory_init_and_send(mb.send, MAILBOX_SIZE, SENDER, receivers, receiver_count,
sent_constituents,
sent_constituents_count, mem_func, &ret);
if (handle == FFA_MEMORY_HANDLE_INVALID) {
@@ -750,15 +764,25 @@
test_result_t test_hypervisor_share_retrieve(void)
{
- return hypervisor_retrieve_request_test_helper(FFA_MEM_SHARE_SMC32);
+ return hypervisor_retrieve_request_test_helper(FFA_MEM_SHARE_SMC32, false);
}
test_result_t test_hypervisor_lend_retrieve(void)
{
- return hypervisor_retrieve_request_test_helper(FFA_MEM_LEND_SMC32);
+ return hypervisor_retrieve_request_test_helper(FFA_MEM_LEND_SMC32, false);
}
test_result_t test_hypervisor_donate_retrieve(void)
{
- return hypervisor_retrieve_request_test_helper(FFA_MEM_DONATE_SMC32);
+ return hypervisor_retrieve_request_test_helper(FFA_MEM_DONATE_SMC32, false);
+}
+
+test_result_t test_hypervisor_share_retrieve_multiple_receivers(void)
+{
+ return hypervisor_retrieve_request_test_helper(FFA_MEM_SHARE_SMC32, true);
+}
+
+test_result_t test_hypervisor_lend_retrieve_multiple_receivers(void)
+{
+ return hypervisor_retrieve_request_test_helper(FFA_MEM_LEND_SMC32, true);
}
diff --git a/tftf/tests/tests-spm.xml b/tftf/tests/tests-spm.xml
index fbc1763..075d940 100644
--- a/tftf/tests/tests-spm.xml
+++ b/tftf/tests/tests-spm.xml
@@ -94,6 +94,10 @@
function="test_hypervisor_lend_retrieve" />
<testcase name="Hypervisor donate + memory retrieve request"
function="test_hypervisor_donate_retrieve" />
+ <testcase name="Hypervisor share + memory retrieve request (multiple receivers)"
+ function="test_hypervisor_share_retrieve_multiple_receivers" />
+ <testcase name="Hypervisor lend + memory retrieve request (multiple receivers)"
+ function="test_hypervisor_lend_retrieve_multiple_receivers" />
<testcase name="Lend Memory to Secure World"
function="test_mem_lend_sp" />
<testcase name="Lend memory, clear flag set"