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
062dd378
Commit
062dd378
authored
May 02, 2017
by
davidcunado-arm
Committed by
GitHub
May 02, 2017
Browse files
Merge pull request #923 from nmenon/fix_xlat_1
xlat lib: Don't set mmap_attr_t enum to be -1
parents
7fa3214e
7055e6fa
Changes
1
Hide whitespace changes
Inline
Side-by-side
lib/xlat_tables/xlat_tables_common.c
View file @
062dd378
...
...
@@ -273,15 +273,19 @@ static uint64_t mmap_desc(mmap_attr_t attr, unsigned long long addr_pa,
}
/*
* Returns attributes of area at `base_va` with size `size`. It returns the
* attributes of the innermost region that contains it. If there are partial
* overlaps, it returns -1, as a smaller size is needed.
* Look for the innermost region that contains the area at `base_va` with size
* `size`. Populate *attr with the attributes of this region.
*
* On success, this function returns 0.
* If there are partial overlaps (meaning that a smaller size is needed) or if
* the region can't be found in the given area, it returns -1. In this case the
* value pointed by attr should be ignored by the caller.
*/
static
mmap_attr_
t
mmap_region_attr
(
mmap_region_t
*
mm
,
uintptr_t
base_va
,
size_t
size
)
static
in
t
mmap_region_attr
(
mmap_region_t
*
mm
,
uintptr_t
base_va
,
size_t
size
,
mmap_attr_t
*
attr
)
{
/* Don't assume that the area is contained in the first region */
mmap_attr_t
attr
=
-
1
;
int
ret
=
-
1
;
/*
* Get attributes from last (innermost) region that contains the
...
...
@@ -301,23 +305,25 @@ static mmap_attr_t mmap_region_attr(mmap_region_t *mm, uintptr_t base_va,
for
(;;
++
mm
)
{
if
(
!
mm
->
size
)
return
attr
;
/* Reached end of list */
return
ret
;
/* Reached end of list */
if
(
mm
->
base_va
>
base_va
+
size
-
1
)
return
attr
;
/* Next region is after area so end */
return
ret
;
/* Next region is after area so end */
if
(
mm
->
base_va
+
mm
->
size
-
1
<
base_va
)
continue
;
/* Next region has already been overtaken */
if
(
mm
->
attr
==
attr
)
if
(
!
ret
&&
mm
->
attr
==
*
attr
)
continue
;
/* Region doesn't override attribs so skip */
if
(
mm
->
base_va
>
base_va
||
mm
->
base_va
+
mm
->
size
-
1
<
base_va
+
size
-
1
)
return
-
1
;
/* Region doesn't fully cover our area */
attr
=
mm
->
attr
;
*
attr
=
mm
->
attr
;
ret
=
0
;
}
return
ret
;
}
static
mmap_region_t
*
init_xlation_table_inner
(
mmap_region_t
*
mm
,
...
...
@@ -360,9 +366,10 @@ static mmap_region_t *init_xlation_table_inner(mmap_region_t *mm,
* there are partially overlapping regions. On success,
* it will return the innermost region's attributes.
*/
mmap_attr_t
attr
=
mmap_region_attr
(
mm
,
base_va
,
level_size
);
if
(
attr
>=
0
)
{
mmap_attr_t
attr
;
int
r
=
mmap_region_attr
(
mm
,
base_va
,
level_size
,
&
attr
);
if
(
!
r
)
{
desc
=
mmap_desc
(
attr
,
base_va
-
mm
->
base_va
+
mm
->
base_pa
,
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