diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/utils/mem_region.c | 55 | ||||
-rw-r--r-- | lib/xlat_tables/aarch64/xlat_tables.c | 12 | ||||
-rw-r--r-- | lib/xlat_tables_v2/aarch64/xlat_tables_arch.c | 12 | ||||
-rw-r--r-- | lib/xlat_tables_v2/xlat_tables_internal.c | 21 |
4 files changed, 77 insertions, 23 deletions
diff --git a/lib/utils/mem_region.c b/lib/utils/mem_region.c index 31c6231fa..24c2c1ded 100644 --- a/lib/utils/mem_region.c +++ b/lib/utils/mem_region.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -40,6 +40,59 @@ void clear_mem_regions(mem_region_t *tbl, size_t nregions) } } +#if defined(PLAT_XLAT_TABLES_DYNAMIC) +/* + * zero_normalmem all the regions defined in regions. + * It assumes that MMU is enabled and the memory is Normal memory. + * regions must be a valid pointer to a memory mem_region_t array, + * nregions is the size of the array. va is the virtual address + * where we want to map the physical pages that are going to + * be cleared, and chunk is the amount of memory mapped and + * cleared in every iteration. + */ +void clear_map_dyn_mem_regions(mem_region_t *regions, + size_t nregions, + uintptr_t va, + size_t chunk) +{ + uintptr_t begin; + int r; + size_t size; + const mmap_attr_t attr = MT_MEMORY|MT_RW|MT_NS; + + assert(regions != NULL); + assert(nregions > 0 && chunk > 0); + + for ( ; nregions--; regions++) { + begin = regions->base; + size = regions->nbytes; + if ((begin & (chunk-1)) != 0 || (size & (chunk-1)) != 0) { + INFO("PSCI: Not correctly aligned region\n"); + panic(); + } + + while (size > 0) { + r = mmap_add_dynamic_region(begin, va, chunk, attr); + if (r != 0) { + INFO("PSCI: mmap_add_dynamic_region failed with %d\n", r); + panic(); + } + + zero_normalmem((void *) va, chunk); + + r = mmap_remove_dynamic_region(va, chunk); + if (r != 0) { + INFO("PSCI: mmap_remove_dynamic_region failed with %d\n", r); + panic(); + } + + begin += chunk; + size -= chunk; + } + } +} +#endif + /* * This function checks that a region (addr + nbytes-1) of memory is totally * covered by one of the regions defined in tbl. diff --git a/lib/xlat_tables/aarch64/xlat_tables.c b/lib/xlat_tables/aarch64/xlat_tables.c index eabc3df9a..a72c6454c 100644 --- a/lib/xlat_tables/aarch64/xlat_tables.c +++ b/lib/xlat_tables/aarch64/xlat_tables.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -57,13 +57,13 @@ static unsigned long long calc_physical_addr_size_bits( } #if ENABLE_ASSERTIONS -/* Physical Address ranges supported in the AArch64 Memory Model */ +/* + * Physical Address ranges supported in the AArch64 Memory Model. Value 0b110 is + * supported in ARMv8.2 onwards. + */ static const unsigned int pa_range_bits_arr[] = { PARANGE_0000, PARANGE_0001, PARANGE_0010, PARANGE_0011, PARANGE_0100, - PARANGE_0101, -#if ARM_ARCH_AT_LEAST(8, 2) - PARANGE_0110, -#endif + PARANGE_0101, PARANGE_0110 }; static unsigned long long get_max_supported_pa(void) diff --git a/lib/xlat_tables_v2/aarch64/xlat_tables_arch.c b/lib/xlat_tables_v2/aarch64/xlat_tables_arch.c index ffbc665fd..b3504e1e2 100644 --- a/lib/xlat_tables_v2/aarch64/xlat_tables_arch.c +++ b/lib/xlat_tables_v2/aarch64/xlat_tables_arch.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -45,13 +45,13 @@ unsigned long long tcr_physical_addr_size_bits(unsigned long long max_addr) } #if ENABLE_ASSERTIONS -/* Physical Address ranges supported in the AArch64 Memory Model */ +/* + * Physical Address ranges supported in the AArch64 Memory Model. Value 0b110 is + * supported in ARMv8.2 onwards. + */ static const unsigned int pa_range_bits_arr[] = { PARANGE_0000, PARANGE_0001, PARANGE_0010, PARANGE_0011, PARANGE_0100, - PARANGE_0101, -#if ARM_ARCH_AT_LEAST(8, 2) - PARANGE_0110, -#endif + PARANGE_0101, PARANGE_0110 }; unsigned long long xlat_arch_get_max_supported_pa(void) diff --git a/lib/xlat_tables_v2/xlat_tables_internal.c b/lib/xlat_tables_v2/xlat_tables_internal.c index 584d7c475..8be6d942d 100644 --- a/lib/xlat_tables_v2/xlat_tables_internal.c +++ b/lib/xlat_tables_v2/xlat_tables_internal.c @@ -1066,18 +1066,19 @@ static void xlat_desc_print(const xlat_ctx_t *ctx, uint64_t desc) if (xlat_regime == EL3_REGIME) { /* For EL3, the AP[2] bit is all what matters */ - tf_printf((desc & LOWER_ATTRS(AP_RO)) ? ro_str : rw_str); + tf_printf("%s", (desc & LOWER_ATTRS(AP_RO)) ? ro_str : rw_str); } else { const char *ap_str = (desc & LOWER_ATTRS(AP_RO)) ? ro_str : rw_str; - tf_printf(ap_str); - tf_printf(priv_str); + tf_printf("%s", ap_str); + tf_printf("%s", priv_str); /* * EL0 can only have the same permissions as EL1 or no * permissions at all. */ - tf_printf((desc & LOWER_ATTRS(AP_ACCESS_UNPRIVILEGED)) + tf_printf("%s", + (desc & LOWER_ATTRS(AP_ACCESS_UNPRIVILEGED)) ? ap_str : no_access_str); - tf_printf(user_str); + tf_printf("%s", user_str); } const char *xn_str = "-XN"; @@ -1085,14 +1086,14 @@ static void xlat_desc_print(const xlat_ctx_t *ctx, uint64_t desc) if (xlat_regime == EL3_REGIME) { /* For EL3, the XN bit is all what matters */ - tf_printf(LOWER_ATTRS(XN) & desc ? xn_str : exec_str); + tf_printf("%s", LOWER_ATTRS(XN) & desc ? xn_str : exec_str); } else { /* For EL0 and EL1, we need to know who has which rights */ - tf_printf(LOWER_ATTRS(PXN) & desc ? xn_str : exec_str); - tf_printf(priv_str); + tf_printf("%s", LOWER_ATTRS(PXN) & desc ? xn_str : exec_str); + tf_printf("%s", priv_str); - tf_printf(LOWER_ATTRS(UXN) & desc ? xn_str : exec_str); - tf_printf(user_str); + tf_printf("%s", LOWER_ATTRS(UXN) & desc ? xn_str : exec_str); + tf_printf("%s", user_str); } tf_printf(LOWER_ATTRS(NS) & desc ? "-NS" : "-S"); |