bl2-el3: Add BL2_EL3 image
authorRoberto Vargas <roberto.vargas@arm.com>
Mon, 30 Oct 2017 14:43:43 +0000 (14:43 +0000)
committerRoberto Vargas <roberto.vargas@arm.com>
Thu, 18 Jan 2018 09:42:35 +0000 (09:42 +0000)
This patch enables BL2 to execute at the highest exception level
without any dependancy on TF BL1. This enables platforms which already
have a non-TF Boot ROM to directly load and execute BL2 and subsequent BL
stages without need for BL1.  This is not currently possible because
BL2 executes at S-EL1 and cannot jump straight to EL3.

Change-Id: Ief1efca4598560b1b8c8e61fbe26d1f44e929d69
Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
20 files changed:
Makefile
bl2/aarch32/bl2_el3_entrypoint.S [new file with mode: 0644]
bl2/aarch32/bl2_el3_exceptions.S [new file with mode: 0644]
bl2/aarch64/bl2_el3_entrypoint.S [new file with mode: 0644]
bl2/aarch64/bl2_el3_exceptions.S [new file with mode: 0644]
bl2/bl2.mk
bl2/bl2_el3.ld.S [new file with mode: 0644]
bl2/bl2_main.c
bl2/bl2_private.h
include/common/aarch32/el3_common_macros.S
include/common/aarch64/el3_common_macros.S
include/lib/cpus/aarch32/cpu_macros.S
include/lib/cpus/aarch64/cpu_macros.S
include/lib/xlat_tables/xlat_tables_v2_helpers.h
include/plat/common/platform.h
lib/cpus/aarch32/cpu_helpers.S
lib/cpus/aarch64/cpu_helpers.S
lib/cpus/errata_report.c
make_helpers/defaults.mk
plat/common/plat_bl2_el3_common.c [new file with mode: 0644]

