test(indirect message): request SP to message VM

Add test for SP to message a normal world VM.

Signed-off-by: J-Alves <joao.alves@arm.com>
Change-Id: I4c2f3e8995163024453b6f51900599a5f6e60b19
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_indirect_messaging.c b/tftf/tests/runtime_services/secure_service/test_ffa_indirect_messaging.c
new file mode 100644
index 0000000..cb1029e
--- /dev/null
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_indirect_messaging.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2024 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+#include "ffa_helpers.h"
+#include "spm_common.h"
+#include "tftf_lib.h"
+#include <debug.h>
+#include <smccc.h>
+
+#include <arch_helpers.h>
+#include <cactus_test_cmds.h>
+#include <ffa_endpoints.h>
+#include <ffa_svc.h>
+#include <platform.h>
+#include <spm_test_helpers.h>
+#include <test_helpers.h>
+
+static const struct ffa_uuid expected_sp_uuids[] = {
+		{PRIMARY_UUID},
+	};
+
+/*
+ *
+ * Used as the RX/TX buffers belonging to VM 1 in the forwarding FFA_RXTX_MAP
+ * tests.
+ */
+static __aligned(PAGE_SIZE) uint8_t vm1_rx_buffer[PAGE_SIZE];
+static __aligned(PAGE_SIZE) uint8_t vm1_tx_buffer[PAGE_SIZE];
+
+test_result_t test_ffa_indirect_message_sp_to_vm(void)
+{
+	struct ffa_value ret;
+	struct mailbox_buffers mb;
+	ffa_id_t header_sender;
+	const ffa_id_t vm_id = 1;
+	const ffa_id_t sender = SP_ID(1);
+	const char expected_msg[] = "Testing FF-A message.";
+	char msg[300];
+
+	/**********************************************************************
+	 * Check SPMC has ffa_version and expected FF-A endpoints are deployed.
+	 **********************************************************************/
+	CHECK_SPMC_TESTING_SETUP(1, 2, expected_sp_uuids);
+
+	GET_TFTF_MAILBOX(mb);
+
+	ret = ffa_rxtx_map_forward(mb.send, vm_id, vm1_rx_buffer,
+				   vm1_tx_buffer);
+
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
+		ERROR("Failed to map buffers RX %p TX %p for VM %x\n",
+		      vm1_tx_buffer, vm1_tx_buffer, vm_id);
+		return TEST_RESULT_FAIL;
+	}
+
+	ret = ffa_notification_bitmap_create(vm_id, PLATFORM_CORE_COUNT);
+
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
+		ERROR("Failed to create bitmap for vm %x\n", vm_id);
+		return TEST_RESULT_FAIL;
+	}
+
+	/* Request SP to send message. */
+	ret = cactus_req_ind_msg_send_cmd(
+			HYP_ID, sender, vm_id, sender, 0);
+
+	if (!is_ffa_direct_response(ret) &&
+	    cactus_get_response(ret) != CACTUS_SUCCESS) {
+		return TEST_RESULT_FAIL;
+	}
+
+	if (!receive_indirect_message(&msg, ARRAY_SIZE(msg), (void *)vm1_rx_buffer,
+				      &header_sender, vm_id, 0)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	if (strncmp(msg, expected_msg, ARRAY_SIZE(expected_msg)) != 0) {
+		ERROR("Unexpected message: %s, expected: %s\n", msg, expected_msg);
+		return TEST_RESULT_FAIL;
+	}
+
+	if (header_sender != sender) {
+		ERROR("Unexpected endpoints. Sender: %x Expected: %x\n",
+		      header_sender, sender);
+		return TEST_RESULT_FAIL;
+	}
+
+	ret = ffa_notification_bitmap_destroy(vm_id);
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	ret = ffa_rxtx_unmap_with_id(vm_id);
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
index e2e05f0..621fc69 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
@@ -419,16 +419,20 @@
 
 	ret = ffa_rxtx_map_forward(mb.send, VM_ID(1), vm1_rx_buffer,
 				   vm1_tx_buffer);
-	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32))
+
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
 		return TEST_RESULT_FAIL;
+	}
 
 	ret = ffa_rxtx_unmap_with_id(VM_ID(1));
-	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32))
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
 		return TEST_RESULT_FAIL;
+	}
 
 	ret = ffa_rxtx_unmap();
-	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32))
+	if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
 		return TEST_RESULT_FAIL;
+	}
 
 	return TEST_RESULT_SUCCESS;
 }
diff --git a/tftf/tests/tests-spm.mk b/tftf/tests/tests-spm.mk
index b094e87..1ac5e84 100644
--- a/tftf/tests/tests-spm.mk
+++ b/tftf/tests/tests-spm.mk
@@ -14,6 +14,7 @@
 		spm_common.c						\
 		spm_test_helpers.c					\
 		test_ffa_direct_messaging.c				\
+		test_ffa_indirect_messaging.c				\
 		test_ffa_interrupts.c					\
 		test_ffa_secure_interrupts.c				\
 		test_ffa_memory_sharing.c				\
diff --git a/tftf/tests/tests-spm.xml b/tftf/tests/tests-spm.xml
index 4eef491..cbddb98 100644
--- a/tftf/tests/tests-spm.xml
+++ b/tftf/tests/tests-spm.xml
@@ -235,4 +235,10 @@
                function="test_ffa_notifications_sp_signals_vm_per_vcpu" />
   </testsuite>
 
+  <testsuite name="FF-A Indirect Messaging"
+             description="Test FF-A Indirect messaging" >
+  <testcase name="FF-A Indirect Message from SP to VM"
+               function="test_ffa_indirect_message_sp_to_vm" />
+  </testsuite>
+
 </testsuites>