2 * Broadcom bcm2835 SoC, as used in Raspberry Pi
3 * arm1176jzf-s processor (armv6)
8 TEXT _start(SB), 1, $-4
10 * load physical base for SB addressing while mmu is off
11 * keep a handy zero in R0 until first function call
19 * SVC mode, interrupts disabled
21 MOVW $(PsrDirq|PsrDfiq|PsrMsvc), R1
25 * disable the mmu and L1 caches
26 * invalidate caches and tlb
28 MRC CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
29 BIC $(CpCdcache|CpCicache|CpCpredict|CpCmmu), R1
30 MCR CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
31 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvu), CpCACHEall
32 MCR CpSC, 0, R0, C(CpTLB), C(CpTLBinvu), CpTLBinv
36 * clear mach and page tables
38 MOVW $PADDR(MACHADDR), R1
39 MOVW $PADDR(KTZERO), R2
47 * start stack at top of mach (physical addr)
48 * set up page tables for kernel
50 MOVW $PADDR(MACHADDR+MACHSIZE-4), R13
54 * set up domain access control and page table base
57 MCR CpSC, 0, R1, C(CpDAC), C(0)
59 MCR CpSC, 0, R1, C(CpTTB), C(0)
62 * enable caches, mmu, and high vectors
64 MRC CpSC, 0, R0, C(CpCONTROL), C(0), CpMainctl
65 ORR $(CpChv|CpCdcache|CpCicache|CpCmmu), R0
66 MCR CpSC, 0, R0, C(CpCONTROL), C(0), CpMainctl
70 * switch SB, SP, and PC into KZERO space
73 MOVW $(MACHADDR+MACHSIZE-4), R13
74 MOVW $_startpg(SB), R15
76 TEXT _startpg(SB), 1, $-4
79 * enable cycle counter
82 MCR CpSC, 0, R1, C(CpSPM), C(CpSPMperf), CpSPMctl
85 * call main and loop forever if it returns
90 BL _div(SB) /* hack to load _div, etc. */
92 TEXT fsrget(SB), 1, $-4 /* data fault status */
93 MRC CpSC, 0, R0, C(CpFSR), C(0), CpFSRdata
96 TEXT ifsrget(SB), 1, $-4 /* instruction fault status */
97 MRC CpSC, 0, R0, C(CpFSR), C(0), CpFSRinst
100 TEXT farget(SB), 1, $-4 /* fault address */
101 MRC CpSC, 0, R0, C(CpFAR), C(0x0)
104 TEXT lcycles(SB), 1, $-4
105 MRC CpSC, 0, R0, C(CpSPM), C(CpSPMperf), CpSPMcyc
108 TEXT splhi(SB), 1, $-4
109 MOVW $(MACHADDR+4), R2 /* save caller pc in Mach */
112 MOVW CPSR, R0 /* turn off irqs (but not fiqs) */
113 ORR $(PsrDirq), R0, R1
117 TEXT splfhi(SB), 1, $-4
118 MOVW $(MACHADDR+4), R2 /* save caller pc in Mach */
121 MOVW CPSR, R0 /* turn off irqs and fiqs */
122 ORR $(PsrDirq|PsrDfiq), R0, R1
126 TEXT splflo(SB), 1, $-4
127 MOVW CPSR, R0 /* turn on fiqs */
128 BIC $(PsrDfiq), R0, R1
132 TEXT spllo(SB), 1, $-4
133 MOVW CPSR, R0 /* turn on irqs and fiqs */
134 BIC $(PsrDirq|PsrDfiq), R0, R1
138 TEXT splx(SB), 1, $-4
139 MOVW $(MACHADDR+0x04), R2 /* save caller pc in Mach */
142 MOVW R0, R1 /* reset interrupt level */
147 TEXT spldone(SB), 1, $0 /* end marker for devkprof.c */
150 TEXT islo(SB), 1, $-4
160 SWPW R0,(R1) /* fix: deprecated in armv6 */
163 TEXT setlabel(SB), 1, $-4
164 MOVW R13, 0(R0) /* sp */
165 MOVW R14, 4(R0) /* pc */
169 TEXT gotolabel(SB), 1, $-4
170 MOVW 0(R0), R13 /* sp */
171 MOVW 4(R0), R14 /* pc */
175 TEXT getcallerpc(SB), 1, $-4
179 TEXT idlehands(SB), $-4
182 BIC $(PsrDirq|PsrDfiq), R3, R1 /* spllo */
185 MOVW $0, R0 /* wait for interrupt */
186 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEintr), CpCACHEwait
189 MOVW R3, CPSR /* splx */
193 TEXT coherence(SB), $-4
200 TEXT mmuinvalidate(SB), 1, $-4
202 MCR CpSC, 0, R0, C(CpTLB), C(CpTLBinvu), CpTLBinv
207 * mmuinvalidateaddr(va)
208 * invalidate tlb entry for virtual page address va, ASID 0
210 TEXT mmuinvalidateaddr(SB), 1, $-4
211 MCR CpSC, 0, R0, C(CpTLB), C(CpTLBinvu), CpTLBinvse
217 * writeback and invalidate data cache
219 TEXT cachedwbinv(SB), 1, $-4
222 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEwbi), CpCACHEall
226 * cachedwbinvse(va, n)
228 * writeback and invalidate data cache range [va, va+n)
230 TEXT cachedwbinvse(SB), 1, $-4
231 MOVW R0, R1 /* DSB clears R0 */
236 BIC $(CACHELINESZ-1), R1
237 BIC $(CACHELINESZ-1), R2
238 MCRR(CpSC, 0, 2, 1, CpCACHERANGEdwbi)
244 * writeback data cache range [va, va+n)
246 TEXT cachedwbse(SB), 1, $-4
247 MOVW R0, R1 /* DSB clears R0 */
251 BIC $(CACHELINESZ-1), R1
252 BIC $(CACHELINESZ-1), R2
253 MCRR(CpSC, 0, 2, 1, CpCACHERANGEdwb)
257 * drain write buffer and prefetch buffer
258 * writeback and invalidate data cache
259 * invalidate instruction cache
261 TEXT cacheuwbinv(SB), 1, $-4
264 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEwbi), CpCACHEall
265 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEall
269 * invalidate instruction cache
271 TEXT cacheiinv(SB), 1, $-4
273 MCR CpSC, 0, R0, C(CpCACHE), C(CpCACHEinvi), CpCACHEall