test(memory share): introduce impdef value check

For some of the memory sharing tests set the impdef value for
the recievers to {vm_id, vm_id + 1} this allows us to test
that the impdef values are correctly checked for multiple
receivers and the same value is returned in the retrieve
response.

Signed-off-by: Daniel Boulby <daniel.boulby@arm.com>
Change-Id: Ia2466a5a0b6ae02017406242a28c307f901668cb
diff --git a/inc/hf/ffa_memory_internal.h b/inc/hf/ffa_memory_internal.h
index 1d8c141..77d7dae 100644
--- a/inc/hf/ffa_memory_internal.h
+++ b/inc/hf/ffa_memory_internal.h
@@ -167,8 +167,6 @@
 	uint32_t *fragment_constituent_counts, uint32_t fragment_count,
 	uint32_t sender_orig_mode, uint32_t share_func, bool clear,
 	struct mpool *page_pool);
-uint32_t ffa_memory_region_get_receiver_index(
-	struct ffa_memory_region *memory_region, ffa_id_t receiver_id);
 bool ffa_region_group_identity_map(
 	struct vm_locked vm_locked,
 	struct ffa_memory_region_constituent **fragments,
diff --git a/inc/vmapi/hf/ffa.h b/inc/vmapi/hf/ffa.h
index 95d0ead..9e88ce3 100644
--- a/inc/vmapi/hf/ffa.h
+++ b/inc/vmapi/hf/ffa.h
@@ -1148,7 +1148,8 @@
 };
 
 /**
- * Return the first FF-A version that matches the memory access descriptor size.
+ * Returns the first FF-A version that matches the memory access descriptor
+ * size.
  */
 uint32_t ffa_version_from_memory_access_desc_size(
 	uint32_t memory_access_desc_size);
@@ -1192,6 +1193,27 @@
 }
 
 /**
+ * Gets the receiver's access permissions from 'struct ffa_memory_region' and
+ * returns its index in the receiver's array. If receiver's ID doesn't exist
+ * in the array, return the region's 'receivers_count'.
+ */
+static inline uint32_t ffa_memory_region_get_receiver_index(
+	struct ffa_memory_region *memory_region, ffa_id_t receiver_id)
+{
+	uint32_t i;
+
+	for (i = 0U; i < memory_region->receiver_count; i++) {
+		struct ffa_memory_access *receiver =
+			ffa_memory_region_get_receiver(memory_region, i);
+		if (receiver->receiver_permissions.receiver == receiver_id) {
+			break;
+		}
+	}
+
+	return i;
+}
+
+/**
  * Gets the `ffa_composite_memory_region` for the given receiver from an
  * `ffa_memory_region`, or NULL if it is not valid.
  */
@@ -1278,11 +1300,12 @@
 				   ffa_memory_handle_t handle, uint32_t tag,
 				   uint32_t receiver_count,
 				   uint32_t receiver_desc_size);
-void ffa_memory_access_init_permissions(
-	struct ffa_memory_access *receiver, ffa_id_t receiver_id,
-	enum ffa_data_access data_access,
-	enum ffa_instruction_access instruction_access,
-	ffa_memory_receiver_flags_t flags);
+void ffa_memory_access_init(struct ffa_memory_access *receiver,
+			    ffa_id_t receiver_id,
+			    enum ffa_data_access data_access,
+			    enum ffa_instruction_access instruction_access,
+			    ffa_memory_receiver_flags_t flags,
+			    struct ffa_memory_access_impdef *impdef_val);
 uint32_t ffa_memory_region_init_single_receiver(
 	struct ffa_memory_region *memory_region, size_t memory_region_max_size,
 	ffa_id_t sender, ffa_id_t receiver,
@@ -1291,7 +1314,8 @@
 	ffa_memory_region_flags_t flags, enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability, uint32_t *fragment_length,
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val, 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,
@@ -1316,7 +1340,8 @@
 	ffa_memory_region_flags_t flags, enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability);
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val);
 uint32_t ffa_memory_lender_retrieve_request_init(
 	struct ffa_memory_region *memory_region, ffa_memory_handle_t handle,
 	ffa_id_t sender);
diff --git a/inc/vmapi/hf/ffa_v1_0.h b/inc/vmapi/hf/ffa_v1_0.h
index f6f98b0..a5315bf 100644
--- a/inc/vmapi/hf/ffa_v1_0.h
+++ b/inc/vmapi/hf/ffa_v1_0.h
@@ -107,11 +107,11 @@
 	ffa_memory_attributes_t attributes, ffa_memory_region_flags_t flags,
 	ffa_memory_handle_t handle, uint32_t tag, uint32_t receiver_count);
 
