Adding sender field to memory region descriptor.

This was added in the latest SPCI specification beta.

Bug: 132420445
Change-Id: I75b6e08e95bb257f362cc912c0fd946a7171a417
diff --git a/inc/vmapi/hf/spci.h b/inc/vmapi/hf/spci.h
index 2181799..12600c1 100644
--- a/inc/vmapi/hf/spci.h
+++ b/inc/vmapi/hf/spci.h
@@ -264,6 +264,10 @@
 	uint32_t tag;
 	/** Flags to control behaviour of the transaction. */
 	spci_memory_region_flags_t flags;
+	/** Sender VM ID. */
+	spci_vm_id_t sender;
+	/** Reserved field, must be 0. */
+	uint16_t reserved;
 	/**
 	 * The total number of 4 kiB pages included in this memory region. This
 	 * must be equal to the sum of page counts specified in each
@@ -306,7 +310,8 @@
 }
 
 uint32_t spci_memory_region_init(
-	struct spci_memory_region *memory_region, spci_vm_id_t receiver,
+	struct spci_memory_region *memory_region, spci_vm_id_t sender,
+	spci_vm_id_t receiver,
 	const struct spci_memory_region_constituent constituents[],
 	uint32_t constituent_count, uint32_t tag,
 	spci_memory_region_flags_t flags, enum spci_memory_access access,
diff --git a/src/spci_architected_message.c b/src/spci_architected_message.c
index c17daf4..06106d5 100644
--- a/src/spci_architected_message.c
+++ b/src/spci_architected_message.c
@@ -588,6 +588,11 @@
 		return spci_error(SPCI_INVALID_PARAMETERS);
 	}
 
+	/* The sender must match the message sender. */
+	if (memory_region->sender != from_locked.vm->id) {
+		return spci_error(SPCI_INVALID_PARAMETERS);
+	}
+
 	/* We only support a single recipient. */
 	if (memory_region->attribute_count != 1) {
 		return spci_error(SPCI_INVALID_PARAMETERS);
diff --git a/test/vmapi/primary_with_secondaries/memory_sharing.c b/test/vmapi/primary_with_secondaries/memory_sharing.c
index a697e06..fd742f0 100644
--- a/test/vmapi/primary_with_secondaries/memory_sharing.c
+++ b/test/vmapi/primary_with_secondaries/memory_sharing.c
@@ -66,8 +66,9 @@
 				for (l = 0; l < ARRAY_SIZE(cacheability); ++l) {
 					uint32_t msg_size =
 						spci_memory_region_init(
-							mb.send, vms[i],
-							constituents,
+							mb.send,
+							HF_PRIMARY_VM_ID,
+							vms[i], constituents,
 							constituent_count, 0, 0,
 							access[j],
 							SPCI_MEMORY_NORMAL_MEM,
@@ -82,8 +83,9 @@
 				for (l = 0; l < ARRAY_SIZE(device); ++l) {
 					uint32_t msg_size =
 						spci_memory_region_init(
-							mb.send, vms[i],
-							constituents,
+							mb.send,
+							HF_PRIMARY_VM_ID,
+							vms[i], constituents,
 							constituent_count, 0, 0,
 							access[j],
 							SPCI_MEMORY_DEVICE_MEM,
@@ -146,9 +148,9 @@
 			continue;
 		}
 		msg_size = spci_memory_region_init(
-			mb.send, vms[i], constituents, constituent_count, 0, 0,
-			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-			SPCI_MEMORY_CACHE_WRITE_BACK,
+			mb.send, HF_PRIMARY_VM_ID, vms[i], constituents,
+			constituent_count, 0, 0, SPCI_MEMORY_RW_X,
+			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
 		EXPECT_SPCI_ERROR(
 			spci_msg_send(HF_PRIMARY_VM_ID, vms[i], msg_size,
@@ -173,7 +175,7 @@
 	for (i = 0; i < ARRAY_SIZE(vms); ++i) {
 		for (j = 0; j < ARRAY_SIZE(vms); ++j) {
 			uint32_t msg_size = spci_memory_region_init(
-				mb.send, vms[i], constituents,
+				mb.send, vms[j], vms[i], constituents,
 				constituent_count, 0, 0, SPCI_MEMORY_RW_X,
 				SPCI_MEMORY_NORMAL_MEM,
 				SPCI_MEMORY_CACHE_WRITE_BACK,
@@ -211,10 +213,10 @@
 	memset_s(ptr, sizeof(pages), 'a', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		SPCI_MEMORY_REGION_FLAG_CLEAR, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, SPCI_MEMORY_REGION_FLAG_CLEAR,
+		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -258,9 +260,10 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
 			  .func,
@@ -321,9 +324,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
@@ -366,9 +370,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
@@ -401,9 +406,10 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -441,9 +447,10 @@
 	memset_s(ptr, sizeof(pages), 'c', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -478,9 +485,10 @@
 
 	/* Share the memory initially. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -493,9 +501,10 @@
 
 	/* Share the memory again after it has been returned. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -524,9 +533,10 @@
 
 	/* Share the memory initially. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -539,9 +549,10 @@
 
 	/* Share the memory with a different VM after it has been returned. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM2, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -646,9 +657,10 @@
 	pages[0] = 0;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -669,9 +681,10 @@
 	pages[PAGE_SIZE] = 1;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -710,9 +723,10 @@
 	pages[0] = 0;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -733,9 +747,10 @@
 	pages[PAGE_SIZE] = 1;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -772,9 +787,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
@@ -788,9 +804,10 @@
 
 	/* Share the memory with another VM. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM2, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -828,9 +845,10 @@
 
 	/* Donate memory. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -877,9 +895,10 @@
 
 	/* Donate memory to VM1. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -929,7 +948,7 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, HF_PRIMARY_VM_ID, constituents,
+		mb.send, HF_PRIMARY_VM_ID, HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -956,7 +975,7 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, HF_PRIMARY_VM_ID, constituents,
+		mb.send, HF_PRIMARY_VM_ID, HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -982,7 +1001,7 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, HF_PRIMARY_VM_ID, constituents,
+		mb.send, HF_PRIMARY_VM_ID, HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1013,7 +1032,7 @@
 
 	/* Try invalid configurations. */
 	msg_size = spci_memory_region_init(
-		mb.send, HF_PRIMARY_VM_ID, constituents,
+		mb.send, SERVICE_VM1, HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1022,26 +1041,29 @@
 			  SPCI_INVALID_PARAMETERS);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, SERVICE_VM1, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_SPCI_ERROR(spci_msg_send(SERVICE_VM1, SERVICE_VM1, msg_size,
 					SPCI_MSG_SEND_LEGACY_MEMORY_DONATE),
 			  SPCI_INVALID_PARAMETERS);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, SERVICE_VM2, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_SPCI_ERROR(spci_msg_send(SERVICE_VM2, SERVICE_VM1, msg_size,
 					SPCI_MSG_SEND_LEGACY_MEMORY_DONATE),
 			  SPCI_INVALID_PARAMETERS);
 
 	/* Successfully donate to VM1. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -1080,8 +1102,8 @@
 				 .page_count = 1},
 			};
 			uint32_t msg_size = spci_memory_region_init(
-				mb.send, SERVICE_VM1, constituents,
-				ARRAY_SIZE(constituents), 0, 0,
+				mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1,
+				constituents, ARRAY_SIZE(constituents), 0, 0,
 				SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 				SPCI_MEMORY_CACHE_WRITE_BACK,
 				SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1091,8 +1113,8 @@
 					SPCI_MSG_SEND_LEGACY_MEMORY_DONATE),
 				SPCI_INVALID_PARAMETERS);
 			msg_size = spci_memory_region_init(
-				mb.send, SERVICE_VM1, constituents,
-				ARRAY_SIZE(constituents), 0, 0,
+				mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1,
+				constituents, ARRAY_SIZE(constituents), 0, 0,
 				SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 				SPCI_MEMORY_CACHE_WRITE_BACK,
 				SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1125,18 +1147,20 @@
 
 	/* Check cannot swap VM IDs. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, SERVICE_VM1, HF_PRIMARY_VM_ID, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_SPCI_ERROR(spci_msg_send(SERVICE_VM1, HF_PRIMARY_VM_ID, msg_size,
 					SPCI_MSG_SEND_LEGACY_MEMORY_LEND),
 			  SPCI_INVALID_PARAMETERS);
 
 	/* Lend memory to VM1. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1173,9 +1197,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
@@ -1195,9 +1220,10 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
@@ -1234,9 +1260,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1262,9 +1289,10 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1307,9 +1335,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_NX, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_NX,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1334,9 +1363,10 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_NX, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_NX,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1382,9 +1412,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1396,9 +1427,10 @@
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_NX, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_NX,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1433,9 +1465,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1447,9 +1480,10 @@
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_NX, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_NX,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1481,9 +1515,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
@@ -1499,7 +1534,7 @@
 	for (int i = 1; i < PAGE_SIZE * 2; i++) {
 		constituents[0].address = (uint64_t)pages + PAGE_SIZE;
 		msg_size = spci_memory_region_init(
-			mb.send, SERVICE_VM2, constituents,
+			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1511,9 +1546,10 @@
 
 	/* Ensure we can donate to the only borrower. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -1542,9 +1578,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1564,7 +1601,7 @@
 	for (int i = 1; i < PAGE_SIZE * 2; i++) {
 		constituents[0].address = (uint64_t)pages + PAGE_SIZE;
 		msg_size = spci_memory_region_init(
-			mb.send, SERVICE_VM2, constituents,
+			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1576,9 +1613,10 @@
 
 	/* Ensure we can donate to the only borrower. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -1607,9 +1645,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
@@ -1650,7 +1689,7 @@
 	for (int i = 0; i < 2; i++) {
 		constituents[0].address = (uint64_t)pages + i * PAGE_SIZE;
 		msg_size = spci_memory_region_init(
-			mb.send, SERVICE_VM1, constituents,
+			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
 			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1682,9 +1721,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
@@ -1715,7 +1755,7 @@
 	for (int i = 0; i < 2; i++) {
 		constituents[0].address = (uint64_t)pages + i * PAGE_SIZE;
 		msg_size = spci_memory_region_init(
-			mb.send, SERVICE_VM1, constituents,
+			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
 			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -1746,10 +1786,10 @@
 	};
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		SPCI_MEMORY_REGION_FLAG_CLEAR, SPCI_MEMORY_RO_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, SPCI_MEMORY_REGION_FLAG_CLEAR,
+		SPCI_MEMORY_RO_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_SHARE)
 			  .func,
@@ -1790,9 +1830,10 @@
 	pages[0] = 0;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1814,9 +1855,10 @@
 
 	/* Use the secondary VM for this test as the first is now aborted. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM2, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1856,9 +1898,10 @@
 	pages[0] = 0;
 
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM1, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM1, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
@@ -1880,9 +1923,10 @@
 
 	/* Use the secondary VM for this test as the first is now aborted. */
 	msg_size = spci_memory_region_init(
-		mb.send, SERVICE_VM2, constituents, ARRAY_SIZE(constituents), 0,
-		0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
+		mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
+		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
+		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
+		SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
 				SPCI_MSG_SEND_LEGACY_MEMORY_LEND)
 			  .func,
diff --git a/test/vmapi/primary_with_secondaries/services/memory.c b/test/vmapi/primary_with_secondaries/services/memory.c
index 113ce2f..fe741a3 100644
--- a/test/vmapi/primary_with_secondaries/services/memory.c
+++ b/test/vmapi/primary_with_secondaries/services/memory.c
@@ -76,7 +76,7 @@
 		{.address = (uint64_t)&page, .page_count = 1},
 	};
 	uint32_t msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
+		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, SPCI_MEMORY_REGION_FLAG_CLEAR,
 		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
@@ -102,7 +102,7 @@
 		{.address = (uint64_t)&page, .page_count = 1},
 	};
 	uint32_t msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
+		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, SPCI_MEMORY_REGION_FLAG_CLEAR,
 		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
@@ -159,7 +159,8 @@
 
 		/* Give the memory back and notify the sender. */
 		msg_size = spci_memory_region_init(
-			send_buf, HF_PRIMARY_VM_ID, constituents,
+			send_buf, spci_msg_send_receiver(ret),
+			spci_msg_send_sender(ret), constituents,
 			memory_region->constituent_count, 0, 0,
 			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 			SPCI_MEMORY_CACHE_WRITE_BACK,
@@ -276,10 +277,10 @@
 
 	/* Donate memory to next VM. */
 	msg_size = spci_memory_region_init(
-		send_buf, SERVICE_VM2, constituents,
-		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		send_buf, spci_msg_send_receiver(ret), SERVICE_VM2,
+		constituents, memory_region->constituent_count, 0, 0,
+		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 	EXPECT_EQ(spci_msg_send(spci_msg_send_receiver(ret), SERVICE_VM2,
 				msg_size, SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
@@ -316,7 +317,7 @@
 
 	/* Give the memory back and notify the sender. */
 	msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, &constituent, 1, 0, 0,
+		send_buf, SERVICE_VM1, HF_PRIMARY_VM_ID, &constituent, 1, 0, 0,
 		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(SERVICE_VM1, HF_PRIMARY_VM_ID, msg_size,
@@ -326,9 +327,9 @@
 
 	/* Attempt to donate the memory to another VM. */
 	msg_size = spci_memory_region_init(
-		send_buf, SERVICE_VM2, &constituent, 1, 0, 0, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		send_buf, spci_msg_send_receiver(ret), SERVICE_VM2,
+		&constituent, 1, 0, 0, SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_SPCI_ERROR(
 		spci_msg_send(spci_msg_send_receiver(ret), SERVICE_VM2,
 			      msg_size, SPCI_MSG_SEND_LEGACY_MEMORY_DONATE),
@@ -387,10 +388,10 @@
 
 	/* Give the memory back and notify the sender. */
 	msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
-		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		send_buf, spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
+		constituents, memory_region->constituent_count, 0, 0,
+		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(spci_msg_send(spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
 				msg_size, SPCI_MSG_SEND_LEGACY_MEMORY_DONATE)
 			  .func,
@@ -398,7 +399,7 @@
 
 	/* Fail to donate the memory from the primary to VM2. */
 	msg_size = spci_memory_region_init(
-		send_buf, SERVICE_VM2, constituents,
+		send_buf, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -458,7 +459,8 @@
 
 		/* Give the memory back and notify the sender. */
 		msg_size = spci_memory_region_init(
-			send_buf, HF_PRIMARY_VM_ID, constituents,
+			send_buf, spci_msg_send_receiver(ret),
+			spci_msg_send_sender(ret), constituents,
 			memory_region->constituent_count, 0, 0,
 			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 			SPCI_MEMORY_CACHE_WRITE_BACK,
@@ -509,8 +511,8 @@
 		}
 		/* Give the memory back and notify the sender. */
 		msg_size = spci_memory_region_init(
-			send_buf, HF_PRIMARY_VM_ID, constituents,
-			memory_region->constituent_count, 0, 0,
+			send_buf, spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
+			constituents, memory_region->constituent_count, 0, 0,
 			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 			SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -549,10 +551,10 @@
 
 	/* Attempt to relinquish from primary VM. */
 	msg_size = spci_memory_region_init(
-		send_buf, spci_msg_send_receiver(ret), constituents,
-		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		send_buf, HF_PRIMARY_VM_ID, spci_msg_send_receiver(ret),
+		constituents, memory_region->constituent_count, 0, 0,
+		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_SPCI_ERROR(
 		spci_msg_send(HF_PRIMARY_VM_ID, spci_msg_send_receiver(ret),
 			      msg_size, SPCI_MSG_SEND_LEGACY_MEMORY_RELINQUISH),
@@ -560,10 +562,10 @@
 
 	/* Give the memory back and notify the sender. */
 	msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
-		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
-		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
-		SPCI_MEMORY_OUTER_SHAREABLE);
+		send_buf, spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
+		constituents, memory_region->constituent_count, 0, 0,
+		SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
+		SPCI_MEMORY_CACHE_WRITE_BACK, SPCI_MEMORY_OUTER_SHAREABLE);
 	EXPECT_EQ(
 		spci_msg_send(spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
 			      msg_size, SPCI_MSG_SEND_LEGACY_MEMORY_RELINQUISH)
@@ -572,7 +574,7 @@
 
 	/* Ensure we cannot lend from the primary to another secondary. */
 	msg_size = spci_memory_region_init(
-		send_buf, SERVICE_VM2, constituents,
+		send_buf, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -582,7 +584,7 @@
 
 	/* Ensure we cannot share from the primary to another secondary. */
 	msg_size = spci_memory_region_init(
-		send_buf, SERVICE_VM2, constituents,
+		send_buf, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 		memory_region->constituent_count, 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -628,8 +630,8 @@
 
 		/* Release the memory again. */
 		msg_size = spci_memory_region_init(
-			send_buf, HF_PRIMARY_VM_ID, constituents,
-			memory_region->constituent_count, 0, 0,
+			send_buf, spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
+			constituents, memory_region->constituent_count, 0, 0,
 			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
 			SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
@@ -695,9 +697,9 @@
 		}
 
 		msg_size = spci_memory_region_init(
-			send_buf, HF_PRIMARY_VM_ID, &constituent_copy, 1, 0, 0,
-			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-			SPCI_MEMORY_CACHE_WRITE_BACK,
+			send_buf, spci_msg_send_receiver(ret), HF_PRIMARY_VM_ID,
+			&constituent_copy, 1, 0, 0, SPCI_MEMORY_RW_X,
+			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
 		EXPECT_EQ(spci_msg_send(spci_msg_send_receiver(ret),
 					HF_PRIMARY_VM_ID, msg_size,
@@ -816,20 +818,20 @@
 	for (i = 1; i < PAGE_SIZE * 2; i++) {
 		constituent_copy.address = (uint64_t)ptr + i;
 
-		/* Fail to lend or share the memory back to the primary. */
+		/* Fail to lend or share the memory from the primary. */
 		msg_size = spci_memory_region_init(
-			send_buf, SERVICE_VM2, &constituent_copy, 1, 0, 0,
-			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-			SPCI_MEMORY_CACHE_WRITE_BACK,
+			send_buf, HF_PRIMARY_VM_ID, SERVICE_VM2,
+			&constituent_copy, 1, 0, 0, SPCI_MEMORY_RW_X,
+			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
 		EXPECT_SPCI_ERROR(
 			spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
 				      SPCI_MSG_SEND_LEGACY_MEMORY_LEND),
 			SPCI_INVALID_PARAMETERS);
 		msg_size = spci_memory_region_init(
-			send_buf, SERVICE_VM2, &constituent_copy, 1, 0, 0,
-			SPCI_MEMORY_RW_X, SPCI_MEMORY_NORMAL_MEM,
-			SPCI_MEMORY_CACHE_WRITE_BACK,
+			send_buf, HF_PRIMARY_VM_ID, SERVICE_VM2,
+			&constituent_copy, 1, 0, 0, SPCI_MEMORY_RW_X,
+			SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 			SPCI_MEMORY_OUTER_SHAREABLE);
 		EXPECT_SPCI_ERROR(
 			spci_msg_send(HF_PRIMARY_VM_ID, SERVICE_VM2, msg_size,
diff --git a/test/vmapi/primary_with_secondaries/services/unmapped.c b/test/vmapi/primary_with_secondaries/services/unmapped.c
index b23ffb2..13d78c5 100644
--- a/test/vmapi/primary_with_secondaries/services/unmapped.c
+++ b/test/vmapi/primary_with_secondaries/services/unmapped.c
@@ -44,7 +44,7 @@
 		{.address = (uint64_t)(&pages[PAGE_SIZE]), .page_count = 1},
 	};
 	uint32_t msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
+		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
@@ -83,7 +83,7 @@
 		{.address = (uint64_t)(&pages[PAGE_SIZE]), .page_count = 1},
 	};
 	uint32_t msg_size = spci_memory_region_init(
-		send_buf, HF_PRIMARY_VM_ID, constituents,
+		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
 		ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
 		SPCI_MEMORY_NORMAL_MEM, SPCI_MEMORY_CACHE_WRITE_BACK,
 		SPCI_MEMORY_OUTER_SHAREABLE);
diff --git a/vmlib/spci.c b/vmlib/spci.c
index 4da01fe..c6f745a 100644
--- a/vmlib/spci.c
+++ b/vmlib/spci.c
@@ -32,7 +32,7 @@
  * `memory_region` (attributes, constituents and memory region header size).
  */
 uint32_t spci_memory_region_init(
-	struct spci_memory_region *memory_region, spci_vm_id_t receiver,
+	struct spci_memory_region *memory_region, spci_vm_id_t sender, spci_vm_id_t receiver,
 	const struct spci_memory_region_constituent constituents[],
 	uint32_t constituent_count, uint32_t tag, spci_memory_region_flags_t flags,
 	enum spci_memory_access access, enum spci_memory_type type,
@@ -54,6 +54,8 @@
 
 	memory_region->tag = tag;
 	memory_region->flags = flags;
+	memory_region->sender = sender;
+	memory_region->reserved = 0;
 	memory_region->page_count = 0;
 	memory_region->constituent_count = constituent_count;
 	memory_region->attribute_count = 1;