]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/zynq/l.s
bootrc: allow kbmap to be set via plan9.ini (thanks Aaron Bieber)
[plan9front.git] / sys / src / 9 / zynq / l.s
1 #include "mem.h"
2 #include "io.h"
3
4 #define PUTC(c) MOVW $(c), R0; MOVW R0, (R8)
5
6 TEXT _start(SB), $-4
7         MOVW $(KTZERO-KZERO), R13
8         MOVW $0xE0001030, R8
9
10         PUTC('P')
11         MOVW $0, R0
12         MOVW R0, R1
13         MOVW $(CONFADDR-KZERO), R2
14 _start0:
15         MOVW.P R0, 4(R1)
16         CMP.S R1, R2
17         BNE _start0
18
19         PUTC('l')
20         MOVW $SECSZ, R0
21         MOVW $(MACHL1(0)-KZERO), R4
22         MOVW $KZERO, R1
23         ADD R1>>(SECSH-2), R4, R1
24         MOVW $(L1SEC|L1CACHED|L1KERRW), R2
25         MOVW $(-KZERO), R3
26 _start1:
27         MOVW.P R2, 4(R1)
28         ADD R0, R2
29         CMP.S R2, R3
30         BGE _start1
31
32         PUTC('a')
33         MOVW $L2SZ, R0
34         MOVW $VMAP, R1
35         ADD R1>>(SECSH-2), R4, R1
36         MOVW $((VMAPL2-KZERO)|L1PT), R2
37         MOVW $(VMAPL2-KZERO+VMAPL2SZ), R3
38 _start2:
39         MOVW.P R2, 4(R1)
40         ADD R0, R2
41         CMP.S R2, R3
42         BGE _start2
43
44         MOVW $(UART_BASE|L2VALID|L2DEVICE|L2NOEXEC|L2KERRW), R0
45         MOVW $(VMAPL2-KZERO), R1
46         MOVW R0, (R1)
47
48         PUTC('n')
49
50         MOVW $(MACH(0)-KZERO), R(Rmach)
51 _start3:
52         /* enable MMU permission checking */
53         MOVW $0x55555555, R0
54         MCR 15, 0, R0, C(3), C(0), 0
55
56         MOVW $0, R0
57         MCR 15, 0, R0, C(8), C(7), 0
58         DSB
59         ORR $TTBATTR, R4, R1
60         MCR 15, 0, R1, C(2), C(0), 0
61         MOVW $0x20c5047b, R1
62         MOVW $_virt(SB), R2
63         PUTC(' ')
64         MCR 15, 0, R1, C(1), C(0), 0
65         MOVW R2, R15
66
67 TEXT _virt(SB), $-4
68         DSB
69         ISB
70
71         ADD $KZERO, R(Rmach)
72         MOVW R(Rmach), R13
73         ADD $MACHSIZE, R13
74
75         MOVW R(Rmach), R0
76         ADD $12, R0
77         BL loadsp(SB)
78
79         MOVW $vectors(SB), R1
80         MCR 15, 0, R1, C(12), C(0)
81         
82         /* enable maths coprocessors in CPACR but disable them in FPEXC */
83         MRC 15, 0, R0, C(1), C(0), 2
84         ORR $(15<<20), R0
85         MCR 15, 0, R0, C(1), C(0), 2
86
87         VMRS(0xe, FPEXC, 0)
88         BIC $(3<<30), R0
89         VMSR(0xe, 0, FPEXC)
90         
91         /* enable L1 cache */
92         MOVW $0, R0
93         MCR 15, 0, R0, C(7), C(5), 0
94         MCR 15, 0, R0, C(7), C(5), 6
95         BL l1dclear(SB)
96         MRC 15, 0, R0, C(1), C(0), 1
97         ORR $(1|2|1<<6), R0
98         MCR 15, 0, R0, C(1), C(0), 1
99         MRC 15, 0, R0, C(1), C(0), 0
100         ORR $(3<<11|1<<2), R0
101         MCR 15, 0, R0, C(1), C(0), 0
102         DSB
103         ISB
104
105         MOVW $(VMAP+0x30), R8
106         PUTC('9')
107         
108         /* kernel Mach* in TPIDRPRW */
109         MCR 15, 0, R(Rmach), C(13), C(0), 4
110
111         MOVW $setR12(SB), R12
112         MOVW $0, R(Rup)
113
114         BL main(SB)
115         B idlehands(SB)
116
117         BL _div(SB) /* hack to load _div */
118
119 TEXT mpbootstrap(SB), $-4
120         MOVW $0xE0001030, R8
121         PUTC('M')
122         PUTC('P')
123         MOVW $(MACH(1)-KZERO), R(Rmach)
124         MOVW $(MACHL1(1)-KZERO), R4
125         B _start3
126
127 TEXT touser(SB), $-4
128         CPS(CPSID)
129
130         SUB $12, R13
131         MOVW R0, (R13)
132         MOVW $0, R1
133         MOVW R1, 4(R13)
134         MOVW $(UTZERO+0x20), R1
135         MOVW R1, 8(R13)
136
137         MOVW CPSR, R1
138         BIC $(PsrMask|PsrDirq|PsrDfiq), R1
139         ORR $PsrMusr, R1
140         MOVW R1, SPSR
141
142         MOVW $(KTZERO-(15*4)), R0
143         MOVM.IA (R0), [R0-R12]
144
145         MOVM.IA.S (R13), [R13-R14]
146         ADD $8, R13
147         MOVM.IA.W.S (R13), [R15]
148
149 TEXT forkret(SB), $-4
150         MOVW (16*4)(R13), R0
151         MOVW R0, SPSR
152         MOVM.IA.W (R13), [R0-R12]
153         MOVM.IA.S (R13), [R13-R14]
154         ADD $16, R13
155         DSB
156         ISB
157         MOVM.IA.W.S (R13), [R15]
158
159 TEXT nope(SB), $-4 // NOPE
160         MOVW $(VMAP+0x30), R8
161         PUTC(13)
162         PUTC(10)
163         MOVW R14, R7
164         BL puthex(SB)
165         PUTC(' ')
166         PUTC('N')
167         PUTC('O')
168         PUTC('P')
169         PUTC('E')
170 _nope:  B _nope
171
172 TEXT loadsp(SB), $0
173         CPS(CPSMODE | PsrMabt)
174         MOVW R0, R13
175         CPS(CPSMODE | PsrMund)
176         MOVW R0, R13
177         CPS(CPSMODE | PsrMirq)
178         MOVW R0, R13
179         CPS(CPSMODE | PsrMfiq)
180         MOVW R0, R13
181         CPS(CPSMODE | PsrMsvc)
182         RET
183
184 TEXT cputhex(SB), $0
185         MOVW R0, R7
186         MOVW $(VMAP+0x30), R8
187 TEXT puthex(SB), $0
188 _p0:
189         MOVW -4(R8), R6
190         AND.S $(1<<3), R6
191         BEQ _p0
192 #define DIG MOVW R7>>28, R6; AND $15, R6; ADD $'0', R6; CMP $'9', R6; ADD.GT $7, R6; MOVW R6, (R8); MOVW R7<<4, R7
193         DIG; DIG; DIG; DIG
194         DIG; DIG; DIG; DIG
195         MOVW $13, R6
196         MOVW R6, (R8)
197         MOVW $10, R6
198         MOVW R6, (R8)
199         RET
200
201 TEXT spllo(SB), $-4
202         MOVW CPSR, R0
203         CPS(CPSIE)
204         RET
205
206 TEXT splhi(SB), $-4
207         MOVW R14, 4(R(Rmach))
208         MOVW CPSR, R0
209         CPS(CPSID)
210         RET
211
212 TEXT splx(SB), $-4
213         MOVW R14, 4(R(Rmach))
214         MOVW R0, R1
215         MOVW CPSR, R0
216         MOVW R1, CPSR
217         RET
218         
219 TEXT spldone(SB), $-4
220         RET
221
222 TEXT islo(SB), $0
223         MOVW CPSR, R0
224         AND $(PsrDirq), R0
225         EOR $(PsrDirq), R0
226         RET
227
228 TEXT setlabel(SB), $-4
229         MOVW R13, 0(R0)
230         MOVW R14, 4(R0)
231         MOVW $0, R0
232         RET
233
234 TEXT gotolabel(SB), $-4
235         MOVW 0(R0), R13
236         MOVW 4(R0), R14
237         MOVW $1, R0
238         RET
239
240 TEXT cas(SB), $0
241 TEXT cmpswap(SB), $0
242         MOVW    ov+4(FP), R1
243         MOVW    nv+8(FP), R2
244 spincas:
245         LDREX   (R0), R3
246         CMP.S   R3, R1
247         BNE     fail
248         STREX   R2, (R0), R4
249         CMP.S   $0, R4
250         BNE     spincas
251         MOVW    $1, R0
252         DMB
253         RET
254 fail:
255         CLREX
256         MOVW    $0, R0
257         RET
258
259 TEXT tas(SB), $0
260 TEXT _tas(SB), $0
261         MOVW $0xDEADDEAD, R2
262 _tas1:
263         LDREX (R0), R1
264         STREX R2, (R0), R3
265         CMP.S $0, R3
266         BNE _tas1
267         MOVW R1, R0
268         DMB
269         RET
270
271 TEXT coherence(SB), $0
272         DSB
273         RET
274
275 TEXT idlehands(SB), $0
276         DSB
277         WFE
278         RET
279
280 TEXT sendevent(SB), $0
281         SEV
282         RET
283
284 TEXT ttbget(SB), $0
285         MRC 15, 0, R0, C(2), C(0), 0
286         BIC $0x7f, R0
287         RET
288         
289 TEXT ttbput(SB), $0
290         ORR $TTBATTR, R0
291         MCR 15, 0, R0, C(2), C(0), 0
292         RET
293
294 TEXT flushpg(SB), $0
295         MCR 15, 0, R0, C(8), C(7), 3
296         DSB
297         RET
298
299 TEXT flushtlb(SB), $0
300         MCR 15, 0, R0, C(8), C(3), 0
301         DSB
302         RET
303
304 TEXT setasid(SB), $0
305         DSB     /* errata */
306         MCR 15, 0, R0, C(13), C(0), 1
307         RET
308
309 TEXT getifar(SB), $0
310         MRC 15, 0, R0, C(6), C(0), 2
311         RET
312
313 TEXT getdfar(SB), $0
314         MRC 15, 0, R0, C(6), C(0), 0
315         RET
316
317 TEXT getifsr(SB), $0
318         MRC 15, 0, R0, C(5), C(0), 1
319         RET
320
321 TEXT getdfsr(SB), $0
322         MRC 15, 0, R0, C(5), C(0), 0
323         RET
324
325 TEXT setpmcr(SB), $0
326         MCR 15, 0, R0, C(9), C(12), 0
327         RET
328
329 TEXT setpmcnten(SB), $0
330         MCR 15, 0, R0, C(9), C(12), 1
331         RET
332
333 TEXT perfticks(SB), $0
334         MRC 15, 0, R0, C(9), C(13), 0
335         RET
336
337 TEXT cycles(SB), $0
338         MRC 15, 0, R1, C(9), C(13), 0
339         MOVW R1, (R0)
340         MOVW 24(R(Rmach)), R1
341         MRC 15, 0, R2, C(9), C(12), 3
342         AND.S $(1<<31), R2
343         BEQ _cycles0
344         MCR 15, 0, R2, C(9), C(12), 3
345         ADD $1, R1
346         MOVW R1, 24(R(Rmach))
347 _cycles0:
348         MOVW R1, 4(R0)
349         RET
350
351 TEXT fpinit(SB), $0
352         MOVW $(1<<30), R0
353         VMSR(0xe, 0, FPEXC)
354         MOVW $0, R0
355         VMSR(0xe, 0, FPSCR)
356         RET
357
358 TEXT fprestore(SB), $0
359         MOVM.IA.W (R0), [R1-R2]
360         VMSR(0xe, 1, FPEXC)
361         VMSR(0xe, 2, FPSCR)
362         WORD $0xecb00b20
363         WORD $0xecf00b20
364         RET
365
366 TEXT fpsave(SB), $0
367         VMRS(0xe, FPEXC, 1)
368         VMRS(0xe, FPSCR, 2)
369         MOVM.IA.W [R1-R2], (R0)
370         WORD $0xeca00b20
371         WORD $0xece00b20
372         /* wet floor */
373
374 TEXT fpoff(SB), $0
375 TEXT fpclear(SB), $0
376         MOVW $0, R1
377         VMSR(0xe, 1, FPEXC)
378         RET
379
380 #define Rnoway R1
381 #define Rwayinc R2
382 #define Rmaxway R3
383 #define Rsetinc R4
384 #define Rmaxset R5
385
386 TEXT l1dclear(SB), $0
387         MOVW $0, R0
388         MCR 15, 2, R0, C(0), C(0), 0
389         MRC 15, 1, R9, C(0), C(0), 0
390         AND $7, R9, R8
391         ADD $4, R8
392         MOVW $1, Rsetinc
393         MOVW Rsetinc<<R8, Rsetinc
394
395         MOVW R9>>13, Rmaxset
396         AND $0x7fff, Rmaxset
397         MOVW Rmaxset<<R8, Rmaxset
398         
399         MOVW R9>>3, R0
400         AND $0x3ff, R0
401         MOVW $(1<<31), Rwayinc
402         MOVW $(1<<31), Rnoway
403         MOVW R0, Rmaxway
404         ADD $1, R0
405 _l1dclear0:
406         MOVW.S R0>>1, R0
407         BEQ _l1dclear1
408         MOVW Rwayinc>>1, Rwayinc
409         MOVW Rnoway->1, Rnoway
410         MOVW Rmaxway@>1, Rmaxway
411         B _l1dclear0
412 _l1dclear1:
413         MOVW Rwayinc<<1, Rwayinc
414         MVN Rnoway<<1, Rnoway
415         BIC Rnoway, Rmaxway
416
417         MOVW $0, R0
418 _l1dclear2:
419         MCR 15, 0, R0, C(7), C(14), 2
420         ADD Rwayinc, R0
421         CMP.S Rmaxway, R0
422         BLT _l1dclear2
423         AND Rnoway, R0
424         ADD Rsetinc, R0
425         CMP.S Rmaxset, R0
426         BLT _l1dclear2
427         RET
428
429 TEXT invalise(SB), $0
430         MOVW 4(FP), R1
431         ADD $(LINSIZ - 1), R1
432         BIC $(LINSIZ - 1), R0
433         BIC $(LINSIZ - 1), R1
434 _invalise0:
435         MCR 15, 0, R0, C(7), C(5), 1
436         ADD $LINSIZ, R0
437         CMP.S R1, R0
438         BLT _invalise0  
439         RET
440
441 TEXT cleandse(SB), $0
442         DSB
443         MOVW 4(FP), R1
444         ADD $(LINSIZ - 1), R1
445         BIC $(LINSIZ - 1), R0
446         BIC $(LINSIZ - 1), R1
447 _cleandse0:
448         MCR 15, 0, R0, C(7), C(10), 1
449         ADD $LINSIZ, R0
450         CMP.S R1, R0
451         BLT _cleandse0
452         DSB
453         RET
454         
455 TEXT invaldse(SB), $0
456         MOVW 4(FP), R1
457         ADD $(LINSIZ - 1), R1
458         BIC $(LINSIZ - 1), R0
459         BIC $(LINSIZ - 1), R1
460 _invaldse0:
461         MCR 15, 0, R0, C(7), C(6), 1
462         ADD $LINSIZ, R0
463         CMP.S R1, R0
464         BLT _invaldse0
465         DSB
466         RET
467
468 TEXT clinvdse(SB), $0
469         DSB
470         MOVW 4(FP), R1
471         ADD $(LINSIZ - 1), R1
472         BIC $(LINSIZ - 1), R0
473         BIC $(LINSIZ - 1), R1
474 _clinvdse0:
475         MCR 15, 0, R0, C(7), C(14), 1
476         ADD $LINSIZ, R0
477         CMP.S R1, R0
478         BLT _clinvdse0
479         DSB
480         RET
481
482 TEXT cleandln(SB), $0
483         DSB
484         MCR 15, 0, R0, C(7), C(10), 1
485         DSB
486         RET
487
488 TEXT invaldln(SB), $0
489         MCR 15, 0, R0, C(7), C(6), 1
490         DSB
491         RET
492
493 TEXT clinvdln(SB), $0
494         DSB
495         MCR 15, 0, R0, C(7), C(14), 1
496         DSB
497         RET
498
499 TEXT palookur(SB), $0
500         MCR 15, 0, R0, C(7), C(8), 2
501         DSB
502         MRC 15, 0, R0, C(7), C(4), 0
503         RET
504