xlat: Fix checks in mmap_add() and mmap_add_ctx()
authorAntonio Nino Diaz <antonio.ninodiaz@arm.com>
Mon, 8 Oct 2018 15:11:11 +0000 (16:11 +0100)
committerAntonio Nino Diaz <antonio.ninodiaz@arm.com>
Mon, 8 Oct 2018 15:15:21 +0000 (16:15 +0100)
Commit 79621f0038b789de23ecc8891024f7cf6aa65999 broke sgi575.

It is possible to have a region with 0 as value for the attributes. It
means device memory, read only, secure, executable. This is legitimate
if the code is in flash and the code is executed from there.

This is the case for SGI_MAP_FLASH0_RO, defined in the file
plat/arm/css/sgi/sgi_plat.c.

This problem is solved by checking both size and attributes in xlat v1.
In xlat v2, it is enough to check the granularity, as it can never be 0.

Change-Id: I7be11f1b0e51c4c2ffd560b4a6cdfbf15de2c276
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
lib/xlat_tables/xlat_tables_common.c
lib/xlat_tables_v2/xlat_tables_core.c

index a9aaeee8d487302d39139b100c62e1916c9ec37a..2ee77c7aebe967b6f9db0dfe0aa2c053fc75873b 100644 (file)
@@ -176,7 +176,7 @@ void mmap_add(const mmap_region_t *mm)
 {
        const mmap_region_t *mm_cursor = mm;
 
-       while (mm_cursor->attr != 0U) {
+       while ((mm_cursor->size != 0U) || (mm_cursor->attr != 0U)) {
                mmap_add_region(mm_cursor->base_pa, mm_cursor->base_va,
                                mm_cursor->size, mm_cursor->attr);
                mm_cursor++;
index 3b6c6bcb259450c54b25c948d26afa1f63fc8139..8ced76e43ff76f734d09f1ac9fbcc98f974d11e7 100644 (file)
@@ -815,7 +815,7 @@ void mmap_add_ctx(xlat_ctx_t *ctx, const mmap_region_t *mm)
 {
        const mmap_region_t *mm_cursor = mm;
 
-       while (mm_cursor->attr != 0U) {
+       while (mm_cursor->granularity != 0U) {
                mmap_add_region_ctx(ctx, mm_cursor);
                mm_cursor++;
        }