test(ff-a): test SP to NS-endpoint mem lend/share

Memory sharing/lending from SP to NS-endpoint is not allowed. Checks
that the said operations are denied by SPMC.

Signed-off-by: Maksims Svecovs <maksims.svecovs@arm.com>
Change-Id: I86f3bd637711735b40de9a169e2b3c934d32f1be
diff --git a/spm/cactus/cactus_tests/cactus_test_memory_sharing.c b/spm/cactus/cactus_tests/cactus_test_memory_sharing.c
index 0248437..ebca665 100644
--- a/spm/cactus/cactus_tests/cactus_test_memory_sharing.c
+++ b/spm/cactus/cactus_tests/cactus_test_memory_sharing.c
@@ -168,9 +168,9 @@
 	 * If returned an invalid handle, we should break the test.
 	 */
 	if (handle == FFA_MEMORY_HANDLE_INVALID) {
-		ERROR("Received an invalid FF-A memory Handle!\n");
+		VERBOSE("Received an invalid FF-A memory Handle!\n");
 		return cactus_error_resp(vm_id, source,
-					 CACTUS_ERROR_TEST);
+					 ffa_error_code(ffa_ret));
 	}
 
 	ffa_ret = cactus_mem_send_cmd(vm_id, receiver, mem_func, handle);
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 8c257b2..e28c652 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
@@ -148,12 +148,48 @@
 	}
 
 	if (cactus_get_response(ret) == CACTUS_ERROR) {
+		ERROR("Failed sharing memory between SPs. Error code: %d\n",
+			cactus_error_code(ret));
 		return TEST_RESULT_FAIL;
 	}
 
 	return TEST_RESULT_SUCCESS;
 }
 
+/*
+ * Test requests a memory send operation from SP to VM.
+ * The tests expects cactus to reply CACTUS_ERROR, providing FF-A error code of
+ * the last memory send FF-A call that cactus performed.
+ */
+static test_result_t test_req_mem_send_sp_to_vm(uint32_t mem_func,
+						ffa_id_t sender_sp,
+						ffa_id_t receiver_vm)
+{
+	smc_ret_values ret;
+
+	/**********************************************************************
+	 * Check if SPMC's ffa_version and presence of expected FF-A endpoints.
+	 *********************************************************************/
+	CHECK_SPMC_TESTING_SETUP(1, 0, expected_sp_uuids);
+
+	ret = cactus_req_mem_send_send_cmd(HYP_ID, sender_sp, mem_func,
+					   receiver_vm);
+
+	if (!is_ffa_direct_response(ret)) {
+		return TEST_RESULT_FAIL;
+	}
+
+	if (cactus_get_response(ret) == CACTUS_ERROR &&
+	    cactus_error_code(ret) == FFA_ERROR_DENIED) {
+		return TEST_RESULT_SUCCESS;
+	}
+
+	tftf_testcase_printf("Did not get the expected error, "
+			     "mem send returned with %d\n",
+			     cactus_get_response(ret));
+	return TEST_RESULT_FAIL;
+}
+
 test_result_t test_req_mem_share_sp_to_sp(void)
 {
 	return test_req_mem_send_sp_to_sp(FFA_MEM_SHARE_SMC32, SP_ID(3),
@@ -171,3 +207,15 @@
 	return test_req_mem_send_sp_to_sp(FFA_MEM_DONATE_SMC32, SP_ID(1),
 					  SP_ID(3));
 }
+
+test_result_t test_req_mem_share_sp_to_vm(void)
+{
+	return test_req_mem_send_sp_to_vm(FFA_MEM_SHARE_SMC32, SP_ID(1),
+					  HYP_ID);
+}
+
+test_result_t test_req_mem_lend_sp_to_vm(void)
+{
+	return test_req_mem_send_sp_to_vm(FFA_MEM_LEND_SMC32, SP_ID(2),
+					  HYP_ID);
+}
diff --git a/tftf/tests/tests-spm.xml b/tftf/tests/tests-spm.xml
index cfc7914..9cf2ddc 100644
--- a/tftf/tests/tests-spm.xml
+++ b/tftf/tests/tests-spm.xml
@@ -78,6 +78,10 @@
                function="test_req_mem_lend_sp_to_sp" />
      <testcase name="Request Donate Memory SP-to-SP"
                function="test_req_mem_donate_sp_to_sp" />
+     <testcase name="Request Share Memory SP-to-VM"
+               function="test_req_mem_share_sp_to_vm" />
+     <testcase name="Request Lend Memory SP-to-VM"
+               function="test_req_mem_lend_sp_to_vm" />
   </testsuite>
 
   <testsuite name="SIMD,SVE Registers context"