-void ffa_memory_access_v1_0_init_permissions(
-	struct ffa_memory_access_v1_0 *receiver, ffa_id_t receiver_id,
-	enum ffa_data_access data_access,
-	enum ffa_instruction_access instruction_access,
-	ffa_memory_receiver_flags_t flags);
+void ffa_memory_access_init_v1_0(struct ffa_memory_access_v1_0 *receiver,
+				 ffa_id_t receiver_id,
+				 enum ffa_data_access data_access,
+				 enum ffa_instruction_access instruction_access,
+				 ffa_memory_receiver_flags_t flags);
 
 uint32_t ffa_memory_region_init_v1_0(
 	struct ffa_memory_region_v1_0 *memory_region,
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index eb06b25..820d010 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -2166,7 +2166,7 @@
 		 * Initialized here as in memory retrieve responses we currently
 		 * expect one borrower to be specified.
 		 */
-		ffa_memory_access_v1_0_init_permissions(
+		ffa_memory_access_init_v1_0(
 			receiver, receiver_id,
 			ffa_get_data_access_attr(permissions),
 			ffa_get_instruction_access_attr(permissions), flags);
@@ -2209,18 +2209,14 @@
 		 * Initialized here as in memory retrieve responses we currently
 		 * expect one borrower to be specified.
 		 */
-		ffa_memory_access_init_permissions(
+		ffa_memory_access_init(
 			receiver, receiver_id,
 			ffa_get_data_access_attr(permissions),
-			ffa_get_instruction_access_attr(permissions), flags);
+			ffa_get_instruction_access_attr(permissions), flags,
+			&receiver_impdef_val);
 		receiver->composite_memory_region_offset = composite_offset;
 		composite_memory_region =
 			ffa_memory_region_get_composite(retrieve_response, 0);
-		if (ffa_version_from_memory_access_desc_size(
-			    memory_access_desc_size) >=
-		    MAKE_FFA_VERSION(1, 2)) {
-			receiver->impdef = receiver_impdef_val;
-		}
 	}
 
 	assert(composite_memory_region != NULL);
@@ -2258,30 +2254,6 @@
 	return true;
 }
 
-/*
- * Gets the receiver's access permissions from 'struct ffa_memory_region' and
- * returns its index in the receiver's array. If receiver's ID doesn't exist
- * in the array, return the region's 'receiver_count'.
- */
-uint32_t ffa_memory_region_get_receiver_index(
-	struct ffa_memory_region *memory_region, ffa_id_t receiver_id)
-{
-	uint32_t i;
-
-	assert(memory_region != NULL);
-
-	for (i = 0U; i < memory_region->receiver_count; i++) {
-		struct ffa_memory_access *receiver =
-			ffa_memory_region_get_receiver(memory_region, i);
-		assert(receiver != NULL);
-		if (receiver->receiver_permissions.receiver == receiver_id) {
-			break;
-		}
-	}
-
-	return i;
-}
-
 /**
  * Validates the retrieved permissions against those specified by the lender
  * of memory share operation. Optionally can help set the permissions to be used
diff --git a/test/inc/test/vmapi/ffa.h b/test/inc/test/vmapi/ffa.h
index 43c5991..f013002 100644
--- a/test/inc/test/vmapi/ffa.h
+++ b/test/inc/test/vmapi/ffa.h
@@ -91,7 +91,8 @@
 	enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability);
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val);
 void send_retrieve_request(
 	void *send, ffa_memory_handle_t handle, ffa_id_t sender,
 	struct ffa_memory_access receivers[], uint32_t receiver_count,
diff --git a/test/vmapi/common/ffa.c b/test/vmapi/common/ffa.c
index 179fdca..544dd89 100644
--- a/test/vmapi/common/ffa.c
+++ b/test/vmapi/common/ffa.c
@@ -262,14 +262,19 @@
 {
 	struct ffa_memory_access receiver_send_permissions;
 	struct ffa_memory_access receiver_retrieve_permissions;
+	/*
+	 * Use the sender id as the impdef value so we can use this in later
+	 * testing.
+	 */
+	struct ffa_memory_access_impdef impdef_val = {{sender, sender + 1}};
 
-	ffa_memory_access_init_permissions(&receiver_send_permissions,
-					   recipient, send_data_access,
-					   send_instruction_access, 0);
+	ffa_memory_access_init(&receiver_send_permissions, recipient,
+			       send_data_access, send_instruction_access, 0,
+			       &impdef_val);
 
