From 7055e6fa32ef218e23a141ce79748439447abd0b Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Mon, 1 May 2017 12:26:34 -0500 Subject: xlat lib: Don't set mmap_attr_t enum to be -1 -1 is not a defined mmap_attr_t type. Instead of using invalid enum types, we can either choose to define a INVALID type OR handle the condition specifically. Since the usage of mmap_region_attr is limited, it is easier to just handle the error condition specifically and return 0 or -1 depending on success or fail. Fixes: ARM-Software/tf-issues#473 Fixes: 28fa2e9ee8f4 ("xlat lib: Use mmap_attr_t type consistently") Signed-off-by: Nishanth Menon --- lib/xlat_tables/xlat_tables_common.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'lib') 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); -- cgit v1.2.3