]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/alphapc/l.s
merge
[plan9front.git] / sys / src / 9 / 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