-	ffa_memory_access_init_permissions(&receiver_retrieve_permissions,
-					   recipient, retrieve_data_access,
-					   retrieve_instruction_access, 0);
+	ffa_memory_access_init(&receiver_retrieve_permissions, recipient,
+			       retrieve_data_access,
+			       retrieve_instruction_access, 0, &impdef_val);
 
 	return send_memory_and_retrieve_request_multi_receiver(
 		share_func, tx_buffer, sender, constituents, constituent_count,
@@ -301,6 +306,7 @@
 	struct ffa_partition_msg *retrieve_message;
 	bool not_specify_memory_type = share_func == FFA_MEM_DONATE_32 ||
 				       (share_func == FFA_MEM_LEND_32);
+	struct ffa_memory_access_impdef impdef_val = {{sender, sender + 1}};
 
 	/* Send everything except the last constituent in the first fragment. */
 	remaining_constituent_count = ffa_memory_region_init_single_receiver(
@@ -310,7 +316,7 @@
 		not_specify_memory_type ? FFA_MEMORY_NOT_SPECIFIED_MEM
 					: FFA_MEMORY_NORMAL_MEM,
 		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
-		&total_length, &fragment_length);
+		&impdef_val, &total_length, &fragment_length);
 	EXPECT_EQ(remaining_constituent_count, 0);
 	EXPECT_EQ(total_length, fragment_length);
 	/* Don't include the last constituent in the first fragment. */
@@ -352,7 +358,8 @@
 		(struct ffa_memory_region *)retrieve_message->payload, handle,
 		sender, recipient, 0, flags, retrieve_data_access,
 		retrieve_instruction_access, FFA_MEMORY_NORMAL_MEM,
-		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
+		&impdef_val);
 	ffa_rxtx_header_init(sender, recipient, msg_size,
 			     &retrieve_message->header);
 	EXPECT_LE(msg_size, HF_MAILBOX_SIZE);
@@ -367,13 +374,13 @@
 	enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability)
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val)
 {
 	struct ffa_memory_access receiver_retrieve_permissions;
 
-	ffa_memory_access_init_permissions(&receiver_retrieve_permissions,
-					   receiver, data_access,
-					   instruction_access, 0);
+	ffa_memory_access_init(&receiver_retrieve_permissions, receiver,
+			       data_access, instruction_access, 0, impdef_val);
 
 	send_retrieve_request(send, handle, sender,
 			      &receiver_retrieve_permissions, 1, tag, flags,
diff --git a/test/vmapi/ffa_both_worlds_el3_spmc/memory_sharing.c b/test/vmapi/ffa_both_worlds_el3_spmc/memory_sharing.c
index 2847e45..64c584a 100644
--- a/test/vmapi/ffa_both_worlds_el3_spmc/memory_sharing.c
+++ b/test/vmapi/ffa_both_worlds_el3_spmc/memory_sharing.c
@@ -48,7 +48,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	ret = ffa_mem_share(msg_size, msg_size);
 	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
@@ -86,7 +86,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	ret = ffa_mem_share(msg_size, msg_size);
 	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
@@ -99,7 +99,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	ret = ffa_mem_share(msg_size, msg_size);
 	EXPECT_EQ(ret.func, FFA_ERROR_32);
@@ -132,7 +132,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_lend(msg_size, msg_size);
@@ -174,7 +174,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, &msg_size,
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size,
 			  &fragment_length),
 		  0);
 	EXPECT_EQ(msg_size, fragment_length);
@@ -248,7 +248,7 @@
 				  invalid_attributes[i].memory_type,
 				  invalid_attributes[i].memory_cacheability,
 				  invalid_attributes[i].memory_shareability,
-				  NULL, &msg_size),
+				  NULL, NULL, &msg_size),
 			  0);
 
 		/* Call the various mem send functions on the same region. */
@@ -287,7 +287,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Using the same region, call the various mem send functions. */
@@ -324,7 +324,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_lend(msg_size, msg_size);
@@ -361,7 +361,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_lend(msg_size, msg_size);
@@ -397,7 +397,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_share(msg_size, msg_size);
@@ -437,7 +437,7 @@
 			  FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_share(msg_size, msg_size);
diff --git a/test/vmapi/ffa_both_worlds_el3_spmc/services/arch/aarch64/secure/memory.c b/test/vmapi/ffa_both_worlds_el3_spmc/services/arch/aarch64/secure/memory.c
index 8ca4e3c..269413d 100644
--- a/test/vmapi/ffa_both_worlds_el3_spmc/services/arch/aarch64/secure/memory.c
+++ b/test/vmapi/ffa_both_worlds_el3_spmc/services/arch/aarch64/secure/memory.c
@@ -98,7 +98,7 @@
 		hf_vm_get_id(), tag, flags, FFA_DATA_ACCESS_RW,
 		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 		FFA_MEMORY_NOT_SPECIFIED_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-		FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 	retrieve_memory(mb.recv, handle, retrieved_memory, HF_MAILBOX_SIZE,
 			msg_size);
