From 7c5e40d9f8699a55ac2187c035429c643e6d0ef0 Mon Sep 17 00:00:00 2001
From: Jaxson Han <jaxson.han@arm.com>
Date: Tue, 2 Nov 2021 15:10:28 +0800
Subject: [PATCH] lds: Rearrange and mark the sections

To make it possible for the next stage to protect sections with MPU,
boot-wrapper needs to provide the text and data section information.
By rearranging the .data .rodata and .vector sections, all sections
can be split into 2 big sections:
 - RO and Executable
 - RW and Non-Executable
Add firmware_data to mark the boundry, thus:
firmware_start to firmware_data - 1 indicates RO and Executable section,
firmware_data to firmware_end - 1 indicates RW and Non-Executable
section.

Also, the firmware_data and firmware_end should align with 64 bytes,
since Armv8R AArch64 MPU requires it.

Issue-ID: SCM-3816
Upstream-Status: Inappropriate [other]
  Implementation pending further discussion
Signed-off-by: Jaxson Han <jaxson.han@arm.com>
Change-Id: I55342aa7492f2c7b5c16ab9a6472c8cb45cff8fd
---
 model.lds.S | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/model.lds.S b/model.lds.S
index ab98ddf..85451f9 100644
--- a/model.lds.S
+++ b/model.lds.S
@@ -63,12 +63,16 @@ SECTIONS
 	}
 #endif
 
+#define FIRMWARE_ALIGN . = ALIGN(1 << 6)
 	.boot PHYS_OFFSET: {
 		PROVIDE(firmware_start = .);
 		*(.init)
 		*(.text*)
-		*(.data* .rodata* .bss* COMMON)
 		*(.vectors)
+		*(.rodata*)
+		FIRMWARE_ALIGN;
+		PROVIDE(firmware_data = .);
+		*(.data* .bss* COMMON)
 		*(.stack)
 		PROVIDE(etext = .);
 	}
@@ -77,6 +81,7 @@ SECTIONS
 		mbox = .;
 		QUAD(0x0)
 	}
+	FIRMWARE_ALIGN;
 	PROVIDE(firmware_end = .);
 
 	ASSERT(etext <= (PHYS_OFFSET + TEXT_LIMIT), ".text overflow!")
