Remove padding from memory region constituent.

This was removed from the SPCI spec at some point. This means that the
addresses are no longer 64-bit aligned.

Bug: 132420445
Change-Id: Ic6759041243fcfd77c51e0d12e7441518406b1fd
diff --git a/Makefile b/Makefile
index 9f39365..2fe3c27 100644
--- a/Makefile
+++ b/Makefile
@@ -43,7 +43,7 @@
 
 
 CHECKPATCH := $(CURDIR)/third_party/linux/scripts/checkpatch.pl \
-	--ignore BRACES,SPDX_LICENSE_TAG,VOLATILE,SPLIT_STRING,AVOID_EXTERNS,USE_SPINLOCK_T,NEW_TYPEDEFS,INITIALISED_STATIC,FILE_PATH_CHANGES,EMBEDDED_FUNCTION_NAME,SINGLE_STATEMENT_DO_WHILE_MACRO,MACRO_WITH_FLOW_CONTROL --quiet
+	--ignore BRACES,SPDX_LICENSE_TAG,VOLATILE,SPLIT_STRING,AVOID_EXTERNS,USE_SPINLOCK_T,NEW_TYPEDEFS,INITIALISED_STATIC,FILE_PATH_CHANGES,EMBEDDED_FUNCTION_NAME,SINGLE_STATEMENT_DO_WHILE_MACRO,MACRO_WITH_FLOW_CONTROL,PREFER_PACKED,PREFER_ALIGNED --quiet
 
 # Specifies the grep pattern for ignoring specific files in checkpatch.
 # C++ headers, *.hh, are automatically excluded.
diff --git a/inc/vmapi/hf/spci.h b/inc/vmapi/hf/spci.h
index c7638ce..977c4a4 100644
--- a/inc/vmapi/hf/spci.h
+++ b/inc/vmapi/hf/spci.h
@@ -229,11 +229,10 @@
 	 * The base IPA of the constituent memory region, aligned to 4 kiB page
 	 * size granularity.
 	 */
-	uint64_t address;
+	uint32_t address_low;
+	uint32_t address_high;
 	/** The number of 4 kiB pages in the constituent memory region. */
 	uint32_t page_count;
-
-	uint32_t reserved;
 };
 
 struct spci_memory_region_attributes {
@@ -297,6 +296,23 @@
 	struct spci_memory_region_attributes attributes[];
 };
 
+static inline struct spci_memory_region_constituent
+spci_memory_region_constituent_init(uint64_t address, uint32_t pc)
+{
+	return (struct spci_memory_region_constituent){
+		.address_high = (uint32_t)(address >> 32),
+		.address_low = (uint32_t)address,
+		.page_count = pc,
+	};
+}
+
+static inline uint64_t spci_memory_region_constituent_get_address(
+	struct spci_memory_region_constituent *constituent)
+{
+	return (uint64_t)constituent->address_high << 32 |
+	       constituent->address_low;
+}
+
 /**
  * Gets the constituent array for an `spci_memory_region`.
  */
