aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm/mm/core_mmu_v7.c
diff options
context:
space:
mode:
authorEtienne Carriere <etienne.carriere@linaro.org>2017-04-10 09:21:01 +0200
committerEtienne Carriere <etienne.carriere@linaro.org>2017-04-12 11:31:40 +0200
commit04ec0d2d3913a6099c15d0632bebd6d500f03166 (patch)
tree4090d83083feafe8bac23a17ade5727415a78d0b /core/arch/arm/mm/core_mmu_v7.c
parentee203c1c8992996199bb1c11a63b4d449299b8f5 (diff)
core: fix non-LPAE mapping against unmapped areas
Core defines some virtual memory than should not be default mapped. Yet core_mmu_v7.c loads a non null descriptor in MMU tables for such memories: attributes are null (which makes the page effectively not mapped) but a meaningless non null physical page address is loaded. This change Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'core/arch/arm/mm/core_mmu_v7.c')
-rw-r--r--core/arch/arm/mm/core_mmu_v7.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/core/arch/arm/mm/core_mmu_v7.c b/core/arch/arm/mm/core_mmu_v7.c
index 54f6caad..ae821130 100644
--- a/core/arch/arm/mm/core_mmu_v7.c
+++ b/core/arch/arm/mm/core_mmu_v7.c
@@ -347,7 +347,7 @@ static uint32_t mattr_to_desc(unsigned level, uint32_t attr)
}
if (!(a & TEE_MATTR_VALID_BLOCK))
- return 0;
+ return INVALID_DESC;
if (a & (TEE_MATTR_PX | TEE_MATTR_PW))
a |= TEE_MATTR_PR;
@@ -630,9 +630,11 @@ static paddr_t map_page_memarea(struct tee_mmap_region *mm)
/* Fill in the entries */
while ((pg_idx * SMALL_PAGE_SIZE) <
- (mm->size + (mm->va & SECTION_MASK))) {
- l2[pg_idx] = ((mm->pa & ~SECTION_MASK) +
- pg_idx * SMALL_PAGE_SIZE) | attr;
+ (mm->size + (mm->va & SECTION_MASK))) {
+ l2[pg_idx] = attr;
+ if (attr != INVALID_DESC)
+ l2[pg_idx] |= (mm->pa & ~SECTION_MASK) +
+ pg_idx * SMALL_PAGE_SIZE;
pg_idx++;
}
@@ -690,7 +692,10 @@ static void map_memarea(struct tee_mmap_region *mm, uint32_t *ttb)
region_size = SECTION_SIZE;
attr = mattr_to_desc(1, mm->attr);
- pa = mm->pa;
+ if (attr == INVALID_DESC)
+ pa = 0;
+ else
+ pa = mm->pa;
}
m = (mm->va >> SECTION_SHIFT);