FFA: Adjust 'ffa_memory_permissions_to_mode'
This function is now receiving a default mode. When permissions are not
specified, the data and instruction permissions of the return value
match what set in the default mode.
With this, the receiver's permissions of a memory send operation will
be the same to those of the sender when either the data access or
instruction are not specified.
Change-Id: I6397b4242076ca1f1142288f9424011e429ba15f
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index b4ff37a..f119d42 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -402,7 +402,7 @@
/* TODO: Add device attributes: GRE, cacheability, shareability. */
static inline uint32_t ffa_memory_permissions_to_mode(
- ffa_memory_access_permissions_t permissions)
+ ffa_memory_access_permissions_t permissions, uint32_t default_mode)
{
uint32_t mode = 0;
@@ -411,9 +411,11 @@
mode = MM_MODE_R;
break;
case FFA_DATA_ACCESS_RW:
- case FFA_DATA_ACCESS_NOT_SPECIFIED:
mode = MM_MODE_R | MM_MODE_W;
break;
+ case FFA_DATA_ACCESS_NOT_SPECIFIED:
+ mode = (default_mode & (MM_MODE_R | MM_MODE_W));
+ break;
case FFA_DATA_ACCESS_RESERVED:
panic("Tried to convert FFA_DATA_ACCESS_RESERVED.");
}
@@ -422,9 +424,11 @@
case FFA_INSTRUCTION_ACCESS_NX:
break;
case FFA_INSTRUCTION_ACCESS_X:
- case FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED:
mode |= MM_MODE_X;
break;
+ case FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED:
+ mode |= (default_mode & MM_MODE_X);
+ break;
case FFA_INSTRUCTION_ACCESS_RESERVED:
panic("Tried to convert FFA_INSTRUCTION_ACCESS_RESVERVED.");
}
@@ -519,8 +523,7 @@
{
const uint32_t state_mask =
MM_MODE_INVALID | MM_MODE_UNOWNED | MM_MODE_SHARED;
- const uint32_t required_from_mode =
- ffa_memory_permissions_to_mode(permissions);
+ uint32_t required_from_mode;
struct ffa_value ret;
ret = constituents_get_mode(from, orig_from_mode, fragments,
@@ -546,6 +549,9 @@
return ffa_error(FFA_DENIED);
}
+ required_from_mode =
+ ffa_memory_permissions_to_mode(permissions, *orig_from_mode);
+
if ((*orig_from_mode & required_from_mode) != required_from_mode) {
dlog_verbose(
"Sender tried to send memory with permissions which "
@@ -2307,8 +2313,8 @@
panic("Got unexpected FFA_INSTRUCTION_ACCESS_RESERVED. Should "
"be checked before this point.");
}
- memory_to_attributes = ffa_memory_permissions_to_mode(permissions);
-
+ memory_to_attributes = ffa_memory_permissions_to_mode(
+ permissions, share_state->sender_orig_mode);
ret = ffa_retrieve_check_update(
to_locked, share_state->fragments,
share_state->fragment_constituent_counts,