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;
}