diff --git a/test/vmapi/primary_with_secondaries/memory_sharing.c b/test/vmapi/primary_with_secondaries/memory_sharing.c
index 53ffc82..8a6ff7e 100644
--- a/test/vmapi/primary_with_secondaries/memory_sharing.c
+++ b/test/vmapi/primary_with_secondaries/memory_sharing.c
@@ -62,6 +62,8 @@
 	size_t m = 0;
 
 	for (i = 0; i < ARRAY_SIZE(vms); ++i) {
+		struct ffa_memory_access_impdef impdef_val = {
+			{vms[i], vms[i] + 1}};
 		/* Optionally skip one VM as the send would succeed. */
 		if (vms[i] == avoid_vm) {
 			continue;
@@ -88,6 +90,7 @@
 								FFA_MEMORY_NORMAL_MEM,
 								cacheability[m],
 								shareability[l],
+								&impdef_val,
 								NULL,
 								&msg_size),
 							0);
@@ -121,6 +124,7 @@
 								FFA_MEMORY_DEVICE_MEM,
 								device[m],
 								shareability[l],
+								&impdef_val,
 								NULL,
 								&msg_size),
 							0);
@@ -198,7 +202,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NORMAL_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		ret = ffa_mem_donate(msg_size, msg_size);
 		EXPECT_EQ(ret.func, FFA_ERROR_32);
@@ -305,7 +310,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Call base function's test. */
@@ -332,7 +337,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Call base function's test. */
@@ -358,7 +363,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Call base function's test. */
@@ -395,7 +400,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Call base function's test. */
@@ -411,7 +416,7 @@
 	send_retrieve_request_single_receiver(
 		mb.send, handle, HF_PRIMARY_VM_ID, service1_info->vm_id, 0, 0,
 		FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-		FFA_MEMORY_NOT_SPECIFIED_MEM, 0, 0);
+		FFA_MEMORY_NOT_SPECIFIED_MEM, 0, 0, NULL);
 
 	EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
 
@@ -1230,7 +1235,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size),
@@ -1258,7 +1263,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size),
 			 FFA_INVALID_PARAMETERS);
@@ -1285,7 +1290,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size),
 			 FFA_INVALID_PARAMETERS);
@@ -1321,7 +1326,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
@@ -1332,7 +1337,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
@@ -1343,7 +1348,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
@@ -1399,7 +1404,7 @@
 					FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 					FFA_MEMORY_NORMAL_MEM,
 					FFA_MEMORY_CACHE_WRITE_BACK,
-					FFA_MEMORY_INNER_SHAREABLE, NULL,
+					FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
 					&msg_size),
 				0);
 			EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size),
@@ -1413,7 +1418,7 @@
 					FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 					FFA_MEMORY_NORMAL_MEM,
 					FFA_MEMORY_CACHE_WRITE_BACK,
-					FFA_MEMORY_INNER_SHAREABLE, NULL,
+					FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
 					&msg_size),
 				0);
 			EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size),
@@ -1451,7 +1456,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size), FFA_DENIED);
 
@@ -1852,7 +1857,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size),
 				 FFA_DENIED);
@@ -1867,7 +1873,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 }
@@ -1924,7 +1930,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size),
 				 FFA_DENIED);
@@ -1939,7 +1946,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 }
@@ -2013,7 +2020,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size), FFA_DENIED);
 	}
@@ -2079,7 +2087,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NORMAL_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size), FFA_DENIED);
 	}
@@ -2148,7 +2157,7 @@
 			  FFA_MEMORY_REGION_FLAG_CLEAR, FFA_DATA_ACCESS_RO,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size),
 			 FFA_INVALID_PARAMETERS);
@@ -2312,7 +2321,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Using the same region, call the various mem send functions. */
@@ -2366,7 +2375,7 @@
 				  invalid_attributes[i].memory_type,
 				  invalid_attributes[i].memory_cacheability,
 				  invalid_attributes[i].memory_shareability,
-				  NULL, &msg_size),
+				  NULL, NULL, &msg_size),
 			  0);
 
 		/* Call the various mem send functions on the same region. */
@@ -2420,7 +2429,8 @@
 					  ? FFA_MEMORY_NORMAL_MEM
 					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 
 		ret = send_function[i](msg_size, msg_size);
