diff options
author | Sandrine Bailleux <sandrine.bailleux@arm.com> | 2016-07-08 14:38:16 +0100 |
---|---|---|
committer | Sandrine Bailleux <sandrine.bailleux@arm.com> | 2016-07-08 14:55:11 +0100 |
commit | 0af559a833e9cb1be1e1295d00e22ecab1d3f5be (patch) | |
tree | ba80ef8f1c8b8586c509c758cce4117c1bdf9261 /plat/arm/common/aarch64/arm_common.c | |
parent | b2c96eed562b221f32f56976c7283d0e5e8503d0 (diff) |
ARM platforms: Add support for SEPARATE_CODE_AND_RODATA
The arm_setup_page_tables() function used to expect a single set of
addresses defining the extents of the whole read-only section, code
and read-only data mixed up, which was mapped as executable.
This patch changes this behaviour. arm_setup_page_tables() now
expects 2 separate sets of addresses:
- the extents of the code section;
- the extents of the read-only data section.
The code is mapped as executable, whereas the data is mapped as
execute-never. New #defines have been introduced to identify the
extents of the code and the read-only data section. Given that
all BL images except BL1 share the same memory layout and linker
script structure, these #defines are common across these images.
The slight memory layout differences in BL1 have been handled by
providing values specific to BL1.
Note that this patch also affects the Xilinx platform port, which
uses the arm_setup_page_tables() function. It has been updated
accordingly, such that the memory mappings on this platform are
unchanged. This is achieved by passing null values as the extents
of the read-only data section so that it is ignored. As a result,
the whole read-only section is still mapped as executable.
Fixes ARM-software/tf-issues#85
Change-Id: I1f95865c53ce6e253a01286ff56e0aa1161abac5
Diffstat (limited to 'plat/arm/common/aarch64/arm_common.c')
-rw-r--r-- | plat/arm/common/aarch64/arm_common.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/plat/arm/common/aarch64/arm_common.c b/plat/arm/common/aarch64/arm_common.c index c0a7e6b4..36ba4c18 100644 --- a/plat/arm/common/aarch64/arm_common.c +++ b/plat/arm/common/aarch64/arm_common.c @@ -55,13 +55,16 @@ extern const mmap_region_t plat_arm_mmap[]; * The extents of the generic memory regions are specified by the function * arguments and consist of: * - Trusted SRAM seen by the BL image; - * - Read-only section (code and read-only data); + * - Code section; + * - Read-only data section; * - Coherent memory region, if applicable. */ void arm_setup_page_tables(unsigned long total_base, unsigned long total_size, - unsigned long ro_start, - unsigned long ro_limit + unsigned long code_start, + unsigned long code_limit, + unsigned long rodata_start, + unsigned long rodata_limit #if USE_COHERENT_MEM , unsigned long coh_start, @@ -76,16 +79,24 @@ void arm_setup_page_tables(unsigned long total_base, mmap_add_region(total_base, total_base, total_size, MT_MEMORY | MT_RW | MT_SECURE); - /* Re-map the read-only section */ - mmap_add_region(ro_start, ro_start, - ro_limit - ro_start, - MT_MEMORY | MT_RO | MT_SECURE); + + /* Re-map the code section */ + mmap_add_region(code_start, code_start, + code_limit - code_start, + MT_CODE | MT_SECURE); + + /* Re-map the read-only data section */ + mmap_add_region(rodata_start, rodata_start, + rodata_limit - rodata_start, + MT_RO_DATA | MT_SECURE); + #if USE_COHERENT_MEM /* Re-map the coherent memory region */ mmap_add_region(coh_start, coh_start, coh_limit - coh_start, MT_DEVICE | MT_RW | MT_SECURE); #endif + /* Now (re-)map the platform-specific memory regions */ mmap_add(plat_arm_get_mmap()); |