1 #include <lunaix/boot_generic.h>
3 #include <asm/aa64_spsr.h>
12 EE=0, E0E=0 // all little endian
13 WXN=1 // write implie exec never
14 SA0=1, SA=1 // alignment check on SP
15 A=1 // alignment check on memref
16 NMI=1 // mask interrupt
20 unsigned long sctrl = 0;
23 sctrl |= SCTRL_WXN | SCTRL_nAA;
24 sctrl |= SCTRL_SA | SCTRL_SA0;
25 sctrl |= SCTRL_A | SCTRL_M;
27 set_sysreg(TCR_EL1, sctrl);
31 extern void aa64_vbase();
36 set_sysreg(VBAR_EL1, __ptr(aa64_vbase));
45 SH0=3 // Inner sharable
46 ORGN0=0 // Normal memory, Outer Non-cacheable.
47 IRGN0=1 // Normal memory, Inner Write-Back Read-Allocate Write-Allocate Cacheable.
48 A1=0 // TTBR0 define ASID
52 T0SZ=16 // disable TTBR1, Use TTBR0 for all translation
53 TG0=0 // VA48, 256T, 4K Granule
55 TBI0=0 // Ignore top bits
58 HD=1 // Hardware managed dirty and access
61 We may use the follow practice later
62 TTBR0: Translation for user-land (lowmem)
63 TTBR1: Translation for kernel-land (highmem)
66 unsigned long tcr = 0;
69 tcr |= TCR_T1SZ(0) | TCR_T0SZ(16);
70 tcr |= TCR_TG0(TCR_G4K);
71 tcr |= TCR_AS | TCR_HA | TCR_HD;
76 set_sysreg(TTBR0_EL1, ttb);
77 set_sysreg(TCR_EL1, tcr);
81 extract_dtb_bootinfo(ptr_t dtb, struct boot_handoff* handoff)
83 handoff->kexec.dtb_pa = dtb;
85 // TODO extract /memory, /reserved-memories from dtb
95 pfr = read_sysreg(ID_AA64PFR0_EL1);
96 el = read_sysreg(CurrentEL) >> 2;
98 // Arm A-Profile: D19.2.69, check for GIC sysreg avaliability
100 if (!BITS_GET(pfr, BITFIELD(27, 24))) {
104 has_el2 = !!BITS_GET(pfr, BITFIELD(11, 8));
106 // GIC spec (v3,v4): 12.1.7, table 12-2
107 // GIC spec (v3,v4): ICC_SRE_ELx accessing
108 // Arm A-Profile: R_PCDTX, PSTATE.EL reset value
111 sysreg_flagging(ICC_SRE_EL3, ICC_SRE_SRE, 0);
116 sysreg_flagging(ICC_SRE_EL2, ICC_SRE_SRE, 0);
119 sysreg_flagging(ICC_SRE_EL1, ICC_SRE_SRE, 0);
123 aarch64_pre_el1_init()
129 aarch64_prepare_el1_transfer()
134 el = read_sysreg(CurrentEL) >> 2;
140 spsr = SPSR_AllInt | SPSR_I | SPSR_F | SPSR_SP;
141 spsr = BITS_SET(spsr, SPSR_EL, 1);
144 set_sysreg(SPSR_EL2, spsr);
147 set_sysreg(SPSR_EL3, spsr);
154 aarch64_init(ptr_t dtb)
160 struct boot_handoff* handoff;
162 handoff = bootmem_alloc(sizeof(*handoff));
164 extract_dtb_bootinfo(dtb, handoff);