refactor(ff-a): use bitfields for memory access bitmaps
Instead of doing the bit-manipulation manually, these types can be
declared as structs where the fields are given explicit bitwidths. The
compiler will generate the appropriate bit-manipulation automatically.
Change-Id: Ifb66ac6904b8c216ccc18f6f86bbf7c051178f6d
Signed-off-by: Karl Meakin <karl.meakin@arm.com>
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index 779224f..b9544d5 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -354,7 +354,7 @@
{
uint32_t mode = 0;
- switch (ffa_get_data_access_attr(permissions)) {
+ switch (permissions.data_access) {
case FFA_DATA_ACCESS_RO:
mode = MM_MODE_R;
break;
@@ -368,7 +368,7 @@
panic("Tried to convert FFA_DATA_ACCESS_RESERVED.");
}
- switch (ffa_get_instruction_access_attr(permissions)) {
+ switch (permissions.instruction_access) {
case FFA_INSTRUCTION_ACCESS_NX:
break;
case FFA_INSTRUCTION_ACCESS_X:
@@ -1779,21 +1779,21 @@
enum ffa_memory_cacheability cacheability;
enum ffa_memory_shareability shareability;
- memory_type = ffa_get_memory_type_attr(attributes);
+ memory_type = attributes.type;
if (memory_type != FFA_MEMORY_NORMAL_MEM) {
dlog_verbose("Invalid memory type %#x, expected %#x.\n",
memory_type, FFA_MEMORY_NORMAL_MEM);
return ffa_error(FFA_DENIED);
}
- cacheability = ffa_get_memory_cacheability_attr(attributes);
+ cacheability = attributes.cacheability;
if (cacheability != FFA_MEMORY_CACHE_WRITE_BACK) {
dlog_verbose("Invalid cacheability %#x, expected %#x.\n",
cacheability, FFA_MEMORY_CACHE_WRITE_BACK);
return ffa_error(FFA_DENIED);
}
- shareability = ffa_get_memory_shareability_attr(attributes);
+ shareability = attributes.shareability;
if (shareability != FFA_MEMORY_INNER_SHAREABLE) {
dlog_verbose("Invalid shareability %#x, expected #%x.\n",
shareability, FFA_MEMORY_INNER_SHAREABLE);
@@ -2001,9 +2001,8 @@
return ffa_error(FFA_INVALID_PARAMETERS);
}
- data_access = ffa_get_data_access_attr(permissions);
- instruction_access =
- ffa_get_instruction_access_attr(permissions);
+ data_access = permissions.data_access;
+ instruction_access = permissions.instruction_access;
if (data_access == FFA_DATA_ACCESS_RESERVED ||
instruction_access == FFA_INSTRUCTION_ACCESS_RESERVED) {
dlog_verbose(
@@ -2036,9 +2035,8 @@
* retriever.
*/
if (vm_id_is_current_world(receiver_id)) {
- ffa_set_instruction_access_attr(
- &permissions,
- FFA_INSTRUCTION_ACCESS_NX);
+ permissions.instruction_access =
+ FFA_INSTRUCTION_ACCESS_NX;
receiver_permissions.permissions = permissions;
}
}
@@ -2062,8 +2060,7 @@
}
/* Memory region attributes NS-Bit MBZ for FFA_MEM_SHARE/LEND/DONATE. */
- security_state =
- ffa_get_memory_security_attr(memory_region->attributes);
+ security_state = memory_region->attributes.security;
if (security_state != FFA_MEMORY_SECURITY_UNSPECIFIED) {
dlog_verbose(
"Invalid security state for memory share operation.\n");
@@ -2077,7 +2074,7 @@
if (share_func == FFA_MEM_DONATE_32 ||
(share_func == FFA_MEM_LEND_32 &&
memory_region->receiver_count == 1)) {
- if (ffa_get_memory_type_attr(memory_region->attributes) !=
+ if (memory_region->attributes.type !=
FFA_MEMORY_NOT_SPECIFIED_MEM) {
dlog_verbose(
"Memory type shall not be specified by "
@@ -2435,10 +2432,8 @@
* currently expect one borrower to be specified.
*/
ffa_memory_access_init_v1_0(
- receiver, receiver_id,
- ffa_get_data_access_attr(permissions),
- ffa_get_instruction_access_attr(permissions),
- recv_flags);
+ receiver, receiver_id, permissions.data_access,
+ permissions.instruction_access, recv_flags);
}
composite_offset =
@@ -2548,8 +2543,7 @@
if (requested_data_access == FFA_DATA_ACCESS_NOT_SPECIFIED ||
requested_data_access == FFA_DATA_ACCESS_RW) {
if (permissions != NULL) {
- ffa_set_data_access_attr(permissions,
- FFA_DATA_ACCESS_RW);
+ permissions->data_access = FFA_DATA_ACCESS_RW;
}
break;
}
@@ -2558,8 +2552,7 @@
if (requested_data_access == FFA_DATA_ACCESS_NOT_SPECIFIED ||
requested_data_access == FFA_DATA_ACCESS_RO) {
if (permissions != NULL) {
- ffa_set_data_access_attr(permissions,
- FFA_DATA_ACCESS_RO);
+ permissions->data_access = FFA_DATA_ACCESS_RO;
}
break;
}
@@ -2630,8 +2623,8 @@
case FFA_INSTRUCTION_ACCESS_X:
if (requested_instruction_access == FFA_INSTRUCTION_ACCESS_X) {
if (permissions != NULL) {
- ffa_set_instruction_access_attr(
- permissions, FFA_INSTRUCTION_ACCESS_X);
+ permissions->instruction_access =
+ FFA_INSTRUCTION_ACCESS_X;
}
break;
}
@@ -2644,8 +2637,8 @@
FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED ||
requested_instruction_access == FFA_INSTRUCTION_ACCESS_NX) {
if (permissions != NULL) {
- ffa_set_instruction_access_attr(
- permissions, FFA_INSTRUCTION_ACCESS_NX);
+ permissions->instruction_access =
+ FFA_INSTRUCTION_ACCESS_NX;
}
break;
}
@@ -2690,7 +2683,7 @@
assert(receiver_ret != NULL);
assert(permissions != NULL);
- *permissions = 0;
+ *permissions = (ffa_memory_access_permissions_t){0};
if (!bypass_multi_receiver_check) {
if (retrieve_request->receiver_count != region_receiver_count) {
@@ -2778,10 +2771,10 @@
* - Permissions are within those specified by the sender.
*/
ret = ffa_memory_retrieve_is_memory_access_valid(
- func_id, ffa_get_data_access_attr(sent_permissions),
- ffa_get_data_access_attr(requested_permissions),
- ffa_get_instruction_access_attr(sent_permissions),
- ffa_get_instruction_access_attr(requested_permissions),
+ func_id, sent_permissions.data_access,
+ requested_permissions.data_access,
+ sent_permissions.instruction_access,
+ requested_permissions.instruction_access,
found_to_id ? permissions : NULL,
region_receiver_count > 1);
@@ -2789,8 +2782,8 @@
return ret;
}
- permissions_RO = (ffa_get_data_access_attr(*permissions) ==
- FFA_DATA_ACCESS_RO);
+ permissions_RO =
+ (permissions->data_access == FFA_DATA_ACCESS_RO);
clear_memory_flags =
(retrieve_request->flags &
(FFA_MEMORY_REGION_FLAG_CLEAR |
@@ -2860,7 +2853,10 @@
struct vm_locked to_locked)
{
return to_locked.vm->id == HF_HYPERVISOR_VM_ID &&
- request->attributes == 0U && request->flags == 0U &&
+ request->attributes.shareability == 0U &&
+ request->attributes.cacheability == 0U &&
+ request->attributes.type == 0U &&
+ request->attributes.security == 0U && request->flags == 0U &&
request->tag == 0U && request->receiver_count == 0U &&
plat_ffa_memory_handle_allocated_by_current_world(
request->handle);
@@ -3052,8 +3048,7 @@
}
/* Memory region attributes NS-Bit MBZ for FFA_MEM_RETRIEVE_REQ. */
- security_state =
- ffa_get_memory_security_attr(retrieve_request->attributes);
+ security_state = retrieve_request->attributes.security;
if (security_state != FFA_MEMORY_SECURITY_UNSPECIFIED) {
dlog_verbose(
"Invalid security state for memory retrieve request "
@@ -3066,8 +3061,7 @@
* attributes in the retrieve request. The retriever is expecting to
* obtain this information from the SPMC.
*/
- if (ffa_get_memory_type_attr(retrieve_request->attributes) ==
- FFA_MEMORY_NOT_SPECIFIED_MEM) {
+ if (retrieve_request->attributes.type == FFA_MEMORY_NOT_SPECIFIED_MEM) {
return (struct ffa_value){.func = FFA_SUCCESS_32};
}
@@ -3085,7 +3079,7 @@
struct ffa_memory_region *retrieve_request,
uint32_t retrieve_request_length, struct mpool *page_pool)
{
- ffa_memory_access_permissions_t permissions = 0;
+ ffa_memory_access_permissions_t permissions = {0};
uint32_t memory_to_mode;
struct ffa_value ret;
struct ffa_composite_memory_region *composite;
@@ -3098,7 +3092,7 @@
uint32_t receiver_index;
struct ffa_memory_access *receiver;
ffa_memory_handle_t handle = retrieve_request->handle;
- ffa_memory_attributes_t attributes = 0;
+ ffa_memory_attributes_t attributes = {0};
uint32_t retrieve_mode = 0;
struct ffa_memory_region *memory_region = share_state->memory_region;
@@ -3556,7 +3550,7 @@
struct ffa_value ret;
uint32_t receiver_index;
bool receivers_relinquished_memory;
- ffa_memory_access_permissions_t receiver_permissions = 0;
+ ffa_memory_access_permissions_t receiver_permissions = {0};
if (relinquish_request->endpoint_count != 1) {
dlog_verbose(
@@ -3657,8 +3651,8 @@
goto out;
}
- if (clear && ffa_get_data_access_attr(receiver_permissions) ==
- FFA_DATA_ACCESS_RO) {
+ if (clear && receiver_permissions.instruction_access == 0 &&
+ receiver_permissions.data_access == FFA_DATA_ACCESS_RO) {
dlog_verbose("%s: RO memory can't use clear memory flag.\n",
__func__);
ret = ffa_error(FFA_DENIED);