feat(memory share): init functions for multiple borrower

Initialization functions for the memory region descriptor,
for memory sharing with multiple borrowers.

Change-Id: I3010b71270f0c7b8c7037ee6be853411e001c87e
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/inc/vmapi/hf/ffa.h b/inc/vmapi/hf/ffa.h
index 3011105..9e97684 100644
--- a/inc/vmapi/hf/ffa.h
+++ b/inc/vmapi/hf/ffa.h
@@ -975,6 +975,16 @@
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
 	enum ffa_memory_shareability shareability, uint32_t *fragment_length,
 	uint32_t *total_length);
+uint32_t ffa_memory_region_init(
+	struct ffa_memory_region *memory_region, size_t memory_region_max_size,
+	ffa_vm_id_t sender, struct ffa_memory_access receivers[],
+	uint32_t receiver_count,
+	const struct ffa_memory_region_constituent constituents[],
+	uint32_t constituent_count, uint32_t tag,
+	ffa_memory_region_flags_t flags, enum ffa_memory_type type,
+	enum ffa_memory_cacheability cacheability,
+	enum ffa_memory_shareability shareability, uint32_t *fragment_length,
+	uint32_t *total_length);
 uint32_t ffa_memory_retrieve_request_init(
 	struct ffa_memory_region *memory_region, ffa_memory_handle_t handle,
 	ffa_vm_id_t sender, ffa_vm_id_t receiver, uint32_t tag,
diff --git a/vmlib/ffa.c b/vmlib/ffa.c
index df0a156..69ce8b2 100644
--- a/vmlib/ffa.c
+++ b/vmlib/ffa.c
@@ -176,6 +176,28 @@
 	enum ffa_memory_shareability shareability, uint32_t *total_length,
 	uint32_t *fragment_length)
 {
+	struct ffa_memory_access receiver_access;
+
+	ffa_memory_access_init_permissions(&receiver_access, receiver,
+					   data_access, instruction_access, 0);
+
+	return ffa_memory_region_init(
+		memory_region, memory_region_max_size, sender, &receiver_access,
+		1, constituents, constituent_count, tag, flags, type,
+		cacheability, shareability, total_length, fragment_length);
+}
+
+uint32_t ffa_memory_region_init(
+	struct ffa_memory_region *memory_region, size_t memory_region_max_size,
+	ffa_vm_id_t sender, struct ffa_memory_access receivers[],
+	uint32_t receiver_count,
+	const struct ffa_memory_region_constituent constituents[],
+	uint32_t constituent_count, uint32_t tag,
+	ffa_memory_region_flags_t flags, enum ffa_memory_type type,
+	enum ffa_memory_cacheability cacheability,
+	enum ffa_memory_shareability shareability, uint32_t *total_length,
+	uint32_t *fragment_length)
+{
 	ffa_memory_attributes_t attributes = 0;
 
 	/* Set memory region's page attributes. */
@@ -184,10 +206,16 @@
 	ffa_set_memory_shareability_attr(&attributes, shareability);
 
 	ffa_memory_region_init_header(memory_region, sender, attributes, flags,
-				      0, tag, 1);
-	ffa_memory_access_init_permissions(&memory_region->receivers[0],
-					   receiver, data_access,
-					   instruction_access, 0);
+				      0, tag, receiver_count);
+
+#if defined(__linux__) && defined(__KERNEL__)
+	memcpy(memory_region->receivers, receivers,
+	       receiver_count * sizeof(struct ffa_memory_access));
+#else
+	memcpy_s(memory_region->receivers,
+		 MAX_MEM_SHARE_RECIPIENTS * sizeof(struct ffa_memory_access),
+		 receivers, receiver_count * sizeof(struct ffa_memory_access));
+#endif
 
 	return ffa_memory_region_init_constituents(
 		memory_region, memory_region_max_size, constituents,