test(indirect message): aborted send from vm to sp
The SPMC shall copy the message from the VM's buffer into
the SP's when VM sends indirect message.
Test that if TX buffer of the VM is added to the realm
PAS, the operation fails smoothly with FFA_ERROR_ABORTED.
Signed-off-by: J-Alves <joao.alves@arm.com>
Change-Id: I375d1987429ed38349c25764262f386b6a4cde57
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
index 35c8301..5a60a21 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_indirect_messaging.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_indirect_messaging.c
@@ -232,3 +232,80 @@
return TEST_RESULT_SUCCESS;
}
+
+/**
+ * Test message sent from VM to SP, when VM TX is in realm PAS, the operation
+ * fails smoothly.
+ */
+test_result_t test_ffa_indirect_message_vm_to_sp_tx_realm_fail(void)
+{
+ struct ffa_value ret;
+ struct mailbox_buffers mb;
+ const ffa_id_t vm_id = 1;
+ const ffa_id_t receiver = SP_ID(1);
+ u_register_t ret_rmm;
+ char payload[] = "Poisonous...";
+ struct ffa_partition_msg *message = (struct ffa_partition_msg *)vm1_tx_buffer;
+
+ if (get_armv9_2_feat_rme_support() == 0U) {
+ return TEST_RESULT_SKIPPED;
+ }
+
+ /**********************************************************************
+ * 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);
+
+ /* Map RXTX buffers into SPMC translation. */
+ 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_rx_buffer, vm1_tx_buffer, vm_id);
+ return TEST_RESULT_FAIL;
+ }
+
+ /* Initialize message header. */
+ ffa_rxtx_header_init(vm_id, receiver, ARRAY_SIZE(payload), &message->header);
+
+ /* Fill TX buffer with payload. */
+ memcpy(message->payload, payload, ARRAY_SIZE(payload));
+
+ /* Delegate TX buffer of VM to realm PAS. */
+ ret_rmm = host_rmi_granule_delegate((u_register_t)vm1_tx_buffer);
+
+ if (ret_rmm != 0UL) {
+ INFO("Delegate operation returns %#lx for address %p\n",
+ ret_rmm, mb.send);
+ return TEST_RESULT_FAIL;
+ }
+
+ /* Expect that attempting to send message shall fail. */
+ ret = ffa_msg_send2_with_id(0, vm_id);
+
+ if (!is_expected_ffa_error(ret, FFA_ERROR_ABORTED)) {
+ return TEST_RESULT_FAIL;
+ }
+
+ /* Undelegate to reestablish the same security state for PAS. */
+ ret_rmm = host_rmi_granule_undelegate((u_register_t)vm1_tx_buffer);
+
+ if (ret_rmm != 0UL) {
+ INFO("Undelegate operation returns %#lx for address %p\n",
+ ret_rmm, mb.send);
+ return TEST_RESULT_FAIL;
+ }
+
+ /* Unmap RXTX buffers into SPMC translation. */
+ ret = ffa_rxtx_unmap_with_id(vm_id);
+
+ if (!is_expected_ffa_return(ret, FFA_SUCCESS_SMC32)) {
+ ERROR("Failed to unmap RXTX for vm %x\n", vm_id);
+ return TEST_RESULT_FAIL;
+ }
+
+ return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-memory-access.xml b/tftf/tests/tests-memory-access.xml
index 360e07f..f1d96e2 100644
--- a/tftf/tests/tests-memory-access.xml
+++ b/tftf/tests/tests-memory-access.xml
@@ -67,6 +67,8 @@
function="test_ffa_rxtx_to_realm_pas" />
<testcase name="FF-A Indirect message fails if VM RX is realm"
function="test_ffa_indirect_message_sp_to_vm_rx_realm_fail" />
+ <testcase name="FF-A Indirect message fails if VM TX is realm"
+ function="test_ffa_indirect_message_vm_to_sp_tx_realm_fail" />
</testsuite>
</testsuites>