feat(memory share): `memcpy_trapped` to read from tx

Changed the handling of the accesses to TX buffers, at the
start of handling of the following memory sharing handlers:
 - `api_ffa_mem_send`;
 - `api_ffa_mem_relinquish`;
 - `api_ffa_mem_frag_tx`;
 - `api_ffa_mem_retrieve_req`.

Change-Id: Ica821f62b178014c9cdd60a0cf9a496c331cdaee
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/api.c b/src/api.c
index 5221f87..0eddcef 100644
--- a/src/api.c
+++ b/src/api.c
@@ -3457,8 +3457,13 @@
 		return ffa_error(FFA_NO_MEMORY);
 	}
 
-	memcpy_s(allocated_entry, MM_PPOOL_ENTRY_SIZE, from_msg,
-		 fragment_length);
+	if (!memcpy_trapped(allocated_entry, MM_PPOOL_ENTRY_SIZE, from_msg,
+			    fragment_length)) {
+		dlog_error(
+			"%s: Failed to copy FF-A memory region descriptor.\n",
+			__func__);
+		return ffa_error(FFA_ABORTED);
+	}
 
 	if (!ffa_memory_region_sanity_check(allocated_entry, ffa_version,
 					    fragment_length, true)) {
@@ -3622,7 +3627,15 @@
 	 * Copy the retrieve request descriptor to an internal buffer, so that
 	 * the caller can't change it underneath us.
 	 */
-	memcpy_s(retrieve_msg, message_buffer_size, to_msg, length);
+	if (!memcpy_trapped(retrieve_msg, message_buffer_size, to_msg,
+			    length)) {
+		dlog_error(
+			"%s: Failed to copy FF-A retrieve request "
+			"descriptor.\n",
+			__func__);
+		ret = ffa_error(FFA_ABORTED);
+		goto out;
+	}
 
 	if ((vm_is_mailbox_other_world_owned(to_locked) &&
 	     !plat_ffa_acquire_receiver_rx(to_locked, &ret)) ||
@@ -3707,7 +3720,14 @@
 		ret = ffa_error(FFA_INVALID_PARAMETERS);
 		goto out;
 	}
-	memcpy_s(relinquish_request, message_buffer_size, from_msg, length);
+
+	if (!memcpy_trapped(relinquish_request, message_buffer_size, from_msg,
+			    length)) {
+		dlog_error("%s: Failed to copy FF-A relinquish request.\n",
+			   __func__);
+		ret = ffa_error(FFA_ABORTED);
+		goto out;
+	}
 
 	if (sizeof(struct ffa_mem_relinquish) +
 		    relinquish_request->endpoint_count * sizeof(ffa_id_t) !=
@@ -3840,7 +3860,12 @@
 		dlog_verbose("Failed to allocate fragment copy.\n");
 		return ffa_error(FFA_NO_MEMORY);
 	}
-	memcpy_s(fragment_copy, MM_PPOOL_ENTRY_SIZE, from_msg, fragment_length);
+
+	if (!memcpy_trapped(fragment_copy, MM_PPOOL_ENTRY_SIZE, from_msg,
+			    fragment_length)) {
+		dlog_error("%s: Failed to copy fragment.\n", __func__);
+		return ffa_error(FFA_ABORTED);
+	}
 
 	/*
 	 * Hafnium doesn't support fragmentation of memory retrieve requests