@@ -2436,7 +2446,7 @@
 				FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				FFA_MEMORY_NORMAL_MEM,
 				FFA_MEMORY_CACHE_WRITE_BACK,
-				FFA_MEMORY_INNER_SHAREABLE);
+				FFA_MEMORY_INNER_SHAREABLE, NULL);
 			EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func,
 				  FFA_YIELD_32);
 		}
@@ -2446,6 +2456,69 @@
 }
 
 /**
+ * Check a different value for the impdef field of the receiver struct
+ * between the memory send transaction and the retrieve request causes
+ * the retrieve request to fail with FFA_INVALID_PARAMETERS and the
+ * memory to not be allocated to the endpoint.
+ */
+TEST(memory_sharing, ffa_validate_impdef_equal)
+{
+	struct ffa_value ret;
+	struct mailbox_buffers mb = set_up_mailbox();
+	uint32_t msg_size;
+	ffa_memory_handle_t handle;
+	struct ffa_partition_info *service1_info = service1(mb.recv);
+
+	struct ffa_value (*send_function[])(uint32_t, uint32_t) = {
+		ffa_mem_share,
+		ffa_mem_lend,
+	};
+
+	struct ffa_memory_region_constituent constituents[] = {
+		{.address = (uint64_t)pages, .page_count = 2},
+		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
+	};
+
+	SERVICE_SELECT(service1_info->vm_id,
+		       "ffa_memory_share_fail_invalid_parameters", mb.send);
+
+	for (unsigned int i = 0; i < ARRAY_SIZE(send_function); i++) {
+		/* Prepare memory region, and set all flags */
+		EXPECT_EQ(ffa_memory_region_init_single_receiver(
+				  mb.send, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID,
+				  service1_info->vm_id, constituents,
+				  ARRAY_SIZE(constituents), 0, 0,
+				  FFA_DATA_ACCESS_RW,
+				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
+				  FFA_MEMORY_CACHE_WRITE_BACK,
+				  FFA_MEMORY_INNER_SHAREABLE,
+				  &((struct ffa_memory_access_impdef){
+					  {0xAAAA, 0xBBBB}}),
+				  NULL, &msg_size),
+			  0);
+
+		ret = send_function[i](msg_size, msg_size);
+		EXPECT_EQ(ret.func, FFA_SUCCESS_32);
+
+		handle = ffa_mem_success_handle(ret);
+
+		send_retrieve_request_single_receiver(
+			mb.send, handle, HF_PRIMARY_VM_ID, service1_info->vm_id,
+			0, 0, FFA_DATA_ACCESS_RW,
+			FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
+			FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			FFA_MEMORY_INNER_SHAREABLE,
+			&((struct ffa_memory_access_impdef){{0xCCCC, 0xDDDD}}));
+
+		EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
+
+		EXPECT_EQ(ffa_mem_reclaim(handle, 0).func, FFA_SUCCESS_32);
+	}
+}
+/**
  * Memory can't be shared with arbitrary attributes because Hafnium maps pages
  * with hardcoded values and doesn't support custom mappings.
  */
@@ -2498,7 +2571,8 @@
 					  ? FFA_MEMORY_NORMAL_MEM
 					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 
 		ret = send_function[i](msg_size, msg_size);
@@ -2513,7 +2587,8 @@
 				FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				invalid_attributes[j].memory_type,
 				invalid_attributes[j].memory_cacheability,
-				invalid_attributes[j].memory_shareability);
+				invalid_attributes[j].memory_shareability,
+				NULL);
 			EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func,
 				  FFA_YIELD_32);
 		}
@@ -2550,7 +2625,7 @@
 			  FFA_MEMORY_REGION_FLAG_CLEAR, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_share(msg_size, msg_size);
@@ -2568,7 +2643,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_share(msg_size, msg_size);
@@ -2583,7 +2658,7 @@
 			FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH,
 		FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 		FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-		FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 	EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
 
@@ -2618,7 +2693,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	ret = ffa_mem_lend(msg_size, msg_size);
@@ -2634,7 +2709,7 @@
 		mb.send, handle, HF_PRIMARY_VM_ID, service1_info->vm_id, 0,
 		FFA_MEMORY_REGION_FLAG_CLEAR, FFA_DATA_ACCESS_RO,
 		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, FFA_MEMORY_NORMAL_MEM,
-		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 	EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
 	EXPECT_EQ(ffa_mem_reclaim(handle, 0).func, FFA_SUCCESS_32);
@@ -2656,6 +2731,7 @@
 		ffa_mem_donate,
 	};
 	struct ffa_partition_info *service1_info = service1(mb.recv);
