diff options
author | Etienne Carriere <etienne.carriere@linaro.org> | 2017-04-10 09:21:01 +0200 |
---|---|---|
committer | Etienne Carriere <etienne.carriere@linaro.org> | 2017-04-12 11:31:40 +0200 |
commit | 04ec0d2d3913a6099c15d0632bebd6d500f03166 (patch) | |
tree | 4090d83083feafe8bac23a17ade5727415a78d0b /core/arch/arm/mm/core_mmu_v7.c | |
parent | ee203c1c8992996199bb1c11a63b4d449299b8f5 (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.c | 15 |
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); |