diff --git a/src/spci_architected_message.c b/src/spci_architected_message.c
index dd24aee..61cd9cf 100644
--- a/src/spci_architected_message.c
+++ b/src/spci_architected_message.c
@@ -227,7 +227,9 @@
 	}
 
 	for (i = 0; i < memory_region->constituent_count; ++i) {
-		ipaddr_t begin = ipa_init(constituents[i].address);
+		ipaddr_t begin =
+			ipa_init(spci_memory_region_constituent_get_address(
+				&constituents[i]));
 		size_t size = constituents[i].page_count * PAGE_SIZE;
 		ipaddr_t end = ipa_add(begin, size);
 		uint32_t current_from_mode;
@@ -327,8 +329,9 @@
 	/* Iterate over the memory region constituents. */
 	for (uint32_t index = 0; index < memory_constituent_count; index++) {
 		size_t size = constituents[index].page_count * PAGE_SIZE;
-		paddr_t pa_begin =
-			pa_from_ipa(ipa_init(constituents[index].address));
+		paddr_t pa_begin = pa_from_ipa(
+			ipa_init(spci_memory_region_constituent_get_address(
+				&constituents[index])));
 		paddr_t pa_end = pa_add(pa_begin, size);
 
 		if (commit) {
@@ -408,7 +411,9 @@
 	/* Iterate over the memory region constituents. */
 	for (uint32_t i = 0; i < memory_constituent_count; ++i) {
 		size_t size = constituents[i].page_count * PAGE_SIZE;
-		paddr_t begin = pa_from_ipa(ipa_init(constituents[i].address));
+		paddr_t begin = pa_from_ipa(
+			ipa_init(spci_memory_region_constituent_get_address(
+				&constituents[i])));
 		paddr_t end = pa_add(begin, size);
 
 		if (!clear_memory(begin, end, &local_page_pool)) {
@@ -465,11 +470,10 @@
 		spci_memory_region_get_constituents(memory_region);
 
 	/*
-	 * Make sure constituents are properly aligned to a 64-bit boundary. If
-	 * not we would get alignment faults trying to read (64-bit) page
-	 * addresses.
+	 * Make sure constituents are properly aligned to a 32-bit boundary. If
+	 * not we would get alignment faults trying to read (32-bit) values.
 	 */
-	if (!is_aligned(constituents, 8)) {
+	if (!is_aligned(constituents, 4)) {
 		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 0c4fe92..ac1a1b6 100644
--- a/test/vmapi/primary_with_secondaries/memory_sharing.c
+++ b/test/vmapi/primary_with_secondaries/memory_sharing.c
@@ -200,7 +200,7 @@
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "memory_increment", mb.send);
@@ -243,7 +243,7 @@
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_lend_relinquish", mb.send);
@@ -278,7 +278,7 @@
 {
 	struct mailbox_buffers mb = set_up_mailbox();
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = PAGE_SIZE, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)PAGE_SIZE, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_return", mb.send);
@@ -308,8 +308,9 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init((uint64_t)pages + PAGE_SIZE,
+						    2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -351,8 +352,9 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init((uint64_t)pages + PAGE_SIZE,
+						    2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -380,7 +382,7 @@
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_return", mb.send);
@@ -418,7 +420,7 @@
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_lend_relinquish", mb.send);
@@ -455,7 +457,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_lend_relinquish", mb.send);
@@ -496,7 +498,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint32_t msg_size;
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_memory_lend_relinquish", mb.send);
@@ -548,7 +550,8 @@
 	/* Check the memory was cleared. */
 	memory_region = (struct spci_memory_region *)mb.recv;
 	constituents = spci_memory_region_get_constituents(memory_region);
-	ptr = (uint8_t *)constituents[0].address;
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[0]);
 	for (int i = 0; i < PAGE_SIZE; ++i) {
 		ASSERT_EQ(ptr[i], 0);
 	}
@@ -579,7 +582,8 @@
 	/* Check the memory was cleared. */
 	memory_region = (struct spci_memory_region *)mb.recv;
 	constituents = spci_memory_region_get_constituents(memory_region);
-	ptr = (uint8_t *)constituents[0].address;
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[0]);
 	for (int i = 0; i < PAGE_SIZE; ++i) {
 		ASSERT_EQ(ptr[i], 0);
 	}
@@ -599,6 +603,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
+	uint64_t address;
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_donate_check_upper_bound", mb.send);
 
@@ -607,8 +612,9 @@
 
 	/* Specify non-contiguous memory regions. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE * 2, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 2, 1),
 	};
 
 	/*
@@ -629,8 +635,12 @@
 		  1);
 
 	/* Use different memory regions for verifying the second constituent. */
-	constituents[0].address = (uint64_t)pages + PAGE_SIZE * 1;
-	constituents[1].address = (uint64_t)pages + PAGE_SIZE * 3;
+	address = (uint64_t)pages + PAGE_SIZE * 1;
+	constituents[0].address_high = address << 32;
+	constituents[0].address_low = (uint32_t)address;
+	address = (uint64_t)pages + PAGE_SIZE * 3;
+	constituents[1].address_high = address << 32;
+	constituents[1].address_low = (uint32_t)address;
 
 	/*
 	 * Specify that we now want to test the second constituent of the
@@ -659,6 +669,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
+	uint64_t address;
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_donate_check_lower_bound", mb.send);
 
@@ -667,8 +678,9 @@
 
 	/* Specify non-contiguous memory regions. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE * 2, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 2, 1),
 	};
 
 	/*
@@ -689,8 +701,12 @@
 		  1);
 
 	/* Use different memory regions for verifying the second constituent. */
-	constituents[0].address = (uint64_t)pages + PAGE_SIZE * 1;
-	constituents[1].address = (uint64_t)pages + PAGE_SIZE * 3;
+	address = (uint64_t)pages + PAGE_SIZE * 1;
+	constituents[0].address_high = address << 32;
+	constituents[0].address_low = (uint32_t)address;
+	address = (uint64_t)pages + PAGE_SIZE * 3;
+	constituents[1].address_high = address << 32;
+	constituents[1].address_low = (uint32_t)address;
 
 	/*
 	 * Specify that we now want to test the second constituent of the
@@ -732,7 +748,7 @@
 	memset_s(ptr, sizeof(pages), 'b', 1 * PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -779,7 +795,7 @@
 	memset_s(ptr, sizeof(pages), 'b', 1 * PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	/* Set up VM2 to wait for message. */
@@ -830,7 +846,7 @@
 	memset_s(ptr, sizeof(pages), 'b', 1 * PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	/* Donate memory to VM1. */
@@ -881,7 +897,7 @@
 	/* Initialise the memory before giving it. */
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -906,7 +922,7 @@
 	/* Initialise the memory before giving it. */
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -930,7 +946,7 @@
 	/* Initialise the memory before giving it. */
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -958,7 +974,7 @@
 	/* Initialise the memory before giving it. */
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	/* Try invalid configurations. */
@@ -1021,10 +1037,10 @@
 				continue;
 			}
 			struct spci_memory_region_constituent constituents[] = {
-				{.address = (uint64_t)pages + i,
-				 .page_count = 1},
-				{.address = (uint64_t)pages + PAGE_SIZE + j,
-				 .page_count = 1},
+				spci_memory_region_constituent_init(
+					(uint64_t)pages + i, 1),
+				spci_memory_region_constituent_init(
+					(uint64_t)pages + PAGE_SIZE + j, 1),
 			};
 			uint32_t msg_size = spci_memory_region_init(
 				mb.send, HF_PRIMARY_VM_ID, SERVICE_VM1,
@@ -1062,7 +1078,7 @@
 	/* Initialise the memory before giving it. */
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	/* Check cannot swap VM IDs. */
@@ -1109,7 +1125,7 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1166,7 +1182,7 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1235,7 +1251,7 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1306,7 +1322,7 @@
 	*ptr2 = 0xD65F03C0;
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1353,7 +1369,7 @@
 	*ptr2 = 0xD65F03C0;
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1397,7 +1413,7 @@
 	memset_s(ptr, sizeof(pages) * 2, 'b', PAGE_SIZE * 2);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1415,7 +1431,9 @@
 	/* Ensure we can't donate any sub section of memory to another VM. */
 	constituents[0].page_count = 1;
 	for (int i = 1; i < PAGE_SIZE * 2; i++) {
-		constituents[0].address = (uint64_t)pages + PAGE_SIZE;
+		uint64_t address = (uint64_t)pages + PAGE_SIZE;
+		constituents[0].address_high = address << 32;
+		constituents[0].address_low = (uint32_t)address;
 		msg_size = spci_memory_region_init(
 			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
@@ -1451,8 +1469,9 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE * 4);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 2},
-		{.address = (uint64_t)pages + PAGE_SIZE * 2, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 2),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 2, 2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1474,7 +1493,9 @@
 	/* Ensure we can't donate any sub section of memory to another VM. */
 	constituents[0].page_count = 1;
 	for (int i = 1; i < PAGE_SIZE * 2; i++) {
-		constituents[0].address = (uint64_t)pages + PAGE_SIZE;
+		uint64_t address = (uint64_t)pages + PAGE_SIZE;
+		constituents[0].address_high = address << 32;
+		constituents[0].address_low = (uint32_t)address;
 		msg_size = spci_memory_region_init(
 			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RW_X,
@@ -1510,8 +1531,9 @@
 	memset_s(ptr, sizeof(pages), 'b', PAGE_SIZE * 4);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 2},
-		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 2),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 3, 1),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1541,7 +1563,8 @@
 
 	/* Now attempt to share only a portion of the same area of memory. */
 	struct spci_memory_region_constituent constituents_subsection[] = {
-		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 3, 1),
 	};
 	check_cannot_lend_memory(mb, constituents_subsection,
 				 ARRAY_SIZE(constituents_subsection), -1);
@@ -1554,7 +1577,9 @@
 	/* Attempt to lend again with different permissions. */
 	constituents[0].page_count = 1;
 	for (int i = 0; i < 2; i++) {
-		constituents[0].address = (uint64_t)pages + i * PAGE_SIZE;
+		uint64_t address = (uint64_t)pages + i * PAGE_SIZE;
+		constituents[0].address_high = address << 32;
+		constituents[0].address_low = (uint32_t)address;
 		msg_size = spci_memory_region_init(
 			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
@@ -1582,7 +1607,7 @@
 	memset_s(ptr, sizeof(pages) * 2, 'b', PAGE_SIZE * 2);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1615,7 +1640,9 @@
 	/* Attempt to share again with different permissions. */
 	constituents[0].page_count = 1;
 	for (int i = 0; i < 2; i++) {
-		constituents[0].address = (uint64_t)pages + i * PAGE_SIZE;
+		uint64_t address = (uint64_t)pages + i * PAGE_SIZE;
+		constituents[0].address_high = address << 32;
+		constituents[0].address_low = (uint32_t)address;
 		msg_size = spci_memory_region_init(
 			mb.send, HF_PRIMARY_VM_ID, SERVICE_VM2, constituents,
 			ARRAY_SIZE(constituents), 0, 0, SPCI_MEMORY_RO_X,
@@ -1642,7 +1669,7 @@
 	memset_s(ptr, sizeof(pages) * 2, 'b', PAGE_SIZE * 2);
 
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 2},
+		spci_memory_region_constituent_init((uint64_t)pages, 2),
 	};
 
 	msg_size = spci_memory_region_init(
@@ -1667,6 +1694,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
+	uint64_t address;
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_lend_check_upper_bound", mb.send);
 	SERVICE_SELECT(SERVICE_VM2, "spci_lend_check_upper_bound", mb.send);
@@ -1676,8 +1704,9 @@
 
 	/* Specify non-contiguous memory regions. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE * 2, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 2, 1),
 	};
 
 	/*
@@ -1698,8 +1727,12 @@
 		  1);
 
 	/* Use different memory regions for verifying the second constituent. */
-	constituents[0].address = (uint64_t)pages + PAGE_SIZE * 1;
-	constituents[1].address = (uint64_t)pages + PAGE_SIZE * 3;
+	address = (uint64_t)pages + PAGE_SIZE * 1;
+	constituents[0].address_high = address << 32;
+	constituents[0].address_low = (uint32_t)address;
+	address = (uint64_t)pages + PAGE_SIZE * 3;
+	constituents[1].address_high = address << 32;
+	constituents[1].address_low = (uint32_t)address;
 
 	/*
 	 * Specify that we now want to test the second constituent of the
@@ -1729,6 +1762,7 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint8_t *ptr = pages;
 	uint32_t msg_size;
+	uint64_t address;
 
 	SERVICE_SELECT(SERVICE_VM1, "spci_lend_check_lower_bound", mb.send);
 	SERVICE_SELECT(SERVICE_VM2, "spci_lend_check_lower_bound", mb.send);
@@ -1738,8 +1772,9 @@
 
 	/* Specify non-contiguous memory regions. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)pages, .page_count = 1},
-		{.address = (uint64_t)pages + PAGE_SIZE * 2, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)pages, 1),
+		spci_memory_region_constituent_init(
+			(uint64_t)pages + PAGE_SIZE * 2, 1),
 	};
 
 	/*
@@ -1760,8 +1795,12 @@
 		  1);
 
 	/* Use different memory regions for verifying the second constituent. */
-	constituents[0].address = (uint64_t)pages + PAGE_SIZE * 1;
-	constituents[1].address = (uint64_t)pages + PAGE_SIZE * 3;
+	address = (uint64_t)pages + PAGE_SIZE * 1;
+	constituents[0].address_high = address << 32;
+	constituents[0].address_low = (uint32_t)address;
+	address = (uint64_t)pages + PAGE_SIZE * 3;
+	constituents[1].address_high = address << 32;
+	constituents[1].address_low = (uint32_t)address;
 
 	/*
 	 * Specify that we now want to test the second constituent of the
diff --git a/test/vmapi/primary_with_secondaries/services/memory.c b/test/vmapi/primary_with_secondaries/services/memory.c
index 05272b1..b45c1f0 100644
--- a/test/vmapi/primary_with_secondaries/services/memory.c
+++ b/test/vmapi/primary_with_secondaries/services/memory.c
@@ -44,7 +44,8 @@
 
 		EXPECT_EQ(ret.func, SPCI_MEM_SHARE_32);
 
-		ptr = (uint8_t *)constituents[0].address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 
 		/* Check the memory was cleared. */
 		for (i = 0; i < PAGE_SIZE; ++i) {
@@ -71,7 +72,7 @@
 
 	/* Give memory to the primary. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)&page, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)&page, 1),
 	};
 	uint32_t msg_size = spci_memory_region_init(
 		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
@@ -94,7 +95,7 @@
 
 	/* Lend memory to the primary. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)&page, .page_count = 1},
+		spci_memory_region_constituent_init((uint64_t)&page, 1),
 	};
 	uint32_t msg_size = spci_memory_region_init(
 		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
@@ -137,7 +138,8 @@
 		memory_region = (struct spci_memory_region *)recv_buf;
 		constituents =
 			spci_memory_region_get_constituents(memory_region);
-		ptr = (uint8_t *)constituents[0].address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 
 		/* Check that one has access to the shared region. */
 		for (i = 0; i < PAGE_SIZE; ++i) {
@@ -186,8 +188,10 @@
 			spci_memory_region_get_constituents(memory_region);
 
 		/* Choose which constituent we want to test. */
-		index = *(uint8_t *)constituents[0].address;
-		ptr = (uint8_t *)constituents[index].address;
+		index = *(uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[index]);
 		EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 		/*
@@ -219,8 +223,10 @@
 			spci_memory_region_get_constituents(memory_region);
 
 		/* Choose which constituent we want to test. */
-		index = *(uint8_t *)constituents[0].address;
-		ptr = (uint8_t *)constituents[index].address;
+		index = *(uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[index]);
 		EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 		/*
@@ -250,7 +256,8 @@
 
 	exception_setup(NULL, exception_handler_yield_data_abort);
 
-	ptr = (uint8_t *)constituents[0].address;
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[0]);
 
 	/* Donate memory to next VM. */
 	msg_size = spci_memory_region_init(
@@ -322,7 +329,8 @@
 
 		EXPECT_EQ(ret.func, SPCI_MEM_DONATE_32);
 
-		ptr = (uint8_t *)constituents[0].address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 		EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 		ptr[0] = 'd';
 		spci_yield();
@@ -398,9 +406,11 @@
 			    ret.func == SPCI_MEM_LEND_32 ||
 			    ret.func == SPCI_MEM_SHARE_32);
 
-		ptr = (uint8_t *)constituents[0].address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 		count = constituents[0].page_count;
-		ptr2 = (uint8_t *)constituents[1].address;
+		ptr2 = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[1]);
 		count2 = constituents[1].page_count;
 
 		/* Check that one has access to the shared region. */
@@ -451,7 +461,8 @@
 
 		EXPECT_EQ(ret.func, SPCI_MEM_DONATE_32);
 
-		ptr = (uint8_t *)constituents[0].address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 
 		/* Check that we have access to the shared region. */
 		for (i = 0; i < PAGE_SIZE; ++i) {
@@ -556,7 +567,8 @@
 
 		EXPECT_EQ(ret.func, SPCI_MEM_LEND_32);
 
-		ptr = (uint64_t *)constituents[0].address;
+		ptr = (uint64_t *)spci_memory_region_constituent_get_address(
+			&constituents[0]);
 		/*
 		 * Verify that the instruction in memory is the encoded RET
 		 * instruction.
@@ -610,7 +622,8 @@
 
 		EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
-		ptr = (uint8_t *)constituent_copy.address;
+		ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+			&constituent_copy);
 
 		/* Check that we have read access. */
 		for (i = 0; i < PAGE_SIZE; ++i) {
@@ -655,8 +668,10 @@
 	exception_setup(NULL, exception_handler_yield_data_abort);
 
 	/* Choose which constituent we want to test. */
-	index = *(uint8_t *)constituents[0].address;
-	ptr = (uint8_t *)constituents[index].address;
+	index = *(uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[0]);
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[index]);
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 	/* Check that one cannot access after lent region. */
@@ -685,8 +700,10 @@
 	EXPECT_EQ(ret.func, SPCI_MEM_LEND_32);
 
 	/* Choose which constituent we want to test. */
-	index = *(uint8_t *)constituents[0].address;
-	ptr = (uint8_t *)constituents[index].address;
+	index = *(uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[0]);
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituents[index]);
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
 	/* Check that one cannot access after lent region. */
@@ -718,7 +735,8 @@
 
 	EXPECT_EQ(spci_rx_release().func, SPCI_SUCCESS_32);
 
-	ptr = (uint8_t *)constituent_copy.address;
+	ptr = (uint8_t *)spci_memory_region_constituent_get_address(
+		&constituent_copy);
 
 	/* Check that we have read access. */
 	for (i = 0; i < PAGE_SIZE; ++i) {
@@ -731,7 +749,9 @@
 	}
 
 	for (i = 1; i < PAGE_SIZE * 2; i++) {
-		constituent_copy.address = (uint64_t)ptr + i;
+		uint64_t address = (uint64_t)ptr + i;
+		constituent_copy.address_high = address << 32;
+		constituent_copy.address_low = (uint32_t)address;
 
 		/* Fail to lend or share the memory from the primary. */
 		msg_size = spci_memory_region_init(
diff --git a/test/vmapi/primary_with_secondaries/services/unmapped.c b/test/vmapi/primary_with_secondaries/services/unmapped.c
index 9197233..b4a07a4 100644
--- a/test/vmapi/primary_with_secondaries/services/unmapped.c
+++ b/test/vmapi/primary_with_secondaries/services/unmapped.c
@@ -41,7 +41,8 @@
 	void *send_buf = SERVICE_SEND_BUFFER();
 	/* Give some memory to the primary VM so that it's unmapped. */
 	struct spci_memory_region_constituent constituents[] = {
-		{.address = (uint64_t)(&pages[PAGE_SIZE]), .page_count = 1},
+		spci_memory_region_constituent_init(
+			(uint64_t)(&pages[PAGE_SIZE]), 1),
 	};
 	uint32_t msg_size = spci_memory_region_init(
 		send_buf, hf_vm_get_id(), HF_PRIMARY_VM_ID, constituents,
diff --git a/vmlib/spci.c b/vmlib/spci.c
index c6f745a..59c36e4 100644
--- a/vmlib/spci.c
+++ b/vmlib/spci.c
@@ -63,20 +63,19 @@
 	memory_region->attributes[0].memory_attributes = attributes;
 
 	/*
-	 * Constituent offset must be aligned to a 64-bit boundary so that
-	 * 64-bit addresses can be copied without alignment faults.
+	 * Constituent offset must be aligned to a 32-bit boundary so that
+	 * 32-bit values can be copied without alignment faults.
 	 */
 	memory_region->constituent_offset = align_up(
 		sizeof(struct spci_memory_region) +
 			memory_region->attribute_count *
 				sizeof(struct spci_memory_region_attributes),
-		8);
+		4);
 	region_constituents =
 		spci_memory_region_get_constituents(memory_region);
 
 	for (index = 0; index < constituent_count; index++) {
 		region_constituents[index] = constituents[index];
-		region_constituents[index].reserved = 0;
 		memory_region->page_count += constituents[index].page_count;
 	}