Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
af381678
Unverified
Commit
af381678
authored
Mar 01, 2019
by
Antonio Niño Díaz
Committed by
GitHub
Mar 01, 2019
Browse files
Merge pull request #1842 from DavidPu/reduce_cyclomatic_complexity_metric
Reduce cyclomatic complexity metric
parents
a6388e49
e664b5b6
Changes
1
Show whitespace changes
Inline
Side-by-side
lib/xlat_tables_v2/xlat_tables_core.c
View file @
af381678
...
...
@@ -231,52 +231,49 @@ typedef enum {
}
action_t
;
#if PLAT_XLAT_TABLES_DYNAMIC
/*
*
Recursive f
unction that
writes to the translation
table
s
a
nd unmaps the
*
specified
region.
*
F
unction that
returns the first VA of the
table a
ffected by the specified
*
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
,
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
;
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
;
}
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
];
uint64_t
desc_type
=
desc
&
DESC_MASK
;
#if PLAT_XLAT_TABLES_DYNAMIC
/*
* 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
;
uintptr_t
region_end_va
=
mm
->
base_va
+
mm
->
size
-
1U
;
if
((
mm
->
base_va
<=
table_idx_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,
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
)
{
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,
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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment