aboutsummaryrefslogtreecommitdiff
path: root/el3_payload/entrypoint.S
blob: 2da49363ccfcfe7712ddb52b89309c9bb16a8a97 (plain)
1
2
3
4
5
6
7
8
9
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
/*
 * Copyright (c) 2018, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "arch.h"
#include "asm_macros.S"
#include "platform.h"

#define EOT_ASCII_CODE		4

	.data
welcome_str:
	.asciz "Booting the EL3 test payload\r\n"
all_cpus_booted_str:
	.asciz "All CPUs booted!\r\n"

	.text
	.global entrypoint

func entrypoint
	bl	mark_cpu_presence

	/* Distinguish primary from secondary CPUs */
	mrs	x0, mpidr_el1
	ldr	x1, =MPIDR_AFFINITY_MASK
	and	x0, x0, x1

	ldr	x1, =PRIMARY_CPU_MPID
	cmp	x0, x1
	b.ne	spin_forever

	/*
	 * Only the primary CPU executes the code below
	 */

	adr	x0, welcome_str
	bl	print_string

	/* Wait to see each CPU */
	mov	x3, xzr
1:
	mov	x0, x3
	bl	is_cpu_present
	cbz	x0, 1b

	/* Next CPU, if any */
	add	x3, x3, #1
	mov	x0, #CPUS_COUNT
	cmp	x3, x0
	b.lt	1b

	/* All CPUs have been detected, announce the good news! */
	adr	x0, all_cpus_booted_str
	bl	print_string

	/* Send EOT (End of Transmission character) character over the UART */
	mov	x0, #EOT_ASCII_CODE
	bl	print_char

spin_forever:
	wfe
	b	spin_forever
endfunc entrypoint