+
 	struct ffa_memory_region_constituent constituents[] = {
 		{.address = (uint64_t)pages, .page_count = 2},
 		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
@@ -2680,7 +2756,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 
 		ret = send_function[i](msg_size, msg_size);
@@ -2701,7 +2778,7 @@
 				? FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED
 				: FFA_INSTRUCTION_ACCESS_NX,
 			FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			FFA_MEMORY_INNER_SHAREABLE);
+			FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 		EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
 		EXPECT_EQ(ffa_mem_reclaim(handle, 0).func, FFA_SUCCESS_32);
@@ -2725,6 +2802,7 @@
 		ffa_mem_donate,
 	};
 	struct ffa_partition_info *service1_info = service1(mb.recv);
+
 	struct ffa_memory_region_constituent constituents[] = {
 		{.address = (uint64_t)pages, .page_count = 2},
 		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
@@ -2747,7 +2825,8 @@
 					  ? FFA_MEMORY_NORMAL_MEM
 					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 
 		ret = send_function[i](msg_size, msg_size);
@@ -2772,7 +2851,7 @@
 				? FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED
 				: FFA_INSTRUCTION_ACCESS_NX,
 			FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			FFA_MEMORY_INNER_SHAREABLE);
+			FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 		EXPECT_EQ(ffa_run(service1_info->vm_id, 0).func, FFA_YIELD_32);
 
@@ -2831,13 +2910,17 @@
 	struct ffa_partition_info *service1_info = service1(mb.recv);
 	struct ffa_partition_info *service2_info = service2(mb.recv);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -2882,13 +2965,17 @@
 	struct ffa_partition_info *service1_info = service1(mb.recv);
 	struct ffa_partition_info *service2_info = service2(mb.recv);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -2931,13 +3018,17 @@
 	ffa_id_t own_id = hf_vm_get_id();
 	struct ffa_partition_msg *retrieve_message = mb.send;
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -3001,13 +3092,17 @@
 	struct ffa_partition_info *service1_info = service1(mb.recv);
 	struct ffa_partition_info *service2_info = service2(mb.recv);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -3096,13 +3191,17 @@
 	struct ffa_partition_info *service1_info = service1(mb.recv);
 	struct ffa_partition_info *service2_info = service2(mb.recv);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -3134,13 +3233,15 @@
 	struct ffa_memory_access receivers[2];
 	uint32_t msg_size;
 
-	ffa_memory_access_init_permissions(&receivers[0], receiver_id1,
-					   data_access1, instruction_access1,
-					   0);
+	ffa_memory_access_init(&receivers[0], receiver_id1, data_access1,
+			       instruction_access1, 0,
+			       &((struct ffa_memory_access_impdef){
+				       {receiver_id1, receiver_id1 + 1}}));
 
