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