Unverified Commit af381678 authored by Antonio Niño Díaz's avatar Antonio Niño Díaz Committed by GitHub
Browse files

Merge pull request #1842 from DavidPu/reduce_cyclomatic_complexity_metric

Reduce cyclomatic complexity metric
parents a6388e49 e664b5b6
...@@ -231,52 +231,49 @@ typedef enum { ...@@ -231,52 +231,49 @@ typedef enum {
} action_t; } action_t;
#if PLAT_XLAT_TABLES_DYNAMIC
/* /*
* Recursive function that writes to the translation tables and unmaps the * Function that returns the first VA of the table affected by the specified
* specified region. * mmap region.
*/ */
static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm, static uintptr_t xlat_tables_find_start_va(mmap_region_t *mm,
const uintptr_t table_base_va, const uintptr_t table_base_va,
uint64_t *const table_base,
const unsigned int table_entries,
const unsigned int level) const unsigned int level)
{ {
assert((level >= ctx->base_level) && (level <= XLAT_TABLE_LEVEL_MAX));
uint64_t *subtable;
uint64_t desc;
uintptr_t table_idx_va; uintptr_t table_idx_va;
uintptr_t table_idx_end_va; /* End VA of this entry */
uintptr_t region_end_va = mm->base_va + mm->size - 1U;
unsigned int table_idx;
if (mm->base_va > table_base_va) { if (mm->base_va > table_base_va) {
/* Find the first index of the table affected by the region. */ /* Find the first index of the table affected by the region. */
table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level); table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level);
table_idx = (unsigned int)((table_idx_va - table_base_va) >>
XLAT_ADDR_SHIFT(level));
assert(table_idx < table_entries);
} else { } else {
/* Start from the beginning of the table. */ /* Start from the beginning of the table. */
table_idx_va = table_base_va; table_idx_va = table_base_va;
table_idx = 0;
} }
while (table_idx < table_entries) { return table_idx_va;
}
table_idx_end_va = table_idx_va + XLAT_BLOCK_SIZE(level) - 1U; /*
* Function that returns table index for the given VA and level arguments.
*/
static inline unsigned int xlat_tables_va_to_index(const uintptr_t table_base_va,
const uintptr_t va,
const unsigned int level)
{
return (unsigned int)((va - table_base_va) >> XLAT_ADDR_SHIFT(level));
}
desc = table_base[table_idx]; #if PLAT_XLAT_TABLES_DYNAMIC
uint64_t desc_type = desc & DESC_MASK;
/*
* From the given arguments, it decides which action to take when unmapping the
* specified region.
*/
static action_t xlat_tables_unmap_region_action(const mmap_region_t *mm,
const uintptr_t table_idx_va, const uintptr_t table_idx_end_va,
const unsigned int level, const uint64_t desc_type)
{
action_t action; action_t action;
uintptr_t region_end_va = mm->base_va + mm->size - 1U;
if ((mm->base_va <= table_idx_va) && if ((mm->base_va <= table_idx_va) &&
(region_end_va >= table_idx_end_va)) { (region_end_va >= table_idx_end_va)) {
...@@ -326,6 +323,44 @@ static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm, ...@@ -326,6 +323,44 @@ static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm,
action = ACTION_NONE; action = ACTION_NONE;
} }
return action;
}
/*
* Recursive function that writes to the translation tables and unmaps the
* specified region.
*/
static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm,
const uintptr_t table_base_va,
uint64_t *const table_base,
const unsigned int table_entries,
const unsigned int level)
{
assert((level >= ctx->base_level) && (level <= XLAT_TABLE_LEVEL_MAX));
uint64_t *subtable;
uint64_t desc;
uintptr_t table_idx_va;
uintptr_t table_idx_end_va; /* End VA of this entry */
uintptr_t region_end_va = mm->base_va + mm->size - 1U;
unsigned int table_idx;
table_idx_va = xlat_tables_find_start_va(mm, table_base_va, level);
table_idx = xlat_tables_va_to_index(table_base_va, table_idx_va, level);
while (table_idx < table_entries) {
table_idx_end_va = table_idx_va + XLAT_BLOCK_SIZE(level) - 1U;
desc = table_base[table_idx];
uint64_t desc_type = desc & DESC_MASK;
action_t action = xlat_tables_unmap_region_action(mm,
table_idx_va, table_idx_end_va, level,
desc_type);
if (action == ACTION_WRITE_BLOCK_ENTRY) { if (action == ACTION_WRITE_BLOCK_ENTRY) {
table_base[table_idx] = INVALID_DESC; table_base[table_idx] = INVALID_DESC;
...@@ -525,19 +560,8 @@ static uintptr_t xlat_tables_map_region(xlat_ctx_t *ctx, mmap_region_t *mm, ...@@ -525,19 +560,8 @@ static uintptr_t xlat_tables_map_region(xlat_ctx_t *ctx, mmap_region_t *mm,
unsigned int table_idx; unsigned int table_idx;
if (mm->base_va > table_base_va) { table_idx_va = xlat_tables_find_start_va(mm, table_base_va, level);
/* Find the first index of the table affected by the region. */ table_idx = xlat_tables_va_to_index(table_base_va, table_idx_va, level);
table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level);
table_idx = (unsigned int)((table_idx_va - table_base_va) >>
XLAT_ADDR_SHIFT(level));
assert(table_idx < table_entries);
} else {
/* Start from the beginning of the table. */
table_idx_va = table_base_va;
table_idx = 0U;
}
#if PLAT_XLAT_TABLES_DYNAMIC #if PLAT_XLAT_TABLES_DYNAMIC
if (level > ctx->base_level) if (level > ctx->base_level)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment