refactor(memory share): use receiver_offsets to find receiver array
The receiver_offsets field was introduced to the ffa_memory_region
struct to help with forwards compatability in future FF-A versions
as the size of the `ffa_memory_region` struct varies. This patch moves
away from using `sizeof(ffa_memory_region)` to find the receiver array
and instead to using the `receivers_offset` field.
This is safe to do due to the introdution to the use of the
`ffa_memory_region_check_values` function in the previous patch.
Signed-off-by: Daniel Boulby <daniel.boulby@arm.com>
Change-Id: I6aac59df0ad19ef500550d1bd60d1519a125598a
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index 820d010..e146121 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -1467,6 +1467,7 @@
{
struct ffa_memory_region *memory_region = share_state->memory_region;
struct ffa_composite_memory_region *composite;
+ struct ffa_memory_access *receiver;
struct ffa_value ret;
/* Lock must be held. */
@@ -1474,13 +1475,15 @@
assert(memory_region != NULL);
composite = ffa_memory_region_get_composite(memory_region, 0);
assert(composite != NULL);
+ receiver = ffa_memory_region_get_receiver(memory_region, 0);
+ assert(receiver != NULL);
/* Check that state is valid in sender page table and update. */
ret = ffa_send_check_update(
from_locked, share_state->fragments,
share_state->fragment_constituent_counts,
share_state->fragment_count, composite->page_count,
- share_state->share_func, memory_region->receivers,
+ share_state->share_func, receiver,
memory_region->receiver_count, page_pool,
memory_region->flags & FFA_MEMORY_REGION_FLAG_CLEAR,
orig_from_mode_ret);
@@ -1563,9 +1566,9 @@
enum ffa_memory_security security_state;
struct ffa_value ret;
const size_t minimum_first_fragment_length =
- (sizeof(struct ffa_memory_region) +
- memory_region->memory_access_desc_size +
- sizeof(struct ffa_composite_memory_region));
+ memory_region->receivers_offset +
+ memory_region->memory_access_desc_size +
+ sizeof(struct ffa_composite_memory_region);
if (fragment_length < minimum_first_fragment_length) {
dlog_verbose("Fragment length %u too short (min %u).\n",
@@ -1594,9 +1597,6 @@
return ffa_error(FFA_INVALID_PARAMETERS);
}
- assert(memory_region->receivers_offset ==
- offsetof(struct ffa_memory_region, receivers));
-
/* The sender must match the caller. */
if ((!vm_id_is_current_world(from_locked.vm->id) &&
vm_id_is_current_world(memory_region->sender)) ||
@@ -1618,7 +1618,7 @@
*/
receivers_end = ((uint64_t)memory_region->memory_access_desc_size *
(uint64_t)memory_region->receiver_count) +
- sizeof(struct ffa_memory_region);
+ memory_region->receivers_offset;
min_length = receivers_end +
sizeof(struct ffa_composite_memory_region) +
sizeof(struct ffa_memory_region_constituent);
@@ -2198,7 +2198,7 @@
* alignment faults.
*/
composite_offset =
- sizeof(struct ffa_memory_region) +
+ retrieve_response->receivers_offset +
(uint32_t)(receiver_count *
retrieve_response->memory_access_desc_size);
@@ -2739,7 +2739,7 @@
struct mpool *page_pool)
{
uint32_t expected_retrieve_request_length =
- sizeof(struct ffa_memory_region) +
+ retrieve_request->receivers_offset +
(uint32_t)(retrieve_request->receiver_count *
retrieve_request->memory_access_desc_size);
ffa_memory_handle_t handle = retrieve_request->handle;