FreeBSD/Linux Kernel Cross Reference
sys/alphapc/l.s
1 #include "mem.h"
2 #include "osf1pal.h"
3
4 #define SP R30
5
6 #define HI_IPL 6 /* use 7 to disable mchecks */
7
8 TEXT _main(SB), $-8
9 MOVQ $setSB(SB), R29
10 MOVQ R29, R16
11 CALL_PAL $PALwrkgp
12 MOVQ $mach0(SB), R(MACH)
13 MOVQ $(BY2PG-8)(R(MACH)), R30
14 MOVQ R31, R(USER)
15 MOVQ R31, 0(R(MACH))
16
17 MOVQ $edata(SB), R1
18 MOVQ $end(SB), R2
19 clrbss:
20 MOVQ R31, (R1)
21 ADDQ $8, R1
22 CMPUGT R1, R2, R3
23 BEQ R3, clrbss
24
25 MOVL R0, bootconf(SB) /* passed in from boot loader */
26
27 _fpinit:
28 MOVQ $1, R16
29 CALL_PAL $PALwrfen
30
31 MOVQ initfpcr(SB), R1 /* MOVQ $0x2800800000000000, R1 */
32 MOVQ R1, (R30)
33 MOVT (R30), F1
34 MOVT F1, FPCR
35
36 MOVT $0.5, F28
37 ADDT F28, F28, F29
38 ADDT F29, F29, F30
39
40 MOVT F31, F1
41 MOVT F31, F2
42 MOVT F31, F3
43 MOVT F31, F4
44 MOVT F31, F5
45 MOVT F31, F6
46 MOVT F31, F7
47 MOVT F31, F8
48 MOVT F31, F9
49 MOVT F31, F10
50 MOVT F31, F11
51 MOVT F31, F12
52 MOVT F31, F13
53 MOVT F31, F14
54 MOVT F31, F15
55 MOVT F31, F16
56 MOVT F31, F17
57 MOVT F31, F18
58 MOVT F31, F19
59 MOVT F31, F20
60 MOVT F31, F21
61 MOVT F31, F22
62 MOVT F31, F23
63 MOVT F31, F24
64 MOVT F31, F25
65 MOVT F31, F26
66 MOVT F31, F27
67
68 JSR main(SB)
69 MOVQ $_divq(SB), R31 /* touch _divq etc.; doesn't need to execute */
70 MOVQ $_divl(SB), R31 /* touch _divl etc.; doesn't need to execute */
71 RET
72
73 TEXT setpcb(SB), $-8
74 MOVQ R30, (R0)
75 AND $0x7FFFFFFF, R0, R16 /* make address physical */
76 CALL_PAL $PALswpctx
77 RET
78
79 GLOBL mach0(SB), $(MAXMACH*BY2PG)
80 GLOBL init_ptbr(SB), $8
81
82 TEXT firmware(SB), $-8
83 CALL_PAL $PALhalt
84
85 TEXT xxfirmware(SB), $-8
86 CALL_PAL $PALhalt
87
88 TEXT splhi(SB), $0
89
90 MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
91 MOVQ $HI_IPL, R16
92 CALL_PAL $PALswpipl
93 RET
94
95 TEXT spllo(SB), $0
96 MOVQ R31, R16
97 CALL_PAL $PALswpipl
98 RET
99
100 TEXT splx(SB), $0
101 MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
102
103 TEXT splxpc(SB), $0 /* for iunlock */
104 MOVQ R0, R16
105 CALL_PAL $PALswpipl
106 RET
107
108 TEXT spldone(SB), $0
109 RET
110
111 TEXT islo(SB), $0
112 CALL_PAL $PALrdps
113 AND $IPL, R0
114 XOR $HI_IPL, R0
115 RET
116
117 TEXT mb(SB), $-8
118 MB
119 RET
120
121 TEXT icflush(SB), $-8
122 CALL_PAL $PALimb
123 RET
124
125 TEXT tlbflush(SB), $-8
126 MOVQ R0, R16
127 MOVL 4(FP), R17
128 CALL_PAL $PALtbi
129 RET
130
131 TEXT swpctx(SB), $-8
132 MOVQ R0, R16
133 AND $0x7FFFFFFF, R16 /* make address physical */
134 CALL_PAL $PALswpctx
135 RET
136
137 TEXT wrent(SB), $-8
138 MOVQ R0, R17
139 MOVL 4(FP), R16
140 CALL_PAL $PALwrent
141 RET
142
143 TEXT wrvptptr(SB), $-8
144 MOVQ R0, R16
145 CALL_PAL $PALwrvptptr
146 RET
147
148 TEXT cserve(SB), $-8
149 MOVQ R0, R16
150 MOVL 4(FP), R17
151 CALL_PAL $PALcserve
152 RET
153
154 TEXT setlabel(SB), $-8
155 MOVL R30, 0(R0)
156 MOVL R26, 4(R0)
157 MOVQ $0, R0
158 RET
159
160 TEXT gotolabel(SB), $-8
161 MOVL 0(R0), R30
162 MOVL 4(R0), R26
163 MOVQ $1, R0
164 RET
165
166 TEXT tas(SB), $-8
167 MOVQ R0, R1 /* l */
168 tas1:
169 MOVLL (R1), R0 /* l->key */
170 BNE R0, tas2
171 MOVQ $1, R2
172 MOVLC R2, (R1) /* l->key = 1 */
173 BEQ R2, tas1 /* write failed, try again? */
174 tas2:
175 RET
176
177 TEXT _xdec(SB), $-8
178 MOVQ R0, R1 /* p */
179 dec1:
180 MOVLL (R1), R0 /* *p */
181 SUBL $1, R0
182 MOVQ R0, R2
183 MOVLC R2, (R1) /* --(*p) */
184 BEQ R2, dec1 /* write failed, retry */
185 RET
186
187 TEXT _xinc(SB), $-8
188 MOVQ R0, R1 /* p */
189 inc1:
190 MOVLL (R1), R0 /* *p */
191 ADDL $1, R0
192 MOVLC R0, (R1) /* (*p)++ */
193 BEQ R0, inc1 /* write failed, retry */
194 RET
195
196 TEXT cmpswap(SB), $-8
197 MOVQ R0, R1 /* p */
198 MOVL old+4(FP), R2
199 MOVL new+8(FP), R3
200 MOVLL (R1), R0
201 CMPEQ R0, R2, R4
202 BEQ R4, fail /* if R0 != [sic] R2, goto fail */
203 MOVQ R3, R0
204 MOVLC R0, (R1)
205 RET
206 fail:
207 MOVL $0, R0
208 RET
209
210 TEXT fpenab(SB), $-8
211 MOVQ R0, R16
212 CALL_PAL $PALwrfen
213 RET
214
215 TEXT rpcc(SB), $0
216 MOVL R0, R1
217 MOVL $0, R0
218 WORD $0x6000C000 /* RPCC R0 */
219 BEQ R1, _ret
220 MOVQ R0, (R1)
221 _ret:
222 RET
223
224 /*
225 * Exception handlers. The stack frame looks like this:
226 *
227 * R30+0: (unused) link reg storage (R26) (32 bits)
228 * R30+4: padding for alignment (32 bits)
229 * R30+8: trap()'s first arg storage (R0) (32 bits -- type Ureg*)
230 * R30+12: padding for alignment (32 bits)
231 * R30+16: first 31 fields of Ureg, saved here (31*64 bits)
232 * R30+264: other 6 fields of Ureg, saved by PALcode (6*64 bits)
233 * R30+312: previous value of KSP before trap
234 */
235
236 TEXT arith(SB), $-8
237 SUBQ $(4*BY2WD+31*BY2V), R30
238 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
239 MOVQ $1, R0
240 JMP trapcommon
241
242 TEXT illegal0(SB), $-8
243 SUBQ $(4*BY2WD+31*BY2V), R30
244 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
245 MOVQ $2, R0
246 JMP trapcommon
247
248 TEXT fault0(SB), $-8
249 SUBQ $(4*BY2WD+31*BY2V), R30
250 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
251 MOVQ $4, R0
252 JMP trapcommon
253
254 TEXT unaligned(SB), $-8
255 SUBQ $(4*BY2WD+31*BY2V), R30
256 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
257 MOVQ $6, R0
258 JMP trapcommon
259
260 TEXT intr0(SB), $-8
261 SUBQ $(4*BY2WD+31*BY2V), R30
262 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
263 MOVQ $3, R0
264
265 trapcommon:
266 MOVQ R0, (4*BY2WD+0*BY2V)(R30)
267 MOVQ R16, (4*BY2WD+1*BY2V)(R30)
268 MOVQ R17, (4*BY2WD+2*BY2V)(R30)
269 MOVQ R18, (4*BY2WD+3*BY2V)(R30)
270
271 /* R0 already saved, (4*BY2WD+4*BY2V)(R30) */
272 MOVQ R1, (4*BY2WD+5*BY2V)(R30)
273 MOVQ R2, (4*BY2WD+6*BY2V)(R30)
274 MOVQ R3, (4*BY2WD+7*BY2V)(R30)
275 MOVQ R4, (4*BY2WD+8*BY2V)(R30)
276 MOVQ R5, (4*BY2WD+9*BY2V)(R30)
277 MOVQ R6, (4*BY2WD+10*BY2V)(R30)
278 MOVQ R7, (4*BY2WD+11*BY2V)(R30)
279 MOVQ R8, (4*BY2WD+12*BY2V)(R30)
280 MOVQ R9, (4*BY2WD+13*BY2V)(R30)
281 MOVQ R10, (4*BY2WD+14*BY2V)(R30)
282 MOVQ R11, (4*BY2WD+15*BY2V)(R30)
283 MOVQ R12, (4*BY2WD+16*BY2V)(R30)
284 MOVQ R13, (4*BY2WD+17*BY2V)(R30)
285 MOVQ R14, (4*BY2WD+18*BY2V)(R30)
286 MOVQ R15, (4*BY2WD+19*BY2V)(R30)
287 MOVQ R19, (4*BY2WD+20*BY2V)(R30)
288 MOVQ R20, (4*BY2WD+21*BY2V)(R30)
289 MOVQ R21, (4*BY2WD+22*BY2V)(R30)
290 MOVQ R22, (4*BY2WD+23*BY2V)(R30)
291 MOVQ R23, (4*BY2WD+24*BY2V)(R30)
292 MOVQ R24, (4*BY2WD+25*BY2V)(R30)
293 MOVQ R25, (4*BY2WD+26*BY2V)(R30)
294 MOVQ R26, (4*BY2WD+27*BY2V)(R30)
295 MOVQ R27, (4*BY2WD+28*BY2V)(R30)
296 MOVQ R28, (4*BY2WD+29*BY2V)(R30)
297
298 MOVQ $HI_IPL, R16
299 CALL_PAL $PALswpipl
300
301 CALL_PAL $PALrdusp
302 MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
303
304 MOVQ $mach0(SB), R(MACH)
305 MOVQ $(4*BY2WD)(R30), R0
306 JSR trap(SB)
307 trapret:
308 MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
309 CALL_PAL $PALwrusp /* ... */
310 MOVQ (4*BY2WD+4*BY2V)(R30), R0
311 MOVQ (4*BY2WD+5*BY2V)(R30), R1
312 MOVQ (4*BY2WD+6*BY2V)(R30), R2
313 MOVQ (4*BY2WD+7*BY2V)(R30), R3
314 MOVQ (4*BY2WD+8*BY2V)(R30), R4
315 MOVQ (4*BY2WD+9*BY2V)(R30), R5
316 MOVQ (4*BY2WD+10*BY2V)(R30), R6
317 MOVQ (4*BY2WD+11*BY2V)(R30), R7
318 MOVQ (4*BY2WD+12*BY2V)(R30), R8
319 MOVQ (4*BY2WD+13*BY2V)(R30), R9
320 MOVQ (4*BY2WD+14*BY2V)(R30), R10
321 MOVQ (4*BY2WD+15*BY2V)(R30), R11
322 MOVQ (4*BY2WD+16*BY2V)(R30), R12
323 MOVQ (4*BY2WD+17*BY2V)(R30), R13
324 MOVQ (4*BY2WD+18*BY2V)(R30), R14
325 MOVQ (4*BY2WD+19*BY2V)(R30), R15
326 MOVQ (4*BY2WD+20*BY2V)(R30), R19
327 MOVQ (4*BY2WD+21*BY2V)(R30), R20
328 MOVQ (4*BY2WD+22*BY2V)(R30), R21
329 MOVQ (4*BY2WD+23*BY2V)(R30), R22
330 MOVQ (4*BY2WD+24*BY2V)(R30), R23
331 MOVQ (4*BY2WD+25*BY2V)(R30), R24
332 MOVQ (4*BY2WD+26*BY2V)(R30), R25
333 MOVQ (4*BY2WD+27*BY2V)(R30), R26
334 MOVQ (4*BY2WD+28*BY2V)(R30), R27
335 MOVQ (4*BY2WD+29*BY2V)(R30), R28
336 /* USP already restored from (4*BY2WD+30*BY2V)(R30) */
337 ADDQ $(4*BY2WD+31*BY2V), R30
338 CALL_PAL $PALrti
339
340 TEXT forkret(SB), $0
341 MOVQ R31, R0 /* Fake out system call return */
342 JMP systrapret
343
344 TEXT syscall0(SB), $-8
345 SUBQ $(4*BY2WD+31*BY2V), R30
346 MOVQ R0, (4*BY2WD+4*BY2V)(R30) /* save scallnr in R0 */
347 MOVQ $HI_IPL, R16
348 CALL_PAL $PALswpipl
349 MOVQ $mach0(SB), R(MACH)
350 CALL_PAL $PALrdusp
351 MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
352 MOVQ R26, (4*BY2WD+27*BY2V)(R30) /* save last return address */
353 MOVQ $(4*BY2WD)(R30), R0 /* pass address of Ureg */
354 JSR syscall(SB)
355 systrapret:
356 MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
357 CALL_PAL $PALwrusp /* consider doing this in execregs... */
358 MOVQ (4*BY2WD+27*BY2V)(R30), R26 /* restore last return address */
359 ADDQ $(4*BY2WD+31*BY2V), R30
360 CALL_PAL $PALretsys
361
362 /*
363 * Take first processor into user mode
364 * - argument is stack pointer to user
365 */
366
367 TEXT touser(SB), $-8
368 MOVQ R0, R16
369 CALL_PAL $PALwrusp /* set USP to value passed */
370 SUBQ $(6*BY2V), R30 /* create frame for retsys */
371 MOVQ $(UTZERO+32), R26 /* header appears in text */
372 MOVQ R26, (1*BY2V)(R30) /* PC -- only reg that matters */
373 CALL_PAL $PALretsys
374
375 TEXT rfnote(SB), $0
376 SUBL $(2*BY2WD), R0, SP
377 JMP trapret
378
379 TEXT savefpregs(SB), $-8
380 MOVT F0, 0x00(R0)
381 MOVT F1, 0x08(R0)
382 MOVT F2, 0x10(R0)
383 MOVT F3, 0x18(R0)
384 MOVT F4, 0x20(R0)
385 MOVT F5, 0x28(R0)
386 MOVT F6, 0x30(R0)
387 MOVT F7, 0x38(R0)
388 MOVT F8, 0x40(R0)
389 MOVT F9, 0x48(R0)
390 MOVT F10, 0x50(R0)
391 MOVT F11, 0x58(R0)
392 MOVT F12, 0x60(R0)
393 MOVT F13, 0x68(R0)
394 MOVT F14, 0x70(R0)
395 MOVT F15, 0x78(R0)
396 MOVT F16, 0x80(R0)
397 MOVT F17, 0x88(R0)
398 MOVT F18, 0x90(R0)
399 MOVT F19, 0x98(R0)
400 MOVT F20, 0xA0(R0)
401 MOVT F21, 0xA8(R0)
402 MOVT F22, 0xB0(R0)
403 MOVT F23, 0xB8(R0)
404 MOVT F24, 0xC0(R0)
405 MOVT F25, 0xC8(R0)
406 MOVT F26, 0xD0(R0)
407 MOVT F27, 0xD8(R0)
408 MOVT F28, 0xE0(R0)
409 MOVT F29, 0xE8(R0)
410 MOVT F30, 0xF0(R0)
411 MOVT F31, 0xF8(R0)
412 MOVT FPCR, F0
413 MOVT F0, 0x100(R0)
414
415 MOVQ $0, R16
416 CALL_PAL $PALwrfen /* disable */
417 RET
418
419 TEXT restfpregs(SB), $-8
420 MOVQ $1, R16
421 CALL_PAL $PALwrfen /* enable */
422
423 MOVT 0x100(R0), F0
424 MOVT F0, FPCR
425 MOVT 0x00(R0), F0
426 MOVT 0x08(R0), F1
427 MOVT 0x10(R0), F2
428 MOVT 0x18(R0), F3
429 MOVT 0x20(R0), F4
430 MOVT 0x28(R0), F5
431 MOVT 0x30(R0), F6
432 MOVT 0x38(R0), F7
433 MOVT 0x40(R0), F8
434 MOVT 0x48(R0), F9
435 MOVT 0x50(R0), F10
436 MOVT 0x58(R0), F11
437 MOVT 0x60(R0), F12
438 MOVT 0x68(R0), F13
439 MOVT 0x70(R0), F14
440 MOVT 0x78(R0), F15
441 MOVT 0x80(R0), F16
442 MOVT 0x88(R0), F17
443 MOVT 0x90(R0), F18
444 MOVT 0x98(R0), F19
445 MOVT 0xA0(R0), F20
446 MOVT 0xA8(R0), F21
447 MOVT 0xB0(R0), F22
448 MOVT 0xB8(R0), F23
449 MOVT 0xC0(R0), F24
450 MOVT 0xC8(R0), F25
451 MOVT 0xD0(R0), F26
452 MOVT 0xD8(R0), F27
453 MOVT 0xE0(R0), F28
454 MOVT 0xE8(R0), F29
455 MOVT 0xF0(R0), F30
456 MOVT 0xF8(R0), F31
457 RET
Cache object: 42e824c61e1575d814864e9c252d7f3b
|