diff --git a/bl1/bl1.ld.S b/bl1/bl1.ld.S index 4ebe8a02a9fddd4b6c273d432f50d2ae4d20d655..bc23828e496d6dc47bc3f5e4fc7d3b68eec45888 100644 --- a/bl1/bl1.ld.S +++ b/bl1/bl1.ld.S @@ -4,6 +4,14 @@ * SPDX-License-Identifier: BSD-3-Clause */ +/* + * The .data section gets copied from ROM to RAM at runtime. + * Its LMA should be 16-byte aligned to allow efficient copying of 16-bytes + * aligned regions in it. + * Its VMA must be page-aligned as it marks the first read/write page. + */ +#define DATA_ALIGN 16 + #include #include @@ -87,21 +95,9 @@ SECTIONS ASSERT(BL1_RW_BASE == ALIGN(PAGE_SIZE), "BL1_RW_BASE address is not aligned on a page boundary.") - /* - * The .data section gets copied from ROM to RAM at runtime. - * Its LMA should be 16-byte aligned to allow efficient copying of 16-bytes - * aligned regions in it. - * Its VMA must be page-aligned as it marks the first read/write page. - * - * It must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : ALIGN(16) { - __DATA_RAM_START__ = .; - *(SORT_BY_ALIGNMENT(.data*)) - __DATA_RAM_END__ = .; - } >RAM AT>ROM + DATA_SECTION >RAM AT>ROM + __DATA_RAM_START__ = __DATA_START__; + __DATA_RAM_END__ = __DATA_END__; STACK_SECTION >RAM BSS_SECTION >RAM diff --git a/bl2/bl2.ld.S b/bl2/bl2.ld.S index 17475f061625da9e9ad5dc9a54751a07589b7a34..37849c3124afae6aa515e648651158a79f399128 100644 --- a/bl2/bl2.ld.S +++ b/bl2/bl2.ld.S @@ -77,17 +77,7 @@ SECTIONS */ __RW_START__ = . ; - /* - * .data must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : { - __DATA_START__ = .; - *(SORT_BY_ALIGNMENT(.data*)) - __DATA_END__ = .; - } >RAM - + DATA_SECTION >RAM STACK_SECTION >RAM BSS_SECTION >RAM XLAT_TABLE_SECTION >RAM diff --git a/bl2/bl2_el3.ld.S b/bl2/bl2_el3.ld.S index ea7a23500c0d74a9a8e764eb82693a2ae6131593..8c45d9898f28e8da883647b4f13af219364379ec 100644 --- a/bl2/bl2_el3.ld.S +++ b/bl2/bl2_el3.ld.S @@ -101,16 +101,9 @@ SECTIONS */ __RW_START__ = . ; - /* - * .data must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : { - __DATA_RAM_START__ = .; - *(SORT_BY_ALIGNMENT(.data*)) - __DATA_RAM_END__ = .; - } >RAM AT>ROM + DATA_SECTION >RAM AT>ROM + __DATA_RAM_START__ = __DATA_START__; + __DATA_RAM_END__ = __DATA_END__; /* * .rela.dyn needs to come after .data for the read-elf utility to parse diff --git a/bl2u/bl2u.ld.S b/bl2u/bl2u.ld.S index 3ab43825c1147fd4217e5899ec7dac6770c37b17..a7752a490c2d78d67b3ed3057933281a16e08c49 100644 --- a/bl2u/bl2u.ld.S +++ b/bl2u/bl2u.ld.S @@ -79,17 +79,7 @@ SECTIONS */ __RW_START__ = . ; - /* - * .data must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : { - __DATA_START__ = .; - *(SORT_BY_ALIGNMENT(.data*)) - __DATA_END__ = .; - } >RAM - + DATA_SECTION >RAM STACK_SECTION >RAM BSS_SECTION >RAM XLAT_TABLE_SECTION >RAM diff --git a/bl31/bl31.ld.S b/bl31/bl31.ld.S index 94d03e3da557e06495acf7d5f083f71f3f646a1e..11e86a3c13ffd2c41c33f6deeb710b74fd437bca 100644 --- a/bl31/bl31.ld.S +++ b/bl31/bl31.ld.S @@ -114,16 +114,7 @@ SECTIONS */ __RW_START__ = . ; - /* - * .data must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : { - __DATA_START__ = .; - *(SORT_BY_ALIGNMENT(.data*)) - __DATA_END__ = .; - } >RAM + DATA_SECTION >RAM /* * .rela.dyn needs to come after .data for the read-elf utility to parse diff --git a/bl32/sp_min/sp_min.ld.S b/bl32/sp_min/sp_min.ld.S index 8e91cec91bbccffc411957aa3152fdc384762d0f..9e0596f1f056e4917245fb3be953d7b11cc07c36 100644 --- a/bl32/sp_min/sp_min.ld.S +++ b/bl32/sp_min/sp_min.ld.S @@ -91,11 +91,7 @@ SECTIONS */ __RW_START__ = . ; - .data . : { - __DATA_START__ = .; - *(.data*) - __DATA_END__ = .; - } >RAM + DATA_SECTION >RAM #ifdef BL32_PROGBITS_LIMIT ASSERT(. <= BL32_PROGBITS_LIMIT, "BL32 progbits has exceeded its limit.") diff --git a/bl32/tsp/tsp.ld.S b/bl32/tsp/tsp.ld.S index 7428c0345b0fb7629debeb826906062f716e78dd..bdcd2cf708f7923748b81406d18fd49c89ddd0af 100644 --- a/bl32/tsp/tsp.ld.S +++ b/bl32/tsp/tsp.ld.S @@ -70,11 +70,7 @@ SECTIONS */ __RW_START__ = . ; - .data . : { - __DATA_START__ = .; - *(.data*) - __DATA_END__ = .; - } >RAM + DATA_SECTION >RAM /* * .rela.dyn needs to come after .data for the read-elf utility to parse diff --git a/include/common/bl_common.ld.h b/include/common/bl_common.ld.h index 8ea7d6a8cce6479db3f31cb285cebfc3915fd537..97fed72044eb04614d76d7d8d37c20423e1258b7 100644 --- a/include/common/bl_common.ld.h +++ b/include/common/bl_common.ld.h @@ -17,6 +17,10 @@ #define BSS_ALIGN 8 #endif +#ifndef DATA_ALIGN +#define DATA_ALIGN 1 +#endif + #define CPU_OPS \ . = ALIGN(STRUCT_ALIGN); \ __CPU_OPS_START__ = .; \ @@ -85,6 +89,18 @@ GOT \ BASE_XLAT_TABLE_RO +/* + * .data must be placed at a lower address than the stacks if the stack + * protector is enabled. Alternatively, the .data.stack_protector_canary + * section can be placed independently of the main .data section. + */ +#define DATA_SECTION \ + .data . : ALIGN(DATA_ALIGN) { \ + __DATA_START__ = .; \ + *(SORT_BY_ALIGNMENT(.data*)) \ + __DATA_END__ = .; \ + } + #define STACK_SECTION \ stacks (NOLOAD) : { \ __STACKS_START__ = .; \ diff --git a/plat/mediatek/mt6795/bl31.ld.S b/plat/mediatek/mt6795/bl31.ld.S index 91ca87cb637949c62f758ed91c6fd6dcf0fc3598..3d881fc433a38ef938e41eb2cfeb60d1487d0c9b 100644 --- a/plat/mediatek/mt6795/bl31.ld.S +++ b/plat/mediatek/mt6795/bl31.ld.S @@ -59,16 +59,7 @@ SECTIONS */ __RW_START__ = . ; - /* - * .data must be placed at a lower address than the stacks if the stack - * protector is enabled. Alternatively, the .data.stack_protector_canary - * section can be placed independently of the main .data section. - */ - .data . : { - __DATA_START__ = .; - *(.data*) - __DATA_END__ = .; - } >RAM + DATA_SECTION >RAM #ifdef BL31_PROGBITS_LIMIT ASSERT(. <= BL31_PROGBITS_LIMIT, "BL3-1 progbits has exceeded its limit.")