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;