-	ffa_memory_access_init_permissions(&receivers[1], receiver_id2,
-					   data_access2, instruction_access2,
-					   0);
+	ffa_memory_access_init(&receivers[1], receiver_id2, data_access2,
+			       instruction_access2, 0,
+			       &((struct ffa_memory_access_impdef){
+				       {receiver_id2, receiver_id2 + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -3221,13 +3322,17 @@
 	struct ffa_partition_info *service1_info = service1(mb.recv);
 	struct ffa_partition_info *service2_info = service2(mb.recv);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	for (i = 0; i < ARRAY_SIZE(receivers); i++) {
 		ffa_id_t vm_id = receivers[i].receiver_permissions.receiver;
@@ -3293,13 +3398,13 @@
 
 	SERVICE_SELECT(service1_info->vm_id, "memory_increment", mb.send);
 
-	ffa_memory_access_v1_0_init_permissions(
-		&receiver_v1_0, service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+	ffa_memory_access_init_v1_0(&receiver_v1_0, service1_info->vm_id,
+				    FFA_DATA_ACCESS_RW,
+				    FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
 
-	ffa_memory_access_init_permissions(
-		&receiver_v1_1, service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+	ffa_memory_access_init(&receiver_v1_1, service1_info->vm_id,
+			       FFA_DATA_ACCESS_RW,
+			       FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0, NULL);
 
 	/* Initialize memory sharing test according to v1.0. */
 	ffa_memory_region_init_v1_0(
@@ -3364,12 +3469,15 @@
 
 	SERVICE_SELECT(service1_info->vm_id, "retrieve_ffa_v1_0", mb.send);
 
-	ffa_memory_access_v1_0_init_permissions(
-		&receiver_v1_0, service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init_v1_0(&receiver_v1_0, service1_info->vm_id,
+				    FFA_DATA_ACCESS_RW,
+				    FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+
+	ffa_memory_access_init(
 		&receiver_v1_1, service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
 	/* Initialize memory sharing test according to v1.1. */
 	ffa_memory_region_init((struct ffa_memory_region *)mb.send,
@@ -3441,7 +3549,8 @@
 		service1_info->vm_id, constituents, ARRAY_SIZE(constituents), 0,
 		0, FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 		FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-		FFA_MEMORY_INNER_SHAREABLE, &total_length, &fragment_length);
+		FFA_MEMORY_INNER_SHAREABLE, NULL, &total_length,
+		&fragment_length);
 	EXPECT_EQ(remaining_constituent_count, 0);
 	EXPECT_EQ(total_length, fragment_length);
 
@@ -3461,7 +3570,7 @@
 		hf_vm_get_id(), service1_info->vm_id, 0, 0,
 		FFA_DATA_ACCESS_NOT_SPECIFIED,
 		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, FFA_MEMORY_NORMAL_MEM,
-		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE, NULL);
 	ffa_rxtx_header_init(hf_vm_get_id(), service1_info->vm_id, msg_size,
 			     &retrieve_message->header);
 	EXPECT_LE(msg_size, HF_MAILBOX_SIZE);
@@ -3494,9 +3603,9 @@
 
 	SERVICE_SELECT(service1_info->vm_id, "retrieve_ffa_v1_0", mb.send);
 
-	ffa_memory_access_v1_0_init_permissions(
-		&receiver_v1_0, service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+	ffa_memory_access_init_v1_0(&receiver_v1_0, service1_info->vm_id,
+				    FFA_DATA_ACCESS_RW,
+				    FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
 
 	/* Initialize memory sharing test according to v1.0. */
 	remaining_constituent_count = ffa_memory_region_init_v1_0(
@@ -3584,7 +3693,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* Write to memory. */
@@ -3604,7 +3713,7 @@
 		HF_PRIMARY_VM_ID, service1_info->vm_id, 0,
 		FFA_MEMORY_REGION_FLAG_CLEAR_RELINQUISH, FFA_DATA_ACCESS_RW,
 		FFA_INSTRUCTION_ACCESS_NX, FFA_MEMORY_NORMAL_MEM,
-		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE);
+		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE, NULL);
 
 	EXPECT_LE(msg_size, HF_MAILBOX_SIZE);
 
@@ -3663,13 +3772,17 @@
 	SERVICE_SELECT(service2_info->vm_id,
 		       "memory_increment_relinquish_check_not_zeroed", mb.send);
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[0], service1_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service1_info->vm_id, service1_info->vm_id + 1}}));
 
-	ffa_memory_access_init_permissions(
+	ffa_memory_access_init(
 		&receivers[1], service2_info->vm_id, FFA_DATA_ACCESS_RW,
-		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0);
+		FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED, 0,
+		&((struct ffa_memory_access_impdef){
+			{service2_info->vm_id, service2_info->vm_id + 1}}));
 
 	ffa_memory_region_init(
 		mem_region, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID, receivers,
@@ -3750,7 +3863,7 @@
 			  ARRAY_SIZE(constituents), 0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/*
@@ -3804,7 +3917,8 @@
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 				  FFA_MEMORY_NORMAL_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size),
 				 FFA_INVALID_PARAMETERS);
diff --git a/test/vmapi/primary_with_secondaries/services/memory.c b/test/vmapi/primary_with_secondaries/services/memory.c
index 10e0389..f7a0d08 100644
--- a/test/vmapi/primary_with_secondaries/services/memory.c
+++ b/test/vmapi/primary_with_secondaries/services/memory.c
@@ -470,7 +470,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
@@ -542,7 +542,7 @@
 			  FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 	ffa_yield();
@@ -759,7 +759,7 @@
 			  composite->constituent_count, 0, 0,
 			  FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_X,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size), FFA_DENIED);
 
@@ -770,7 +770,7 @@
 			  composite->constituent_count, 0, 0,
 			  FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_X,
 			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size), FFA_DENIED);
 
@@ -952,7 +952,8 @@
 				  FFA_INSTRUCTION_ACCESS_X,
 				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
-				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				  &msg_size),
 			  0);
 		EXPECT_FFA_ERROR(ffa_mem_lend(msg_size, msg_size), FFA_DENIED);
 		EXPECT_EQ(
@@ -962,7 +963,8 @@
 				0, 0, FFA_DATA_ACCESS_RW,
 				FFA_INSTRUCTION_ACCESS_X, FFA_MEMORY_NORMAL_MEM,
 				FFA_MEMORY_CACHE_WRITE_BACK,
-				FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+				FFA_MEMORY_INNER_SHAREABLE, NULL, NULL,
+				&msg_size),
 			0);
 		EXPECT_FFA_ERROR(ffa_mem_share(msg_size, msg_size), FFA_DENIED);
 	}
@@ -1078,7 +1080,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 
 	/* All three memory sharing interfaces must fail. */
diff --git a/test/vmapi/primary_with_secondaries/services/unmapped.c b/test/vmapi/primary_with_secondaries/services/unmapped.c
index eb879cc..e6eb611 100644
--- a/test/vmapi/primary_with_secondaries/services/unmapped.c
+++ b/test/vmapi/primary_with_secondaries/services/unmapped.c
@@ -44,7 +44,7 @@
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
 			  FFA_MEMORY_NOT_SPECIFIED_MEM,
 			  FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			  FFA_MEMORY_INNER_SHAREABLE, NULL, NULL, &msg_size),
 		  0);
 	exception_setup(NULL, exception_handler_yield_data_abort);
 
diff --git a/vmlib/ffa.c b/vmlib/ffa.c
index 0455e8b..6c85ec3 100644
--- a/vmlib/ffa.c
+++ b/vmlib/ffa.c
@@ -49,11 +49,12 @@
  * Initializes receiver permissions, in a memory transaction descriptor
  * and zero out the other fields to be set later if required.
  */
-void ffa_memory_access_init_permissions(
-	struct ffa_memory_access *receiver, ffa_id_t receiver_id,
-	enum ffa_data_access data_access,
-	enum ffa_instruction_access instruction_access,
-	ffa_memory_receiver_flags_t flags)
+void ffa_memory_access_init(struct ffa_memory_access *receiver,
+			    ffa_id_t receiver_id,
+			    enum ffa_data_access data_access,
+			    enum ffa_instruction_access instruction_access,
+			    ffa_memory_receiver_flags_t flags,
+			    struct ffa_memory_access_impdef *impdef_val)
 {
 	ffa_memory_access_permissions_t permissions = 0;
 
@@ -69,7 +70,10 @@
 				.flags = flags,
 			},
 		.composite_memory_region_offset = 0ULL,
-		.impdef = {0ULL, 0ULL},
+		.impdef = impdef_val != NULL
+				  ? *impdef_val
+				  : (struct ffa_memory_access_impdef){{0ULL,
+								       0ULL}},
 		receiver->reserved_0 = 0ULL,
 	};
 }
@@ -206,13 +210,14 @@
 	ffa_memory_region_flags_t flags, enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability, uint32_t *total_length,
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val, 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);
+	ffa_memory_access_init(&receiver_access, receiver, data_access,
+			       instruction_access, 0, impdef_val);
 
 	return ffa_memory_region_init(
 		memory_region, memory_region_max_size, sender, &receiver_access,
@@ -271,12 +276,13 @@
 	ffa_memory_region_flags_t flags, enum ffa_data_access data_access,
 	enum ffa_instruction_access instruction_access,
 	enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
-	enum ffa_memory_shareability shareability)
+	enum ffa_memory_shareability shareability,
+	struct ffa_memory_access_impdef *impdef_val)
 {
 	struct ffa_memory_access receiver_access;
 
-	ffa_memory_access_init_permissions(&receiver_access, receiver,
-					   data_access, instruction_access, 0);
+	ffa_memory_access_init(&receiver_access, receiver, data_access,
+			       instruction_access, 0, impdef_val);
 
 	return ffa_memory_retrieve_request_init(
 		memory_region, handle, sender, &receiver_access, 1,
diff --git a/vmlib/ffa_v1_0.c b/vmlib/ffa_v1_0.c
index 3a1fe5d..8c81d0b 100644
--- a/vmlib/ffa_v1_0.c
+++ b/vmlib/ffa_v1_0.c
@@ -26,11 +26,11 @@
  * Initializes receiver permissions, in a v1.0 memory transaction descriptor
  * and zero out the other fields to be set later if requred.
  */
-void ffa_memory_access_v1_0_init_permissions(
-	struct ffa_memory_access_v1_0 *receiver, ffa_id_t receiver_id,
-	enum ffa_data_access data_access,
-	enum ffa_instruction_access instruction_access,
-	ffa_memory_receiver_flags_t flags)
+void ffa_memory_access_init_v1_0(struct ffa_memory_access_v1_0 *receiver,
+				 ffa_id_t receiver_id,
+				 enum ffa_data_access data_access,
+				 enum ffa_instruction_access instruction_access,
+				 ffa_memory_receiver_flags_t flags)
 {
 	ffa_memory_access_permissions_t permissions = 0;