bl2_el3_entrypoint.S 2.26 KB
Newer Older
Roberto Vargas's avatar
Roberto Vargas committed
1
/*
Yann Gautier's avatar
Yann Gautier committed
2
 * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
Roberto Vargas's avatar
Roberto Vargas committed
3
4
5
6
7
8
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <asm_macros.S>
9
#include <common/bl_common.h>
Roberto Vargas's avatar
Roberto Vargas committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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                               \
Yann Gautier's avatar
Yann Gautier committed
29
30
                _exception_vectors=bl2_vector_table		\
		_pie_fixup_size=0
Roberto Vargas's avatar
Roberto Vargas committed
31
32
33
34
35
36
37
38
39

	/*
	 * Restore parameters of boot rom
	 */
	mov	r0, r9
	mov	r1, r10
	mov	r2, r11
	mov	r3, r12

40
41
42
43
44
	/* ---------------------------------------------
	 * Perform BL2 setup
	 * ---------------------------------------------
	 */
	bl	bl2_el3_setup
Roberto Vargas's avatar
Roberto Vargas committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

	/* ---------------------------------------------
	 * 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)]
82
	msr	spsr_xc, r1
Roberto Vargas's avatar
Roberto Vargas committed
83

84
85
86
87
88
	/* Some BL32 stages expect lr_svc to provide the BL33 entry address */
	cps	#MODE32_svc
	ldr	lr, [r8, #ENTRY_POINT_INFO_LR_SVC_OFFSET]
	cps	#MODE32_mon

Roberto Vargas's avatar
Roberto Vargas committed
89
90
	add	r8, r8, #ENTRY_POINT_INFO_ARGS_OFFSET
	ldm	r8, {r0, r1, r2, r3}
91
	exception_return
Roberto Vargas's avatar
Roberto Vargas committed
92
endfunc bl2_run_next_image