index 1058b396f816e4a109db5b24fd6421d67c03988a..b97c04889fb99e64653462eb09b3d806f6acbb6c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -500,6 +500,7 @@ $(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
 $(eval $(call assert_boolean,USE_COHERENT_MEM))
 $(eval $(call assert_boolean,USE_TBBR_DEFS))
 $(eval $(call assert_boolean,WARMBOOT_ENABLE_DCACHE_EARLY))
+$(eval $(call assert_boolean,BL2_AT_EL3))
 
 $(eval $(call assert_numeric,ARM_ARCH_MAJOR))
 $(eval $(call assert_numeric,ARM_ARCH_MINOR))
@@ -543,6 +544,7 @@ $(eval $(call add_define,TRUSTED_BOARD_BOOT))
 $(eval $(call add_define,USE_COHERENT_MEM))
 $(eval $(call add_define,USE_TBBR_DEFS))
 $(eval $(call add_define,WARMBOOT_ENABLE_DCACHE_EARLY))
+$(eval $(call add_define,BL2_AT_EL3))
 
 # Define the EL3_PAYLOAD_BASE flag only if it is provided.
 ifdef EL3_PAYLOAD_BASE
diff --git a/bl2/aarch32/bl2_el3_entrypoint.S b/bl2/aarch32/bl2_el3_entrypoint.S
new file mode 100644 (file)
index 0000000..997b069
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <bl_common.h>
+#include <el3_common_macros.S>
+
+
+       .globl  bl2_entrypoint
+       .globl  bl2_run_next_image
+
+
+func bl2_entrypoint
+       /* Save arguments x0-x3 from previous Boot loader */
+       mov     r9, r0
+       mov     r10, r1
+       mov     r11, r2
+       mov     r12, r3
+
+       el3_entrypoint_common                                   \
+                _init_sctlr=1                                   \
+                _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
+                _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
+                _init_memory=1                                  \
+                _init_c_runtime=1                               \
+                _exception_vectors=bl2_vector_table
+
+       /*
+        * Restore parameters of boot rom
+        */
+       mov     r0, r9
+       mov     r1, r10
+       mov     r2, r11
+       mov     r3, r12
+
+       bl      bl2_el3_early_platform_setup
+       bl      bl2_el3_plat_arch_setup
+
+       /* ---------------------------------------------
+        * Jump to main function.
+        * ---------------------------------------------
+        */
+       bl      bl2_main
+
+       /* ---------------------------------------------
+        * Should never reach this point.
+        * ---------------------------------------------
+        */
+       no_ret  plat_panic_handler
+
+endfunc bl2_entrypoint
+
+func bl2_run_next_image
+       mov     r8,r0
+
+       /*
+        * MMU needs to be disabled because both BL2 and BL32 execute
+        * in PL1, and therefore share the same address space.
+        * BL32 will initialize the address space according to its
+        * own requirement.
+        */
+       bl      disable_mmu_icache_secure
+       stcopr  r0, TLBIALL
+       dsb     sy
+       isb
+       mov     r0, r8
+       bl      bl2_el3_plat_prepare_exit
+
+       /*
+        * Extract PC and SPSR based on struct `entry_point_info_t`
+        * and load it in LR and SPSR registers respectively.
+        */
+       ldr     lr, [r8, #ENTRY_POINT_INFO_PC_OFFSET]
+       ldr     r1, [r8, #(ENTRY_POINT_INFO_PC_OFFSET + 4)]
+       msr     spsr, r1
+
+       add     r8, r8, #ENTRY_POINT_INFO_ARGS_OFFSET
+       ldm     r8, {r0, r1, r2, r3}
+       eret
+endfunc bl2_run_next_image
diff --git a/bl2/aarch32/bl2_el3_exceptions.S b/bl2/aarch32/bl2_el3_exceptions.S
new file mode 100644 (file)
index 0000000..11ddf37
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <bl_common.h>
+
+       .globl  bl2_vector_table
+
+vector_base bl2_vector_table
+       b       bl2_entrypoint
+       b       report_exception        /* Undef */
+       b       report_exception        /* SVC call */
+       b       report_exception        /* Prefetch abort */
+       b       report_exception        /* Data abort */
+       b       report_exception        /* Reserved */
+       b       report_exception        /* IRQ */
+       b       report_exception        /* FIQ */
diff --git a/bl2/aarch64/bl2_el3_entrypoint.S b/bl2/aarch64/bl2_el3_entrypoint.S
new file mode 100644 (file)
index 0000000..2d3efd1
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <bl_common.h>
+#include <el3_common_macros.S>
+
+       .globl  bl2_entrypoint
+       .globl  bl2_vector_table
+       .globl  bl2_el3_run_image
+       .globl  bl2_run_next_image
+
+func bl2_entrypoint
+       /* Save arguments x0-x3 from previous Boot loader */
+       mov     x20, x0
+       mov     x21, x1
+       mov     x22, x2
+       mov     x23, x3
+
+       el3_entrypoint_common                                   \
+               _init_sctlr=1                                   \
+               _warm_boot_mailbox=!PROGRAMMABLE_RESET_ADDRESS  \
+               _secondary_cold_boot=!COLD_BOOT_SINGLE_CPU      \
+               _init_memory=1                                  \
+               _init_c_runtime=1                               \
+               _exception_vectors=bl2_el3_exceptions
+
+       /*
+        * Restore parameters of boot rom
+        */
+       mov     x0, x20
+       mov     x1, x21
+       mov     x2, x22
+       mov     x3, x23
+
+       bl      bl2_el3_early_platform_setup
+       bl      bl2_el3_plat_arch_setup
+
+       /* ---------------------------------------------
+        * Jump to main function.
+        * ---------------------------------------------
+        */
+       bl      bl2_main
+
+       /* ---------------------------------------------
+        * Should never reach this point.
+        * ---------------------------------------------
+        */
+       no_ret  plat_panic_handler
+endfunc bl2_entrypoint
+
+func bl2_run_next_image
+       mov     x20,x0
+        /*
+         * MMU needs to be disabled because both BL2 and BL31 execute
+         * in EL3, and therefore share the same address space.
+         * BL31 will initialize the address space according to its
+         * own requirement.
+         */
+       bl      disable_mmu_icache_el3
+       tlbi    alle3
+       bl      bl2_el3_plat_prepare_exit
+
+       ldp     x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
+       msr     elr_el3, x0
+       msr     spsr_el3, x1
+
+       ldp     x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]
+       ldp     x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]
+       ldp     x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]
+       ldp     x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]
+       eret
+endfunc bl2_run_next_image
diff --git a/bl2/aarch64/bl2_el3_exceptions.S b/bl2/aarch64/bl2_el3_exceptions.S
new file mode 100644 (file)
index 0000000..987f6e3
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <bl1.h>
+#include <bl_common.h>
+#include <context.h>
+
+/* -----------------------------------------------------------------------------
+ * Very simple stackless exception handlers used by BL2.
+ * -----------------------------------------------------------------------------
+ */
+       .globl  bl2_el3_exceptions
+
+vector_base bl2_el3_exceptions
+
+       /* -----------------------------------------------------
+        * Current EL with SP0 : 0x0 - 0x200
+        * -----------------------------------------------------
+        */
+vector_entry SynchronousExceptionSP0
+       mov     x0, #SYNC_EXCEPTION_SP_EL0
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SynchronousExceptionSP0
+
+vector_entry IrqSP0
+       mov     x0, #IRQ_SP_EL0
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size IrqSP0
+
+vector_entry FiqSP0
+       mov     x0, #FIQ_SP_EL0
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size FiqSP0
+
+vector_entry SErrorSP0
+       mov     x0, #SERROR_SP_EL0
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SErrorSP0
+
+       /* -----------------------------------------------------
+        * Current EL with SPx: 0x200 - 0x400
+        * -----------------------------------------------------
+        */
+vector_entry SynchronousExceptionSPx
+       mov     x0, #SYNC_EXCEPTION_SP_ELX
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SynchronousExceptionSPx
+
+vector_entry IrqSPx
+       mov     x0, #IRQ_SP_ELX
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size IrqSPx
+
+vector_entry FiqSPx
+       mov     x0, #FIQ_SP_ELX
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size FiqSPx
+
+vector_entry SErrorSPx
+       mov     x0, #SERROR_SP_ELX
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SErrorSPx
+
+       /* -----------------------------------------------------
+        * Lower EL using AArch64 : 0x400 - 0x600
+        * -----------------------------------------------------
+        */
+vector_entry SynchronousExceptionA64
+       mov     x0, #SYNC_EXCEPTION_AARCH64
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SynchronousExceptionA64
+
+vector_entry IrqA64
+       mov     x0, #IRQ_AARCH64
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size IrqA64
+
+vector_entry FiqA64
+       mov     x0, #FIQ_AARCH64
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size FiqA64
+
+vector_entry SErrorA64
+       mov     x0, #SERROR_AARCH64
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SErrorA64
+
+       /* -----------------------------------------------------
+        * Lower EL using AArch32 : 0x600 - 0x800
+        * -----------------------------------------------------
+        */
+vector_entry SynchronousExceptionA32
+       mov     x0, #SYNC_EXCEPTION_AARCH32
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SynchronousExceptionA32
+
+vector_entry IrqA32
+       mov     x0, #IRQ_AARCH32
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size IrqA32
+
+vector_entry FiqA32
+       mov     x0, #FIQ_AARCH32
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size FiqA32
+
+vector_entry SErrorA32
+       mov     x0, #SERROR_AARCH32
+       bl      plat_report_exception
+       no_ret  plat_panic_handler
+       check_vector_size SErrorA32
index 32e328447c5a1546ec3a9656d913f1ec5c64a563..f6d69eb3c260ee9501230416d8aa8fa23024341d 100644 (file)
@@ -5,7 +5,6 @@
 #
 
 BL2_SOURCES            +=      bl2/bl2_main.c                          \
