forked from Hongqin-Li/rpi-os
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathentry.S
105 lines (85 loc) · 2.17 KB
/
entry.S
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "mmu.h"
#include "memlayout.h"
#include "sysregs.h"
.section ".text.boot"
.global _start
_start:
/*
* Wake up other processors.
* See https://github.com/raspberrypi/tools/blob/master/armstubs/armstub8.S
* which has been incorporated in start.elf (or bootcode.bin ?)
*/
adr x0, mp_start
mov x1, #1
mov x2, #2
mov x3, #3
mov x9, 0xd8
str x0, [x9, x1, lsl #3]
str x0, [x9, x2, lsl #3]
str x0, [x9, x3, lsl #3]
dsb sy
isb
sev
mp_start:
/* Get current exception level by CurrentEL[3:2]. */
mrs x9, CurrentEL
and x9, x9, #0xc
cmp x9, #8
beq el2
bgt el3
el3:
mov x9, #SCR_VALUE
msr scr_el3, x9
mov x9, #SPSR_EL3_VALUE
msr spsr_el3, x9
adr x9, el2
msr elr_el3, x9
eret
el2:
/*
* HCR_EL2.RW, bit[31] = 1: The Execution state for EL1 is AArch64.
* The Execution state for EL0 is determined by the current
* value of PSTATE.nRW when executing at EL0.
*/
mov x9, #HCR_VALUE
msr hcr_el2, x9
/* Setup SCTLR access. */
ldr x9, =SCTLR_VALUE_MMU_DISABLED
msr sctlr_el1, x9
/* Enable SIMD instructions. */
ldr x9, =CPACR_VALUE
msr cpacr_el1, x9
/* Change execution level to EL1. */
mov x9, #SPSR_EL2_VALUE
msr spsr_el2, x9
adr x9, el1
msr elr_el2, x9
eret
el1:
adr x9, kpgdir
/* Higher and lower half map to same physical memory region. */
msr ttbr0_el1, x9
msr ttbr1_el1, x9
ldr x9, =TCR_VALUE
msr tcr_el1, x9
ldr x9, =MAIR_VALUE
msr mair_el1, x9
isb
/* Enable MMU. */
mrs x9, sctlr_el1
orr x9, x9, #SCTLR_MMU_ENABLED
msr sctlr_el1, x9
isb
/* Read CPU ID. */
mrs x0, mpidr_el1
and x0, x0, #3
/* sp = _start - cpuid() * PGSIZE; */
mov x10, #KSTACKSIZE
mul x10, x10, x0
ldr x9, =_start
sub x9, x9, x10
/* Set up stack pointer, must always be 16 bytes aligned. */
msr spsel, #1
mov sp, x9
ldr x9, =main
br x9