bl2_el3_entrypoint.S 2.13 KB
Newer Older
Roberto Vargas's avatar
Roberto Vargas committed
1
2
3
4
5
6
7
8
/*
 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
 *
 * 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
#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

80
81
82
83
84
	/* 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
85
86
87
88
	add	r8, r8, #ENTRY_POINT_INFO_ARGS_OFFSET
	ldm	r8, {r0, r1, r2, r3}
	eret
endfunc bl2_run_next_image