-                               bl2/${ARCH}/bl2_entrypoint.S            \
                                bl2/${ARCH}/bl2_arch_setup.c            \
                                lib/locks/exclusive/${ARCH}/spinlock.S  \
                                plat/common/${ARCH}/platform_up_stack.S
@@ -20,4 +19,15 @@ else
 BL2_SOURCES            +=      bl2/bl2_image_load.c
 endif
 
+ifeq (${BL2_AT_EL3},0)
+BL2_SOURCES            +=      bl2/${ARCH}/bl2_entrypoint.S
 BL2_LINKERFILE         :=      bl2/bl2.ld.S
+
+else
+BL2_SOURCES            +=      bl2/${ARCH}/bl2_el3_entrypoint.S        \
+                               bl2/${ARCH}/bl2_el3_exceptions.S        \
+                               plat/common/plat_bl2_el3_common.c       \
+                               lib/cpus/${ARCH}/cpu_helpers.S          \
+                               lib/cpus/errata_report.c
+BL2_LINKERFILE         :=      bl2/bl2_el3.ld.S
+endif
diff --git a/bl2/bl2_el3.ld.S b/bl2/bl2_el3.ld.S
new file mode 100644 (file)
index 0000000..7ec4646
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <platform_def.h>
+#include <xlat_tables_defs.h>
+
+OUTPUT_FORMAT(PLATFORM_LINKER_FORMAT)
+OUTPUT_ARCH(PLATFORM_LINKER_ARCH)
+ENTRY(bl2_entrypoint)
+
+MEMORY {
+    RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_LIMIT - BL2_BASE
+}
+
+
+SECTIONS
+{
+    . = BL2_BASE;
+    ASSERT(. == ALIGN(PAGE_SIZE),
+           "BL2_BASE address is not aligned on a page boundary.")
+
+#if SEPARATE_CODE_AND_RODATA
+    .text . : {
+        __TEXT_START__ = .;
+        *bl2_el3_entrypoint.o(.text*)
+        *(.text*)
+        *(.vectors)
+        . = NEXT(PAGE_SIZE);
+        __TEXT_END__ = .;
+     } >RAM
+
+    .rodata . : {
+        __RODATA_START__ = .;
+        *(.rodata*)
+
+        /* Ensure 8-byte alignment for descriptors and ensure inclusion */
+        . = ALIGN(8);
+        __PARSER_LIB_DESCS_START__ = .;
+        KEEP(*(.img_parser_lib_descs))
+        __PARSER_LIB_DESCS_END__ = .;
+
+        /*
+         * Ensure 8-byte alignment for cpu_ops so that its fields are also
+         * aligned. Also ensure cpu_ops inclusion.
+         */
+        . = ALIGN(8);
+        __CPU_OPS_START__ = .;
+        KEEP(*(cpu_ops))
+        __CPU_OPS_END__ = .;
+
+        . = NEXT(PAGE_SIZE);
+        __RODATA_END__ = .;
+    } >RAM
+#else
+    ro . : {
+        __RO_START__ = .;
+        *bl2_el3_entrypoint.o(.text*)
+        *(.text*)
+        *(.rodata*)
+
+        /*
+         * Ensure 8-byte alignment for cpu_ops so that its fields are also
+         * aligned. Also ensure cpu_ops inclusion.
+         */
+        . = ALIGN(8);
+        __CPU_OPS_START__ = .;
+        KEEP(*(cpu_ops))
+        __CPU_OPS_END__ = .;
+
+        /* Ensure 8-byte alignment for descriptors and ensure inclusion */
+        . = ALIGN(8);
+        __PARSER_LIB_DESCS_START__ = .;
+        KEEP(*(.img_parser_lib_descs))
+        __PARSER_LIB_DESCS_END__ = .;
+
+        *(.vectors)
+        __RO_END_UNALIGNED__ = .;
+        /*
+         * Memory page(s) mapped to this section will be marked as
+         * read-only, executable.  No RW data from the next section must
+         * creep in.  Ensure the rest of the current memory page is unused.
+         */
+        . = NEXT(PAGE_SIZE);
+
+        __RO_END__ = .;
+    } >RAM
+#endif
+
+    ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
+          "cpu_ops not defined for this platform.")
+
+    /*
+     * Define a linker symbol to mark start of the RW memory area for this
+     * image.
+     */
+    __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
+
+    stacks (NOLOAD) : {
+        __STACKS_START__ = .;
+        *(tzfw_normal_stacks)
+        __STACKS_END__ = .;
+    } >RAM
+
+    /*
+     * The .bss section gets initialised to 0 at runtime.
+     * Its base address should be 16-byte aligned for better performance of the
+     * zero-initialization code.
+     */
+    .bss : ALIGN(16) {
+        __BSS_START__ = .;
+        *(SORT_BY_ALIGNMENT(.bss*))
+        *(COMMON)
+        __BSS_END__ = .;
+    } >RAM
+
+    /*
+     * The xlat_table section is for full, aligned page tables (4K).
+     * Removing them from .bss avoids forcing 4K alignment on
+     * the .bss section and eliminates the unnecessary zero init
+     */
+    xlat_table (NOLOAD) : {
+        *(xlat_table)
+    } >RAM
+
+#if USE_COHERENT_MEM
+    /*
+     * The base address of the coherent memory section must be page-aligned (4K)
+     * to guarantee that the coherent data are stored on their own pages and
+     * are not mixed with normal data.  This is required to set up the correct
+     * memory attributes for the coherent data page tables.
+     */
+    coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
+        __COHERENT_RAM_START__ = .;
+        *(tzfw_coherent_mem)
+        __COHERENT_RAM_END_UNALIGNED__ = .;
+        /*
+         * Memory page(s) mapped to this section will be marked
+         * as device memory.  No other unexpected data must creep in.
+         * Ensure the rest of the current memory page is unused.
+         */
+        . = NEXT(PAGE_SIZE);
+        __COHERENT_RAM_END__ = .;
+    } >RAM
+#endif
+
+    /*
+     * Define a linker symbol to mark end of the RW memory area for this
+     * image.
+     */
+    __RW_END__ = .;
+    __BL2_END__ = .;
+
+    __BSS_SIZE__ = SIZEOF(.bss);
+
+#if USE_COHERENT_MEM
+    __COHERENT_RAM_UNALIGNED_SIZE__ =
+        __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
+#endif
+
+    ASSERT(. <= BL2_LIMIT, "BL2 image has exceeded its limit.")
+}
index 018deb344768b8af1e831d9f04086466a3296f9c..c85db2d4b58f4c5e940ae3a88c1c8418bc14d154 100644 (file)
 #include <platform.h>
 #include "bl2_private.h"
 
