fvp: Reuse BL1 and BL2 memory through image overlaying
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Mon, 16 Jun 2014 15:12:27 +0000 (16:12 +0100)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Thu, 10 Jul 2014 15:34:54 +0000 (16:34 +0100)
This patch re-organizes the memory layout on FVP as to give the
BL3-2 image as much memory as possible.

Considering these two facts:
 - not all images need to live in memory at the same time. Once
   in BL3-1, the memory used by BL1 and BL2 can be reclaimed.
 - when BL2 loads the BL3-1 and BL3-2 images, it only considers the
   PROGBITS sections of those 2 images. The memory occupied by the
   NOBITS sections will be touched only at execution of the BL3-x
   images;
Then it is possible to choose the different base addresses such that
the NOBITS sections of BL3-1 and BL3-2 overlay BL1 and BL2.

On FVP we choose to put:
 - BL1 and BL3-1 at the top of the Trusted RAM, with BL3-1 NOBITS
   sections overlaying BL1;
 - BL3-2 at the bottom of the Trusted RAM, with its NOBITS sections
   overlaying BL2;

This is illustrated by the following diagram:

0x0404_0000 ------------    ------------------
            |   BL1    | <= |  BL3-1 NOBITS  |
            ------------ <= ------------------
            |          | <= | BL3-1 PROGBITS |
            ------------    ------------------
            |   BL2    | <= |  BL3-2 NOBITS  |
            ------------ <= ------------------
            |          | <= | BL3-2 PROGBITS |
0x0400_0000 ------------    ------------------

New platform-specific constants have been introduced to easily check
at link time that BL3-1 and BL3-2 PROGBITS sections don't overwrite
BL1 and BL2. These are optional and the platform code is free to define
them or not. If not defined, the linker won't attempt to check
image overlaying.

Fixes ARM-software/tf-issues#117

Change-Id: I5981d1c3d66ee70eaac8bd052630c9ac6dd8b042

bl31/bl31.ld.S
bl32/tsp/tsp.ld.S
plat/fvp/include/platform_def.h

index 15017429b8b52c473c38146bcea949caa3423386..34a349f23ca0d6a76c5512b475d75581d59ff50c 100644 (file)
@@ -75,6 +75,10 @@ SECTIONS
         __DATA_END__ = .;
     } >RAM
 
+#ifdef BL31_PROGBITS_LIMIT
+    ASSERT(. <= BL31_PROGBITS_LIMIT, "BL3-1 progbits has exceeded its limit.")
+#endif
+
     stacks (NOLOAD) : {
         __STACKS_START__ = .;
         *(tzfw_normal_stacks)
index 187915b6126a0f3be8ea6557392ce6b67c6e3800..5807141f1e83680cac91cfc04183ae07c8a062a6 100644 (file)
@@ -68,6 +68,10 @@ SECTIONS
         __DATA_END__ = .;
     } >RAM
 
+#ifdef BL32_PROGBITS_LIMIT
+    ASSERT(. <= BL32_PROGBITS_LIMIT, "BL3-2 progbits has exceeded its limit.")
+#endif
+
     stacks (NOLOAD) : {
         __STACKS_START__ = .;
         *(tzfw_normal_stacks)
index fe4d73b6ab77f58fef02db489790d801d5aca622..ec4cf525eb3dc791243cd4cd560c1f1d346d05ed 100644 (file)
  ******************************************************************************/
 #define BL1_RO_BASE                    TZROM_BASE
 #define BL1_RO_LIMIT                   (TZROM_BASE + TZROM_SIZE)
-#define BL1_RW_BASE                    TZRAM_BASE
-#define BL1_RW_LIMIT                   BL31_BASE
+/*
+ * Put BL1 RW at the top of the Trusted SRAM. BL1_RW_BASE is calculated using
+ * the current BL1 RW debug size plus a little space for growth.
+ */
+#define BL1_RW_BASE                    (TZRAM_BASE + TZRAM_SIZE - 0x6000)
+#define BL1_RW_LIMIT                   (TZRAM_BASE + TZRAM_SIZE)
 
 /*******************************************************************************
  * BL2 specific defines.
  ******************************************************************************/
-#define BL2_BASE                       (TZRAM_BASE + TZRAM_SIZE - 0xc000)
-#define BL2_LIMIT                      (TZRAM_BASE + TZRAM_SIZE)
+/*
+ * Put BL2 just below BL3-1. BL2_BASE is calculated using the current BL2 debug
+ * size plus a little space for growth.
+ */
+#define BL2_BASE                       (BL31_BASE - 0xC000)
+#define BL2_LIMIT                      BL31_BASE
 
 /*******************************************************************************
  * BL31 specific defines.
  ******************************************************************************/
-#define BL31_BASE                      (TZRAM_BASE + 0x6000)
-#if TSP_RAM_LOCATION_ID == TSP_IN_TZRAM
-#define BL31_LIMIT                     BL32_BASE
-#elif TSP_RAM_LOCATION_ID == TSP_IN_TZDRAM
-#define BL31_LIMIT                     BL2_BASE
-#endif
+/*
+ * Put BL3-1 at the top of the Trusted SRAM. BL31_BASE is calculated using the
+ * current BL3-1 debug size plus a little space for growth.
+ */
+#define BL31_BASE                      (TZRAM_BASE + TZRAM_SIZE - 0x1D000)
+#define BL31_PROGBITS_LIMIT            BL1_RW_BASE
+#define BL31_LIMIT                     (TZRAM_BASE + TZRAM_SIZE)
 
 /*******************************************************************************
  * BL32 specific defines.
 #if TSP_RAM_LOCATION_ID == TSP_IN_TZRAM
 # define TSP_SEC_MEM_BASE              TZRAM_BASE
 # define TSP_SEC_MEM_SIZE              TZRAM_SIZE
-# define BL32_BASE                     (TZRAM_BASE + TZRAM_SIZE - 0x1c000)
-# define BL32_LIMIT                    BL2_BASE
+# define BL32_BASE                     TZRAM_BASE
+# define BL32_PROGBITS_LIMIT           BL2_BASE
+# define BL32_LIMIT                    BL31_BASE
 #elif TSP_RAM_LOCATION_ID == TSP_IN_TZDRAM
 # define TSP_SEC_MEM_BASE              TZDRAM_BASE
 # define TSP_SEC_MEM_SIZE              TZDRAM_SIZE