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