+#ifdef AARCH32
+#define NEXT_IMAGE     "BL32"
+#else
+#define NEXT_IMAGE     "BL31"
+#endif
 
 /*******************************************************************************
  * The only thing to do in BL2 is to load further images and pass control to
@@ -49,6 +54,8 @@ void bl2_main(void)
        disable_mmu_icache_secure();
 #endif /* AARCH32 */
 
+
+#if !BL2_AT_EL3
        console_flush();
 
        /*
@@ -57,4 +64,11 @@ void bl2_main(void)
         * be passed to next BL image as an argument.
         */
        smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
+#else
+       NOTICE("BL2: Booting " NEXT_IMAGE "\n");
+       print_entry_point_info(next_bl_ep_info);
+       console_flush();
+
+       bl2_run_next_image(next_bl_ep_info);
+#endif
 }
index 83b8047af447b09ffd14aed6c5acffea81adf498..ea2f33aaed8c7f0da4bb9cabaad8402b1e387d9b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -17,5 +17,6 @@ struct entry_point_info;
  *****************************************/
 void bl2_arch_setup(void);
 struct entry_point_info *bl2_load_images(void);
+void bl2_run_next_image(const entry_point_info_t *bl_ep_info);
 
 #endif /* __BL2_PRIVATE_H__ */
