refactor(memory sharing): initialize memory access
Factor out logic to initialize 'struct ffa_memory_access' from existing
helper functions. This shall help with adding helpers for memory sharing
with multiple borrowers.
Change-Id: Ifd9e2fe0fffca962d10044b152af6bd841f65e9b
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/vmlib/ffa.c b/vmlib/ffa.c
index cc9d558..13b5d95 100644
--- a/vmlib/ffa.c
+++ b/vmlib/ffa.c
@@ -35,14 +35,35 @@
}
/**
- * Initialises the header of the given `ffa_memory_region`, not including the
- * composite memory region offset.
+ * Initializes receiver permissions, in a memory transaction descriptor.
+ */
+void ffa_memory_access_init_permissions(
+ struct ffa_memory_access *receiver, ffa_vm_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;
+
+ /* Set memory region's permissions. */
+ ffa_set_data_access_attr(&permissions, data_access);
+ ffa_set_instruction_access_attr(&permissions, instruction_access);
+
+ receiver->receiver_permissions.receiver = receiver_id;
+ receiver->receiver_permissions.permissions = permissions;
+ receiver->receiver_permissions.flags = flags;
+
+ receiver->reserved_0 = 0ULL;
+}
+
+/**
+ * Initialises the header of the given `ffa_memory_region`, not
+ * including the composite memory region offset.
*/
static void ffa_memory_region_init_header(
struct ffa_memory_region *memory_region, ffa_vm_id_t sender,
ffa_memory_attributes_t attributes, ffa_memory_region_flags_t flags,
- ffa_memory_handle_t handle, uint32_t tag, ffa_vm_id_t receiver,
- ffa_memory_access_permissions_t permissions)
+ ffa_memory_handle_t handle, uint32_t tag, uint32_t receiver_count)
{
memory_region->sender = sender;
memory_region->attributes = attributes;
@@ -51,12 +72,7 @@
memory_region->handle = handle;
memory_region->tag = tag;
memory_region->reserved_1 = 0;
- memory_region->receiver_count = 1;
- memory_region->receivers[0].receiver_permissions.receiver = receiver;
- memory_region->receivers[0].receiver_permissions.permissions =
- permissions;
- memory_region->receivers[0].receiver_permissions.flags = 0;
- memory_region->receivers[0].reserved_0 = 0;
+ memory_region->receiver_count = receiver_count;
}
/**
@@ -160,20 +176,18 @@
enum ffa_memory_shareability shareability, uint32_t *total_length,
uint32_t *fragment_length)
{
- ffa_memory_access_permissions_t permissions = 0;
ffa_memory_attributes_t attributes = 0;
- /* Set memory region's permissions. */
- ffa_set_data_access_attr(&permissions, data_access);
- ffa_set_instruction_access_attr(&permissions, instruction_access);
-
/* Set memory region's page attributes. */
ffa_set_memory_type_attr(&attributes, type);
ffa_set_memory_cacheability_attr(&attributes, cacheability);
ffa_set_memory_shareability_attr(&attributes, shareability);
ffa_memory_region_init_header(memory_region, sender, attributes, flags,
- 0, tag, receiver, permissions);
+ 0, tag, 1);
+ ffa_memory_access_init_permissions(&memory_region->receivers[0],
+ receiver, data_access,
+ instruction_access, 0);
return ffa_memory_region_init_constituents(
memory_region, memory_region_max_size, constituents,
@@ -194,20 +208,19 @@
enum ffa_memory_type type, enum ffa_memory_cacheability cacheability,
enum ffa_memory_shareability shareability)
{
- ffa_memory_access_permissions_t permissions = 0;
ffa_memory_attributes_t attributes = 0;
- /* Set memory region's permissions. */
- ffa_set_data_access_attr(&permissions, data_access);
- ffa_set_instruction_access_attr(&permissions, instruction_access);
-
/* Set memory region's page attributes. */
ffa_set_memory_type_attr(&attributes, type);
ffa_set_memory_cacheability_attr(&attributes, cacheability);
ffa_set_memory_shareability_attr(&attributes, shareability);
ffa_memory_region_init_header(memory_region, sender, attributes, flags,
- handle, tag, receiver, permissions);
+ handle, tag, 1);
+ ffa_memory_access_init_permissions(&memory_region->receivers[0],
+ receiver, data_access,
+ instruction_access, 0);
+
/*
* Offset 0 in this case means that the hypervisor should allocate the
* address ranges. This is the only configuration supported by Hafnium,
@@ -265,7 +278,14 @@
uint32_t constituents_offset;
ffa_memory_region_init_header(response, sender, attributes, flags,
- handle, 0, receiver, permissions);
+ handle, 0, 1);
+ /*
+ * Initialized here as in memory retrieve responses we currently expect
+ * one borrower to be specified.
+ */
+ ffa_memory_access_init_permissions(&response->receivers[0], receiver, 0,
+ 0, 0);
+
/*
* Note that `sizeof(struct_ffa_memory_region)` and `sizeof(struct
* ffa_memory_access)` must both be multiples of 16 (as verified by the