xref: /aosp_15_r20/external/arm-trusted-firmware/bl2/bl2_main.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #include <assert.h>
8*54fd6939SJiyong Park 
9*54fd6939SJiyong Park #include <arch_helpers.h>
10*54fd6939SJiyong Park #include <arch_features.h>
11*54fd6939SJiyong Park #include <bl1/bl1.h>
12*54fd6939SJiyong Park #include <bl2/bl2.h>
13*54fd6939SJiyong Park #include <common/bl_common.h>
14*54fd6939SJiyong Park #include <common/debug.h>
15*54fd6939SJiyong Park #include <drivers/auth/auth_mod.h>
16*54fd6939SJiyong Park #include <drivers/console.h>
17*54fd6939SJiyong Park #include <drivers/fwu/fwu.h>
18*54fd6939SJiyong Park #include <lib/extensions/pauth.h>
19*54fd6939SJiyong Park #include <plat/common/platform.h>
20*54fd6939SJiyong Park 
21*54fd6939SJiyong Park #include "bl2_private.h"
22*54fd6939SJiyong Park 
23*54fd6939SJiyong Park #ifdef __aarch64__
24*54fd6939SJiyong Park #define NEXT_IMAGE	"BL31"
25*54fd6939SJiyong Park #else
26*54fd6939SJiyong Park #define NEXT_IMAGE	"BL32"
27*54fd6939SJiyong Park #endif
28*54fd6939SJiyong Park 
29*54fd6939SJiyong Park #if BL2_AT_EL3
30*54fd6939SJiyong Park /*******************************************************************************
31*54fd6939SJiyong Park  * Setup function for BL2 when BL2_AT_EL3=1
32*54fd6939SJiyong Park  ******************************************************************************/
bl2_el3_setup(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)33*54fd6939SJiyong Park void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
34*54fd6939SJiyong Park 		   u_register_t arg3)
35*54fd6939SJiyong Park {
36*54fd6939SJiyong Park 	/* Perform early platform-specific setup */
37*54fd6939SJiyong Park 	bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
38*54fd6939SJiyong Park 
39*54fd6939SJiyong Park 	/* Perform late platform-specific setup */
40*54fd6939SJiyong Park 	bl2_el3_plat_arch_setup();
41*54fd6939SJiyong Park 
42*54fd6939SJiyong Park #if CTX_INCLUDE_PAUTH_REGS
43*54fd6939SJiyong Park 	/*
44*54fd6939SJiyong Park 	 * Assert that the ARMv8.3-PAuth registers are present or an access
45*54fd6939SJiyong Park 	 * fault will be triggered when they are being saved or restored.
46*54fd6939SJiyong Park 	 */
47*54fd6939SJiyong Park 	assert(is_armv8_3_pauth_present());
48*54fd6939SJiyong Park #endif /* CTX_INCLUDE_PAUTH_REGS */
49*54fd6939SJiyong Park }
50*54fd6939SJiyong Park #else /* BL2_AT_EL3 */
51*54fd6939SJiyong Park /*******************************************************************************
52*54fd6939SJiyong Park  * Setup function for BL2 when BL2_AT_EL3=0
53*54fd6939SJiyong Park  ******************************************************************************/
bl2_setup(u_register_t arg0,u_register_t arg1,u_register_t arg2,u_register_t arg3)54*54fd6939SJiyong Park void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
55*54fd6939SJiyong Park 	       u_register_t arg3)
56*54fd6939SJiyong Park {
57*54fd6939SJiyong Park 	/* Perform early platform-specific setup */
58*54fd6939SJiyong Park 	bl2_early_platform_setup2(arg0, arg1, arg2, arg3);
59*54fd6939SJiyong Park 
60*54fd6939SJiyong Park 	/* Perform late platform-specific setup */
61*54fd6939SJiyong Park 	bl2_plat_arch_setup();
62*54fd6939SJiyong Park 
63*54fd6939SJiyong Park #if CTX_INCLUDE_PAUTH_REGS
64*54fd6939SJiyong Park 	/*
65*54fd6939SJiyong Park 	 * Assert that the ARMv8.3-PAuth registers are present or an access
66*54fd6939SJiyong Park 	 * fault will be triggered when they are being saved or restored.
67*54fd6939SJiyong Park 	 */
68*54fd6939SJiyong Park 	assert(is_armv8_3_pauth_present());
69*54fd6939SJiyong Park #endif /* CTX_INCLUDE_PAUTH_REGS */
70*54fd6939SJiyong Park }
71*54fd6939SJiyong Park #endif /* BL2_AT_EL3 */
72*54fd6939SJiyong Park 
73*54fd6939SJiyong Park /*******************************************************************************
74*54fd6939SJiyong Park  * The only thing to do in BL2 is to load further images and pass control to
75*54fd6939SJiyong Park  * next BL. The memory occupied by BL2 will be reclaimed by BL3x stages. BL2
76*54fd6939SJiyong Park  * runs entirely in S-EL1.
77*54fd6939SJiyong Park  ******************************************************************************/
bl2_main(void)78*54fd6939SJiyong Park void bl2_main(void)
79*54fd6939SJiyong Park {
80*54fd6939SJiyong Park 	entry_point_info_t *next_bl_ep_info;
81*54fd6939SJiyong Park 
82*54fd6939SJiyong Park 	NOTICE("BL2: %s\n", version_string);
83*54fd6939SJiyong Park 	NOTICE("BL2: %s\n", build_message);
84*54fd6939SJiyong Park 
85*54fd6939SJiyong Park 	/* Perform remaining generic architectural setup in S-EL1 */
86*54fd6939SJiyong Park 	bl2_arch_setup();
87*54fd6939SJiyong Park 
88*54fd6939SJiyong Park #if PSA_FWU_SUPPORT
89*54fd6939SJiyong Park 	fwu_init();
90*54fd6939SJiyong Park #endif /* PSA_FWU_SUPPORT */
91*54fd6939SJiyong Park 
92*54fd6939SJiyong Park #if TRUSTED_BOARD_BOOT
93*54fd6939SJiyong Park 	/* Initialize authentication module */
94*54fd6939SJiyong Park 	auth_mod_init();
95*54fd6939SJiyong Park #endif /* TRUSTED_BOARD_BOOT */
96*54fd6939SJiyong Park 
97*54fd6939SJiyong Park 	/* Initialize the Measured Boot backend */
98*54fd6939SJiyong Park 	bl2_plat_mboot_init();
99*54fd6939SJiyong Park 
100*54fd6939SJiyong Park 	/* Initialize boot source */
101*54fd6939SJiyong Park 	bl2_plat_preload_setup();
102*54fd6939SJiyong Park 
103*54fd6939SJiyong Park 	/* Load the subsequent bootloader images. */
104*54fd6939SJiyong Park 	next_bl_ep_info = bl2_load_images();
105*54fd6939SJiyong Park 
106*54fd6939SJiyong Park 	/* Teardown the Measured Boot backend */
107*54fd6939SJiyong Park 	bl2_plat_mboot_finish();
108*54fd6939SJiyong Park 
109*54fd6939SJiyong Park #if !BL2_AT_EL3 && !ENABLE_RME
110*54fd6939SJiyong Park #ifndef __aarch64__
111*54fd6939SJiyong Park 	/*
112*54fd6939SJiyong Park 	 * For AArch32 state BL1 and BL2 share the MMU setup.
113*54fd6939SJiyong Park 	 * Given that BL2 does not map BL1 regions, MMU needs
114*54fd6939SJiyong Park 	 * to be disabled in order to go back to BL1.
115*54fd6939SJiyong Park 	 */
116*54fd6939SJiyong Park 	disable_mmu_icache_secure();
117*54fd6939SJiyong Park #endif /* !__aarch64__ */
118*54fd6939SJiyong Park 
119*54fd6939SJiyong Park 	console_flush();
120*54fd6939SJiyong Park 
121*54fd6939SJiyong Park #if ENABLE_PAUTH
122*54fd6939SJiyong Park 	/*
123*54fd6939SJiyong Park 	 * Disable pointer authentication before running next boot image
124*54fd6939SJiyong Park 	 */
125*54fd6939SJiyong Park 	pauth_disable_el1();
126*54fd6939SJiyong Park #endif /* ENABLE_PAUTH */
127*54fd6939SJiyong Park 
128*54fd6939SJiyong Park 	/*
129*54fd6939SJiyong Park 	 * Run next BL image via an SMC to BL1. Information on how to pass
130*54fd6939SJiyong Park 	 * control to the BL32 (if present) and BL33 software images will
131*54fd6939SJiyong Park 	 * be passed to next BL image as an argument.
132*54fd6939SJiyong Park 	 */
133*54fd6939SJiyong Park 	smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
134*54fd6939SJiyong Park #else /* if BL2_AT_EL3 || ENABLE_RME */
135*54fd6939SJiyong Park 	NOTICE("BL2: Booting " NEXT_IMAGE "\n");
136*54fd6939SJiyong Park 	print_entry_point_info(next_bl_ep_info);
137*54fd6939SJiyong Park 	console_flush();
138*54fd6939SJiyong Park 
139*54fd6939SJiyong Park #if ENABLE_PAUTH
140*54fd6939SJiyong Park 	/*
141*54fd6939SJiyong Park 	 * Disable pointer authentication before running next boot image
142*54fd6939SJiyong Park 	 */
143*54fd6939SJiyong Park 	pauth_disable_el3();
144*54fd6939SJiyong Park #endif /* ENABLE_PAUTH */
145*54fd6939SJiyong Park 
146*54fd6939SJiyong Park 	bl2_run_next_image(next_bl_ep_info);
147*54fd6939SJiyong Park #endif /* BL2_AT_EL3 && ENABLE_RME */
148*54fd6939SJiyong Park }
149