index 59e99f89aa49adb2d84ef03ac1ea78b0dc17d445..d654b6523a020858ea4b9bf8262c0c1dc32e88c5 100644 (file)
         * ---------------------------------------------------------------------
         */
        .if \_init_c_runtime
-#ifdef IMAGE_BL32
+#if defined(IMAGE_BL32) || (defined(IMAGE_BL2) && BL2_AT_EL3)
                /* -----------------------------------------------------------------
-                * Invalidate the RW memory used by the BL32 (SP_MIN) image. This
+                * Invalidate the RW memory used by the image. This
                 * includes the data and NOBITS sections. This is done to
                 * safeguard against possible corruption of this memory by
                 * dirty cache lines in a system cache as a result of use by
                ldr     r1, =__RW_END__
                sub     r1, r1, r0
                bl      inv_dcache_range
-#endif /* IMAGE_BL32 */
+#endif
 
                ldr     r0, =__BSS_START__
                ldr     r1, =__BSS_SIZE__
index 63a0fa770f6fcf1611dc6083e336b3bb1eae2005..ebaf7aa10c1f76286e8853e963804f480c355977 100644 (file)
         * ---------------------------------------------------------------------
         */
        .if \_init_c_runtime
-#ifdef IMAGE_BL31
+#if defined(IMAGE_BL31) || (defined(IMAGE_BL2) && BL2_AT_EL3)
                /* -------------------------------------------------------------
                 * Invalidate the RW memory used by the BL31 image. This
                 * includes the data and NOBITS sections. This is done to
                adr     x1, __RW_END__
                sub     x1, x1, x0
                bl      inv_dcache_range
-#endif /* IMAGE_BL31 */
+#endif
 
                ldr     x0, =__BSS_START__
                ldr     x1, =__BSS_SIZE__
index e2e4316d25198e964746fd283495403e36101427..0f3a5728be6552bcc6c402e1a27564c32996db21 100644 (file)
@@ -9,6 +9,10 @@
 #include <arch.h>
 #include <errata_report.h>
 
