ld: Separate code and RO data sections

This prevents the execution of the read-only data.

This is done in a similar way in TF-A when the build flag
SEPARATE_CODE_AND_RODATA is enabled.

The build flag is probably not needed in TF-A Tests.

Change-Id: I2bdc0237c00377beb2febeb47207770c85036192
Signed-off-by: Ambroise Vincent <ambroise.vincent@arm.com>
diff --git a/plat/common/plat_common.c b/plat/common/plat_common.c
index c5f4592..4cfbebb 100644
--- a/plat/common/plat_common.c
+++ b/plat/common/plat_common.c
@@ -27,32 +27,40 @@
 
 #if IMAGE_TFTF
 
-#define IMAGE_RO_BASE	TFTF_BASE
-IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END);
+#define IMAGE_TEXT_BASE		TFTF_BASE
+IMPORT_SYM(uintptr_t,		__TEXT_END__,		IMAGE_TEXT_END);
 
-#define IMAGE_RW_BASE	IMAGE_RO_END
-IMPORT_SYM(uintptr_t,	__TFTF_END__,		IMAGE_RW_END);
+#define IMAGE_RODATA_BASE	IMAGE_TEXT_END
+IMPORT_SYM(uintptr_t,		__RODATA_END__,		IMAGE_RODATA_END);
 
-IMPORT_SYM(uintptr_t,	__COHERENT_RAM_START__,	COHERENT_RAM_START);
-IMPORT_SYM(uintptr_t,	__COHERENT_RAM_END__,	COHERENT_RAM_END);
+#define IMAGE_RW_BASE		IMAGE_RODATA_END
+IMPORT_SYM(uintptr_t,		__TFTF_END__,		IMAGE_RW_END);
+
+IMPORT_SYM(uintptr_t,		__COHERENT_RAM_START__,	COHERENT_RAM_START);
+IMPORT_SYM(uintptr_t,		__COHERENT_RAM_END__,	COHERENT_RAM_END);
 
 #elif IMAGE_NS_BL1U
 
-IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END_UNALIGNED);
-#define IMAGE_RO_BASE	NS_BL1U_RO_BASE
-#define IMAGE_RO_END	round_up(IMAGE_RO_END_UNALIGNED, PAGE_SIZE)
+#define IMAGE_TEXT_BASE		NS_BL1U_BASE
+IMPORT_SYM(uintptr_t,		__TEXT_END__,		IMAGE_TEXT_END);
 
-#define IMAGE_RW_BASE	NS_BL1U_RW_BASE
-IMPORT_SYM(uintptr_t,	__NS_BL1U_RAM_END__,	IMAGE_RW_END);
+#define IMAGE_RODATA_BASE	IMAGE_TEXT_END
+IMPORT_SYM(uintptr_t,		__RODATA_END__,		IMAGE_RODATA_END);
+
+#define IMAGE_RW_BASE		NS_BL1U_RW_BASE
+IMPORT_SYM(uintptr_t,		__NS_BL1U_RAM_END__,	IMAGE_RW_END);
 
 #elif IMAGE_NS_BL2U
 
-#define IMAGE_RO_BASE	NS_BL2U_BASE
-IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END);
+#define IMAGE_TEXT_BASE		NS_BL2U_BASE
+IMPORT_SYM(uintptr_t,		__TEXT_END__,		IMAGE_TEXT_END);
 
-#define IMAGE_RW_BASE	IMAGE_RO_END
-IMPORT_SYM(uintptr_t,	__NS_BL2U_END__,	IMAGE_RW_END_UNALIGNED);
-#define IMAGE_RW_END	round_up(IMAGE_RW_END_UNALIGNED, PAGE_SIZE)
+#define IMAGE_RODATA_BASE	IMAGE_TEXT_END
+IMPORT_SYM(uintptr_t,		__RODATA_END__,		IMAGE_RODATA_END);
+
+#define IMAGE_RW_BASE		IMAGE_RODATA_END
+IMPORT_SYM(uintptr_t,		__NS_BL2U_END__,	IMAGE_RW_END_UNALIGNED);
+#define IMAGE_RW_END		round_up(IMAGE_RW_END_UNALIGNED, PAGE_SIZE)
 
 #endif
 
@@ -78,9 +86,13 @@
 
 void tftf_plat_configure_mmu(void)
 {
-	/* RO data + Code */
-	mmap_add_region(IMAGE_RO_BASE, IMAGE_RO_BASE,
-			IMAGE_RO_END - IMAGE_RO_BASE, MT_CODE);
+	/* Code */
+	mmap_add_region(IMAGE_TEXT_BASE, IMAGE_TEXT_BASE,
+			IMAGE_TEXT_END - IMAGE_TEXT_BASE, MT_CODE);
+
+	/* RO data */
+	mmap_add_region(IMAGE_RODATA_BASE, IMAGE_RODATA_BASE,
+			IMAGE_RODATA_END - IMAGE_RODATA_BASE, MT_RO_DATA);
 
 	/* Data + BSS */
 	mmap_add_region(IMAGE_RW_BASE, IMAGE_RW_BASE,