xref: /aosp_15_r20/external/coreboot/src/arch/arm64/boot.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <cbmem.h>
4 #include <arch/lib_helpers.h>
5 #include <arch/stages.h>
6 #include <arch/transition.h>
7 #include <bl31.h>
8 #include <program_loading.h>
9 
run_payload(struct prog * prog)10 static void run_payload(struct prog *prog)
11 {
12 	void (*doit)(void *);
13 	void *arg;
14 
15 	doit = prog_entry(prog);
16 	arg = prog_entry_arg(prog);
17 	u64 payload_spsr = get_eret_el(EL2, SPSR_USE_L);
18 
19 	if (CONFIG(ARM64_USE_ARM_TRUSTED_FIRMWARE))
20 		run_bl31((u64)doit, (u64)arg, payload_spsr);
21 	else if (CONFIG_ARM64_CURRENT_EL == EL3)
22 		transition_to_el2(doit, arg, payload_spsr);
23 	else
24 		doit(arg);
25 }
26 
arch_prog_run(struct prog * prog)27 void arch_prog_run(struct prog *prog)
28 {
29 	void (*doit)(void *);
30 
31 	if (ENV_RAMSTAGE && prog_type(prog) == PROG_PAYLOAD) {
32 		run_payload(prog);
33 		return;
34 	}
35 
36 	doit = prog_entry(prog);
37 
38 	doit(prog_entry_arg(prog));
39 }
40 
41 /* Generic stage entry point. Can be overridden by board/SoC if needed. */
stage_entry(uintptr_t stage_arg)42 __weak void stage_entry(uintptr_t stage_arg)
43 {
44 	if (!ENV_ROMSTAGE_OR_BEFORE)
45 		_cbmem_top_ptr = stage_arg;
46 
47 	main();
48 }
49