+#if defined(IMAGE_BL1) || defined(IMAGE_BL32)  || (defined(IMAGE_BL2) && BL2_AT_EL3)
+#define IMAGE_AT_EL3
+#endif
+
 #define CPU_IMPL_PN_MASK       (MIDR_IMPL_MASK << MIDR_IMPL_SHIFT) | \
                                (MIDR_PN_MASK << MIDR_PN_SHIFT)
 
@@ -38,7 +42,7 @@
 CPU_MIDR: /* cpu_ops midr */
        .space  4
 /* Reset fn is needed during reset */
-#if defined(IMAGE_BL1) || defined(IMAGE_BL32)
+#if defined(IMAGE_AT_EL3)
 CPU_RESET_FUNC: /* cpu_ops reset_func */
        .space  4
 #endif
@@ -54,7 +58,7 @@ CPU_PWR_DWN_OPS: /* cpu_ops power down functions */
 #if REPORT_ERRATA
 CPU_ERRATA_FUNC: /* CPU errata status printing function */
        .space  4
-#ifdef IMAGE_BL32
+#if defined(IMAGE_BL32)
 CPU_ERRATA_LOCK:
        .space  4
 CPU_ERRATA_PRINTED:
@@ -120,7 +124,7 @@ CPU_OPS_SIZE = .
        .align 2
        .type cpu_ops_\_name, %object
        .word \_midr
-#if defined(IMAGE_BL1) || defined(IMAGE_BL32)
+#if defined(IMAGE_AT_EL3)
        .word \_resetfunc
 #endif
 #ifdef IMAGE_BL32
index a8c23e5e0af0618dc104d971ffed8e8c150d9ba3..ccf530663ccbdadb9d91f8e67f932c2669fc86d4 100644 (file)
 /* Word size for 64-bit CPUs */
 #define CPU_WORD_SIZE                  8
 
+#if defined(IMAGE_BL1) || defined(IMAGE_BL31) ||(defined(IMAGE_BL2) && BL2_AT_EL3)
+#define IMAGE_AT_EL3
+#endif
+
 /*
  * Whether errata status needs reporting. Errata status is printed in debug
  * builds for both BL1 and BL31 images.
@@ -38,7 +42,7 @@
 CPU_MIDR: /* cpu_ops midr */
        .space  8
 /* Reset fn is needed in BL at reset vector */
-#if defined(IMAGE_BL1) || defined(IMAGE_BL31)
+#if defined(IMAGE_AT_EL3)
 CPU_RESET_FUNC: /* cpu_ops reset_func */
        .space  8
 #endif
@@ -54,7 +58,7 @@ CPU_PWR_DWN_OPS: /* cpu_ops power down functions */
 #if REPORT_ERRATA
 CPU_ERRATA_FUNC:
        .space  8
-#ifdef IMAGE_BL31
+#if defined(IMAGE_BL31)
 CPU_ERRATA_LOCK:
        .space  8
 CPU_ERRATA_PRINTED:
@@ -124,7 +128,7 @@ CPU_OPS_SIZE = .
        .align 3
        .type cpu_ops_\_name, %object
        .quad \_midr
-#if defined(IMAGE_BL1) || defined(IMAGE_BL31)
+#if defined(IMAGE_AT_EL3)
        .quad \_resetfunc
 #endif
 #ifdef IMAGE_BL31
index 1be99b719031867a90a2b8c67827df015fe93c25..de1c2d4bfd3f67e512286233d6c91096d6fba14e 100644 (file)
@@ -168,7 +168,7 @@ struct xlat_ctx {
  * This IMAGE_EL macro must not to be used outside the library, and it is only
  * used in AArch64.
  */
-#if defined(IMAGE_BL1) || defined(IMAGE_BL31)
+#if defined(IMAGE_BL1) || defined(IMAGE_BL31) || (defined(IMAGE_BL2) && BL2_AT_EL3)
 # define IMAGE_EL      3
 # define IMAGE_XLAT_DEFAULT_REGIME EL3_REGIME
 #else
index f11bee9f1ba0fc2d6a60955d2e67b0ecddb116a3..096010589a43d16d8d7dcf93955d675d12a1ffea 100644 (file)
@@ -235,6 +235,21 @@ void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info);
  * Optional BL2 functions (may be overridden)
  ******************************************************************************/
 
