summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidcunado-arm <david.cunado@arm.com>2017-05-02 15:32:23 +0100
committerGitHub <noreply@github.com>2017-05-02 15:32:23 +0100
commit062dd378280a6a1b9ace59d0be9c466a05a2de95 (patch)
tree3252e8f9099e5c00b9461c5586f4eca9fbb5e067
parent7fa3214e18ad640208eaf6c8d6111ec53f3894aa (diff)
parent7055e6fa32ef218e23a141ce79748439447abd0b (diff)
Merge pull request #923 from nmenon/fix_xlat_1
xlat lib: Don't set mmap_attr_t enum to be -1
-rw-r--r--lib/xlat_tables/xlat_tables_common.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/lib/xlat_tables/xlat_tables_common.c b/lib/xlat_tables/xlat_tables_common.c
index 4426ccef..23f3daa8 100644
--- a/lib/xlat_tables/xlat_tables_common.c
+++ b/lib/xlat_tables/xlat_tables_common.c
@@ -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 int 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);