diff options
author | David Pu <dpu@nvidia.com> | 2019-02-22 02:23:57 -0800 |
---|---|---|
committer | David Pu <dpu@nvidia.com> | 2019-02-28 10:14:20 -0800 |
commit | e664b5b6ae1bdbbdfb381dfe77053ffd4df44771 (patch) | |
tree | e9fd733018a75060b3de48953b6fcba2a8458c2d /lib/xlat_tables_v2 | |
parent | 3ff6e401f9a43dd4f6a93c8af6e4cb83f93343b5 (diff) |
xlat_tables_v2: find VA/idx with helper functions.
This patch introduces 2 helper functions 'xlat_tables_find_start_va' and
'xlat_tables_va_to_index' to find the first VA and table index affected by the
specified mmap region. it reduces code duplication and cyclomatic code
complexity in xlat_tables_map/unmap_region functions.
Cyclomatic complexity calculated using 'Coverity'
fixes arm-software/tf-issues#673
Signed-off-by: David Pu <dpu@nvidia.com>
Diffstat (limited to 'lib/xlat_tables_v2')
-rw-r--r-- | lib/xlat_tables_v2/xlat_tables_core.c | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/lib/xlat_tables_v2/xlat_tables_core.c b/lib/xlat_tables_v2/xlat_tables_core.c index a39dfc93..0e6a6fa8 100644 --- a/lib/xlat_tables_v2/xlat_tables_core.c +++ b/lib/xlat_tables_v2/xlat_tables_core.c @@ -231,6 +231,37 @@ typedef enum { } action_t; +/* + * Function that returns the first VA of the table affected by the specified + * mmap region. + */ +static uintptr_t xlat_tables_find_start_va(mmap_region_t *mm, + const uintptr_t table_base_va, + const unsigned int level) +{ + uintptr_t table_idx_va; + + if (mm->base_va > table_base_va) { + /* Find the first index of the table affected by the region. */ + table_idx_va = mm->base_va & ~XLAT_BLOCK_MASK(level); + } else { + /* Start from the beginning of the table. */ + table_idx_va = table_base_va; + } + + return table_idx_va; +} + +/* + * 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)); +} + #if PLAT_XLAT_TABLES_DYNAMIC /* @@ -316,19 +347,8 @@ static void xlat_tables_unmap_region(xlat_ctx_t *ctx, mmap_region_t *mm, unsigned int table_idx; - if (mm->base_va > table_base_va) { - /* Find the first index of the table affected by the region. */ - 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 = 0; - } + 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) { @@ -540,19 +560,8 @@ static uintptr_t xlat_tables_map_region(xlat_ctx_t *ctx, mmap_region_t *mm, unsigned int table_idx; - if (mm->base_va > table_base_va) { - /* Find the first index of the table affected by the region. */ - 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; - } + 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); #if PLAT_XLAT_TABLES_DYNAMIC if (level > ctx->base_level) |