+
+/*******************************************************************************
+ * Mandatory BL2 at EL3 functions: Must be implemented if BL2_AT_EL3 image is
+ * supported
+ ******************************************************************************/
+void bl2_el3_early_platform_setup(u_register_t arg0, u_register_t arg1,
+                                 u_register_t arg2, u_register_t arg3);
+void bl2_el3_plat_arch_setup(void);
+
+
+/*******************************************************************************
+ * Optional BL2 at EL3 functions (may be overridden)
+ ******************************************************************************/
+void bl2_el3_plat_prepare_exit(void);
+
 /*******************************************************************************
  * Mandatory BL2U functions.
  ******************************************************************************/
index bfdc1e4f9ab362eddec7f096df880c6eaea81b9d..72e42c67456b28ed7caeebc471d69f0005ad5336 100644 (file)
@@ -10,7 +10,7 @@
 #include <cpu_data.h>
 #include <cpu_macros.S>
 
-#if defined(IMAGE_BL1) || defined(IMAGE_BL32)
+#if defined(IMAGE_BL1) || defined(IMAGE_BL32) || (defined(IMAGE_BL2) && BL2_AT_EL3)
        /*
         * The reset handler common to all platforms.  After a matching
         * cpu_ops structure entry is found, the correponding reset_handler
@@ -42,7 +42,7 @@ func reset_handler
        bx      lr
 endfunc reset_handler
 
-#endif /* IMAGE_BL1 || IMAGE_BL32 */
+#endif
 
 #ifdef IMAGE_BL32 /* The power down core and cluster is needed only in  BL32 */
        /*
index 238455341d4df5ae82c7a52f98c4fa0449e1c1a5..ae1c3c25259700e28c222512e19afac80e22ac2b 100644 (file)
@@ -7,7 +7,7 @@
 #include <arch.h>
 #include <asm_macros.S>
 #include <assert_macros.S>
-#ifdef IMAGE_BL31
+#if defined(IMAGE_BL31) || (defined(IMAGE_BL2) && BL2_AT_EL3)
 #include <cpu_data.h>
 #endif
 #include <cpu_macros.S>
@@ -15,7 +15,7 @@
 #include <errata_report.h>
 
  /* Reset fn is needed in BL at reset vector */
-#if defined(IMAGE_BL1) || defined(IMAGE_BL31)
+#if defined(IMAGE_BL1) || defined(IMAGE_BL31) || (defined(IMAGE_BL2) && BL2_AT_EL3)
        /*
         * The reset handler common to all platforms.  After a matching
         * cpu_ops structure entry is found, the correponding reset_handler
@@ -47,7 +47,7 @@ func reset_handler
        ret
 endfunc reset_handler
 
-#endif /* IMAGE_BL1 || IMAGE_BL31 */
+#endif
 
 #ifdef IMAGE_BL31 /* The power down core and cluster is needed only in  BL31 */
        /*
index 8d9f704a3d8bb9b0de64e87868faa85af4e4791a..182679d137c1cdedf1aaba588534261b09c205db 100644 (file)
@@ -20,6 +20,8 @@
 # define BL_STRING     "BL31"
 #elif defined(AARCH32) && defined(IMAGE_BL32)
 # define BL_STRING     "BL32"
+#elif defined(IMAGE_BL2) && BL2_AT_EL3
+# define BL_STRING "BL2"
 #else
 # error This image should not be printing errata status
 #endif
index fa0d17dec4282e4a71c3152fbdac73efd78ad8ae..643890f6ca061ad888c2905b921bd81384e15005 100644 (file)
@@ -27,6 +27,9 @@ ARM_GIC_ARCH                  := 2
 # Base commit to perform code check on
 BASE_COMMIT                    := origin/master
 
+# Execute BL2 at EL3
+BL2_AT_EL3                     := 0
+
 # By default, consider that the platform may release several CPUs out of reset.
 # The platform Makefile is free to override this value.
 COLD_BOOT_SINGLE_CPU           := 0
diff --git a/plat/common/plat_bl2_el3_common.c b/plat/common/plat_bl2_el3_common.c
new file mode 100644 (file)
index 0000000..358a02d
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <debug.h>
+#include <errno.h>
+#include <platform_def.h>
+
+/*
+ * The following platform functions are weakly defined. They
+ * are default implementations that allow BL2 to compile in
+ * absence of real definitions. The Platforms may override
+ * with more complex definitions.
+ */
+#pragma weak bl2_el3_plat_prepare_exit
+
+void bl2_el3_plat_prepare_exit(void)
+{
+}