]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/omap4/l.s
improved on omap4 kernel, now runs rc!
[plan9front.git] / sys / src / 9 / omap4 / l.s
1 #include "arm.s"
2 #include "mem.h"
3
4 TEXT _start(SB), 1, $-4
5         MOVW    $setR12(SB), R12
6         ADD     $(PHYSDRAM - KZERO), R12
7         
8         MOVW    $(PsrDirq | PsrDfiq | PsrMsvc), CPSR
9         
10         MOVW    $0x48020014, R1
11 uartloop:
12         MOVW    (R1), R0
13         AND.S   $(1<<6), R0
14         B.EQ    uartloop
15         
16         EWAVE('\r')
17         EWAVE('\n')
18         
19         MRC     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
20         BIC     $(CpCmmu), R1
21         MCR     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
22
23         EWAVE('P')
24         
25         MOVW    $KZERO, R1
26         MOVW    $(PHYSDRAM|PTEDRAM), R2
27         MOVW    $256, R3
28         BL      _mapmbs(SB)
29         MOVW    $PHYSDRAM, R1
30         MOVW    $(PHYSDRAM|PTEDRAM), R2
31         MOVW    $256, R3
32         BL      _mapmbs(SB)
33         MOVW    $0x48000000, R1
34         MOVW    $(0x48000000| L1AP(Krw) | Section | PTEIO), R2
35         MOVW    $1, R3
36         BL      _mapmbs(SB)
37         
38         EWAVE('l')
39         
40         MOVW    $L1PT, R1
41         MCR     CpSC, 0, R1, C(CpTTB), C(0), CpTTB0
42         MCR     CpSC, 0, R1, C(CpTTB), C(0), CpTTB1
43
44         EWAVE('a')
45
46         MOVW    $Client, R1
47         MCR     CpSC, 0, R1, C(CpDAC), C(0)
48         MOVW    $0, R1
49         MCR     CpSC, 0, R1, C(CpPID), C(0x0)
50
51         EWAVE('n')
52
53         MRC     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
54         ORR     $(CpCmmu|CpChv|CpCsw), R1
55         MCR     CpSC, 0, R1, C(CpCONTROL), C(0), CpMainctl
56
57         EWAVE(' ')
58                 
59         BL      _jumphi(SB)
60         
61         EWAVE('9')
62         
63         MOVW    $setR12(SB), R12
64         MOVW    $KTZERO, R13
65         
66         EWAVE(' ')
67         
68         BL      main(SB)
69 a:
70         WFI
71         B a
72         BL      _div(SB) /* hack */
73
74 /* R1: virtual start, R2: physical start, R3: number of MB */
75 TEXT _mapmbs(SB), 1, $-4
76         MOVW    $L1PT, R11
77         ADD     R1>>18, R11, R1
78 mapmbsl:
79         MOVW.P  R2, 4(R1)       
80         ADD     $MiB, R2
81         SUB.S   $1, R3
82         B.NE    mapmbsl
83         MOVW    R14, PC
84
85 TEXT _jumphi(SB), 1, $-4
86         ADD     $(KZERO - PHYSDRAM), R14
87         MOVW    R14, PC
88
89 TEXT coherence(SB), 1, $-4
90         BARRIERS
91         RET
92
93 TEXT splhi(SB), 1, $-4
94         MOVW    CPSR, R0
95         CPSID
96         MOVW    $(MACHADDR + 4), R11
97         MOVW    R14, (R11)
98         RET
99
100 TEXT spllo(SB), 1, $-4
101         MOVW    CPSR, R0
102         CPSIE
103         RET
104
105 TEXT splx(SB), 1, $-4
106         MOVW    CPSR, R1
107         MOVW    R0, CPSR
108         MOVW    R1, R0
109         RET
110
111 TEXT islo(SB), 1, $-4
112         MOVW    CPSR, R0
113         AND     $PsrDirq, R0
114         EOR     $PsrDirq, R0
115         RET
116
117 TEXT tas(SB), $-4
118 spintas:
119         LDREX(0,1)
120         CMP.S   $0, R1
121         B.NE    tasnope
122         MOVW    $1, R3
123         STREX(0,3,2)
124         CMP.S   $0, R2
125         B.NE    spintas
126 tasnope:
127         CLREX
128         MOVW    R1, R0
129         RET
130
131 TEXT cmpswap(SB), $-4
132         MOVW    4(FP), R3
133         MOVW    8(FP), R4
134 casspin:
135         LDREX(0,1)
136         CMP.S   R3, R1
137         B.NE    casfail
138         STREX(0,1,2)
139         CMP.S   $0, R2
140         B.NE    casspin
141         MOVW    $1, R0
142         RET
143 casfail:
144         CLREX
145         MOVW    $0, R0
146         RET
147
148 TEXT ainc(SB), $-4
149 TEXT _xinc(SB), $-4
150 spinainc:
151         LDREX(0,1)
152         ADD     $1, R1
153         STREX(0,1,2)
154         CMP.S   $0, R2
155         B.NE    spinainc
156         MOVW    R1, R0
157         RET
158
159 TEXT adec(SB), $-4
160 TEXT _xdec(SB), $-4
161 spinadec:
162         LDREX(0,1)
163         SUB     $1, R1
164         STREX(0,1,2)
165         CMP.S   $0, R2
166         B.NE    spinadec
167         MOVW    R1, R0
168         RET
169
170 TEXT setlabel(SB), 1, $-4
171         MOVW    R13, 0(R0)
172         MOVW    R14, 4(R0)
173         MOVW    $0, R0
174         RET
175
176 TEXT gotolabel(SB), 1, $-4
177         MOVW    0(R0), R13
178         MOVW    4(R0), R14
179         MOVW    $1, R0
180         RET
181
182 TEXT idlehands(SB), 1, $-4
183         BARRIERS
184         WFI
185         RET
186
187 TEXT flushtlb(SB), $-4
188         BARRIERS
189         MCR     CpSC, 0, R1, C(8), C(7), 0
190         RET
191
192 #define TRAP(n,a)\
193         SUB     $n, R14;\
194         WORD    $0xf96d0513;\
195         WORD    $0xf10e0093;\
196         MOVW    R14, -8(R13);\
197         MOVW    $a, R14;\
198         MOVW    R14, -4(R13);\
199         B _trap(SB)
200
201 TEXT _reset(SB), 1, $-4
202         TRAP(4, 0)
203 TEXT _undefined(SB), 1, $-4
204         TRAP(4, 1)
205 TEXT _prefabort(SB), 1, $-4
206         TRAP(4, 3)
207 TEXT _dataabort(SB), 1, $-4
208         TRAP(8, 4)
209 TEXT _wtftrap(SB), 1, $-4
210         TRAP(4, 5)
211 TEXT _irq(SB), 1, $-4
212         TRAP(4, 6)
213 TEXT _fiq(SB), 1, $-4
214         TRAP(4, 7)
215
216 TEXT _trap(SB), 1, $-4
217         SUB     $64, R13
218         MOVM.IA [R0-R12], (R13)
219         MOVW    $setR12(SB), R12
220         MOVW    64(R13), R0
221         MOVW    68(R13), R1
222         MOVW    R0, 68(R13)
223         MOVW    R1, 64(R13)
224         ADD     $72, R13, R0
225         MOVW    R0, 52(R13)
226         MOVW    R13, R0
227         SUB     $8, R13
228         BL trap(SB)
229         MOVW    72(R13), R0
230         AND     $PsrMask, R0
231         CMP     $PsrMusr, R0
232         B.EQ    _forkret
233         ADD     $8, R13
234         MOVW    68(R13), R0
235         MOVW    R0, 60(R13)
236         MOVW    64(R13), R0
237         MOVW    R0, SPSR
238         MOVW    R13, R0
239         ADD     $72, R13
240         WORD    $0xE8D0FFFF
241
242 TEXT _syscall(SB), 1, $-4
243         WORD    $0xf96d0513
244         WORD    $0xf10e0093
245         SUB     $64, R13
246         MOVM.IA.S       [R0-R14], (R13)
247         MOVW    $setR12(SB), R12
248         MOVW    64(R13), R0
249         MOVW    68(R13), R1
250         MOVW    R0, 68(R13)
251         MOVW    R1, 64(R13)
252         MOVW    R13, R0
253         SUB     $8, R13
254         BL      syscall(SB)
255
256 TEXT forkret(SB), 1, $-4
257 _forkret:
258         ADD     $8, R13
259         MOVW    R13, R0
260         ADD     $72, R13
261
262 TEXT touser(SB), 1, $-4
263         ADD     $52, R0
264         MOVM.IA.S       (R0), [R13-R14]
265         SUB     $52, R0
266         MOVW    68(R0), R1
267         MOVW    R1, 52(R0)
268         MOVW    64(R0), R1
269         MOVW    R1, SPSR
270         WORD    $0xE8D09FFF
271
272 TEXT fillureguser(SB), $-4
273         ADD     $52, R0
274         MOVM.IA.S       [R13-R14], (R0)
275         RET
276
277
278 TEXT dumpstack(SB), 0, $8
279         MOVW    R14, 8(R13)
280         ADD     $12, R13, R0
281         BL      _dumpstack(SB)
282         RET
283
284 TEXT getdfsr(SB), 0, $-4
285         MRC     CpSC, 0, R0, C(5), C(0), 0
286         RET
287
288 TEXT getifsr(SB), 0, $-4
289         MRC     CpSC, 0, R0, C(5), C(0), 1
290         RET
291
292 TEXT getdfar(SB), 0, $-4
293         MRC     CpSC, 0, R0, C(6), C(0), 0
294         RET
295
296 TEXT getifar(SB), 0, $-4
297         MRC     CpSC, 0, R0, C(6), C(0), 2
298         RET
299
300 TEXT getr13(SB), 0, $-4
301         MOVW    R13, R0
302         RET