]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/mtx/l.s
kernel: introduce per process FPU struct (PFPU) for more flexible machine specific...
[plan9front.git] / sys / src / 9 / mtx / l.s
1 #include        "mem.h"
2
3 /* use of SPRG registers in save/restore */
4 #define SAVER0  SPRG0
5 #define SAVER1  SPRG1
6 #define SAVELR  SPRG2
7 #define SAVEXX  SPRG3
8
9 /* special instruction definitions */
10 #define BDNZ    BC      16,0,
11 #define BDNE    BC      0,2,
12
13 #define TLBIA   WORD    $((31<<26)|(307<<1))
14 #define TLBSYNC WORD    $((31<<26)|(566<<1))
15
16 /* on some models mtmsr doesn't synchronise enough (eg, 603e) */
17 #define MSRSYNC SYNC; ISYNC
18
19 #define UREGSPACE       (UREGSIZE+8)
20
21         TEXT start(SB), $-4
22
23         /*
24          * setup MSR
25          * turn off interrupts
26          * use 0x000 as exception prefix
27          * enable machine check
28          */
29         MOVW    MSR, R3
30         MOVW    $(MSR_EE|MSR_IP), R4
31         ANDN    R4, R3
32         OR              $(MSR_ME), R3
33         ISYNC
34         MOVW    R3, MSR
35         MSRSYNC
36
37         /* except during trap handling, R0 is zero from now on */
38         MOVW    $0, R0
39
40         /* setup SB for pre mmu */
41         MOVW    $setSB(SB), R2
42         MOVW    $KZERO, R3
43         ANDN    R3, R2
44
45         BL      mmuinit0(SB)
46
47         /* running with MMU on!! */
48
49         /* set R2 to correct value */
50         MOVW    $setSB(SB), R2
51
52         /* debugger sets R1 to top of usable memory +1 */
53         MOVW R1, memsize(SB)
54
55         BL              kfpinit(SB)
56
57         /* set up Mach */
58         MOVW    $mach0(SB), R(MACH)
59         ADD     $(MACHSIZE-8), R(MACH), R1      /* set stack */
60
61         MOVW    R0, R(USER)
62         MOVW    R0, 0(R(MACH))
63
64         BL      main(SB)
65
66         RETURN          /* not reached */
67
68 GLOBL   mach0(SB), $(MAXMACH*BY2PG)
69 GLOBL   memsize(SB), $4
70
71 /*
72  * on return from this function we will be running in virtual mode.
73  * We set up the Block Address Translation (BAT) registers thus:
74  * 1) first 3 BATs are 256M blocks, starting from KZERO->0
75  * 2) remaining BAT maps last 256M directly
76  */
77 TEXT    mmuinit0(SB), $0
78         /* reset all the tlbs */
79         MOVW    $64, R3
80         MOVW    R3, CTR
81         MOVW    $0, R4
82 tlbloop:
83         TLBIE   R4
84         ADD             $BIT(19), R4
85         BDNZ    tlbloop
86         TLBSYNC
87
88         /* KZERO -> 0 */
89         MOVW    $(KZERO|(0x7ff<<2)|2), R3
90         MOVW    $(PTEVALID|PTEWRITE), R4
91         MOVW    R3, SPR(IBATU(0))
92         MOVW    R4, SPR(IBATL(0))
93         MOVW    R3, SPR(DBATU(0))
94         MOVW    R4, SPR(DBATL(0))
95
96         /* KZERO+256M -> 256M */
97         ADD             $(1<<28), R3
98         ADD             $(1<<28), R4
99         MOVW    R3, SPR(IBATU(1))
100         MOVW    R4, SPR(IBATL(1))
101         MOVW    R3, SPR(DBATU(1))
102         MOVW    R4, SPR(DBATL(1))
103
104         /* KZERO+512M -> 512M */
105         ADD             $(1<<28), R3
106         ADD             $(1<<28), R4
107         MOVW    R3, SPR(IBATU(2))
108         MOVW    R4, SPR(IBATL(2))
109         MOVW    R3, SPR(DBATU(2))
110         MOVW    R4, SPR(DBATL(2))
111
112         /* direct map last block, uncached, (?guarded) */
113         MOVW    $((0xf<<28)|(0x7ff<<2)|2), R3
114         MOVW    $((0xf<<28)|PTE1_I|PTE1_G|PTE1_RW), R4
115         MOVW    R3, SPR(DBATU(3))
116         MOVW    R4, SPR(DBATL(3))
117
118         /* IBAT 3 unused */
119         MOVW    R0, SPR(IBATU(3))
120         MOVW    R0, SPR(IBATL(3))
121
122         /* enable MMU */
123         MOVW    LR, R3
124         OR      $KZERO, R3
125         MOVW    R3, SPR(SRR0)
126         MOVW    MSR, R4
127         OR      $(MSR_IR|MSR_DR), R4
128         MOVW    R4, SPR(SRR1)
129         RFI     /* resume in kernel mode in caller */
130
131         RETURN
132
133 TEXT    kfpinit(SB), $0
134         MOVFL   $0,FPSCR(7)
135         MOVFL   $0xD,FPSCR(6)   /* VE, OE, ZE */
136         MOVFL   $0, FPSCR(5)
137         MOVFL   $0, FPSCR(3)
138         MOVFL   $0, FPSCR(2)
139         MOVFL   $0, FPSCR(1)
140         MOVFL   $0, FPSCR(0)
141
142         FMOVD   $4503601774854144.0, F27
143         FMOVD   $0.5, F29
144         FSUB            F29, F29, F28
145         FADD    F29, F29, F30
146         FADD    F30, F30, F31
147         FMOVD   F28, F0
148         FMOVD   F28, F1
149         FMOVD   F28, F2
150         FMOVD   F28, F3
151         FMOVD   F28, F4
152         FMOVD   F28, F5
153         FMOVD   F28, F6
154         FMOVD   F28, F7
155         FMOVD   F28, F8
156         FMOVD   F28, F9
157         FMOVD   F28, F10
158         FMOVD   F28, F11
159         FMOVD   F28, F12
160         FMOVD   F28, F13
161         FMOVD   F28, F14
162         FMOVD   F28, F15
163         FMOVD   F28, F16
164         FMOVD   F28, F17
165         FMOVD   F28, F18
166         FMOVD   F28, F19
167         FMOVD   F28, F20
168         FMOVD   F28, F21
169         FMOVD   F28, F22
170         FMOVD   F28, F23
171         FMOVD   F28, F24
172         FMOVD   F28, F25
173         FMOVD   F28, F26
174         RETURN
175
176 TEXT    splhi(SB), $0
177         MOVW    LR, R31
178         MOVW    R31, 4(R(MACH)) /* save PC in m->splpc */
179         MOVW    MSR, R3
180         RLWNM   $0, R3, $~MSR_EE, R4
181         SYNC
182         MOVW    R4, MSR
183         MSRSYNC
184         RETURN
185
186 TEXT    splx(SB), $0
187         /* fall though */
188
189 TEXT    splxpc(SB), $0
190         MOVW    LR, R31
191         MOVW    R31, 4(R(MACH)) /* save PC in m->splpc */
192         MOVW    MSR, R4
193         RLWMI   $0, R3, $MSR_EE, R4
194         SYNC
195         MOVW    R4, MSR
196         MSRSYNC
197         RETURN
198
199 TEXT    spllo(SB), $0
200         MOVW    MSR, R3
201         OR      $MSR_EE, R3, R4
202         SYNC
203         MOVW    R4, MSR
204         MSRSYNC
205         RETURN
206
207 TEXT    spldone(SB), $0
208         RETURN
209
210 TEXT    islo(SB), $0
211         MOVW    MSR, R3
212         RLWNM   $0, R3, $MSR_EE, R3
213         RETURN
214
215 TEXT    setlabel(SB), $-4
216         MOVW    LR, R31
217         MOVW    R1, 0(R3)
218         MOVW    R31, 4(R3)
219         MOVW    $0, R3
220         RETURN
221
222 TEXT    gotolabel(SB), $-4
223         MOVW    4(R3), R31
224         MOVW    R31, LR
225         MOVW    0(R3), R1
226         MOVW    $1, R3
227         RETURN
228
229 TEXT    touser(SB), $-4
230         MOVW    $(UTZERO+32), R5        /* header appears in text */
231         MOVW    $(MSR_EE|MSR_PR|MSR_ME|MSR_IR|MSR_DR|MSR_RI), R4
232         MOVW    R4, SPR(SRR1)
233         MOVW    R3, R1
234         MOVW    R5, SPR(SRR0)
235         RFI
236
237 TEXT    icflush(SB), $-4        /* icflush(virtaddr, count) */
238         MOVW    n+4(FP), R4
239         RLWNM   $0, R3, $~(CACHELINESZ-1), R5
240         SUB     R5, R3
241         ADD     R3, R4
242         ADD             $(CACHELINESZ-1), R4
243         SRAW    $CACHELINELOG, R4
244         MOVW    R4, CTR
245 icf0:   ICBI    (R5)
246         ADD     $CACHELINESZ, R5
247         BDNZ    icf0
248         ISYNC
249         RETURN
250
251 TEXT    dcflush(SB), $-4        /* dcflush(virtaddr, count) */
252         MOVW    n+4(FP), R4
253         RLWNM   $0, R3, $~(CACHELINESZ-1), R5
254         CMP     R4, $0
255         BLE     dcf1
256         SUB     R5, R3
257         ADD     R3, R4
258         ADD             $(CACHELINESZ-1), R4
259         SRAW    $CACHELINELOG, R4
260         MOVW    R4, CTR
261 dcf0:   DCBF    (R5)
262         ADD     $CACHELINESZ, R5
263         BDNZ    dcf0
264 dcf1:
265         SYNC
266         RETURN
267
268 TEXT    tas(SB), $0
269 TEXT    _tas(SB), $0
270         SYNC
271         MOVW    R3, R4
272         MOVW    $0xdead,R5
273 tas1:
274         DCBF    (R4)    /* fix for 603x bug */
275         LWAR    (R4), R3
276         CMP     R3, $0
277         BNE     tas0
278         STWCCC  R5, (R4)
279         BNE     tas1
280 tas0:
281         SYNC
282         ISYNC
283         RETURN
284
285 TEXT cmpswap(SB),$0     /* int cmpswap(long*, long, long) */
286         MOVW    R3, R4  /* addr */
287         MOVW    old+4(FP), R5
288         MOVW    new+8(FP), R6
289         DCBF    (R4)            /* fix for 603x bug? */
290         LWAR    (R4), R3
291         CMP     R3, R5
292         BNE fail
293         STWCCC  R6, (R4)
294         BNE fail
295         MOVW $1, R3
296         RETURN
297 fail:
298         MOVW $0, R3
299         RETURN
300
301 TEXT    getpvr(SB), $0
302         MOVW    SPR(PVR), R3
303         RETURN
304
305 TEXT    getdec(SB), $0
306         MOVW    SPR(DEC), R3
307         RETURN
308
309 TEXT    putdec(SB), $0
310         MOVW    R3, SPR(DEC)
311         RETURN
312
313 TEXT    getdar(SB), $0
314         MOVW    SPR(DAR), R3
315         RETURN
316
317 TEXT    getdsisr(SB), $0
318         MOVW    SPR(DSISR), R3
319         RETURN
320
321 TEXT    getmsr(SB), $0
322         MOVW    MSR, R3
323         RETURN
324
325 TEXT    putmsr(SB), $0
326         SYNC
327         MOVW    R3, MSR
328         MSRSYNC
329         RETURN
330
331 TEXT    putsdr1(SB), $0
332         MOVW    R3, SPR(SDR1)
333         RETURN
334
335 TEXT    putsr(SB), $0
336         MOVW    4(FP), R4
337         MOVW    R4, SEG(R3)
338         RETURN
339
340 TEXT    gethid0(SB), $0
341         MOVW    SPR(HID0), R3
342         RETURN
343
344 TEXT    gethid1(SB), $0
345         MOVW    SPR(HID1), R3
346         RETURN
347
348 TEXT    puthid0(SB), $0
349         MOVW    R3, SPR(HID0)
350         RETURN
351
352 TEXT    puthid1(SB), $0
353         MOVW    R3, SPR(HID1)
354         RETURN
355
356 TEXT    eieio(SB), $0
357         EIEIO
358         RETURN
359
360 TEXT    sync(SB), $0
361         SYNC
362         RETURN
363
364 TEXT    tlbflushall(SB), $0
365         MOVW    $64, R3
366         MOVW    R3, CTR
367         MOVW    $0, R4
368 tlbflushall0:
369         TLBIE   R4
370         ADD             $BIT(19), R4
371         BDNZ    tlbflushall0
372         EIEIO
373         TLBSYNC
374         SYNC
375         RETURN
376
377 TEXT    tlbflush(SB), $0
378         TLBIE   R3
379         RETURN
380
381 TEXT    gotopc(SB), $0
382         MOVW    R3, CTR
383         MOVW    LR, R31 /* for trace back */
384         BR      (CTR)
385
386 /*
387  * traps force memory mapping off.
388  * the following code has been executed at the exception
389  * vector location
390  *      MOVW R0, SPR(SAVER0)
391  *      MOVW LR, R0
392  *      MOVW R0, SPR(SAVELR) 
393  *      bl      trapvec(SB)
394  */
395 TEXT    trapvec(SB), $-4
396         MOVW    LR, R0
397         MOVW    R1, SPR(SAVER1)
398         MOVW    R0, SPR(SAVEXX) /* vector */
399
400         /* did we come from user space */
401         MOVW    SPR(SRR1), R0
402         MOVW    CR, R1
403         MOVW    R0, CR
404         BC      4,17,ktrap
405         
406         /* switch to kernel stack */
407         MOVW    R1, CR
408         MOVW    R2, R0
409         MOVW    $setSB(SB), R2
410         RLWNM   $0, R2, $~KZERO, R2             /* PADDR(setSB) */
411         MOVW    $mach0(SB), R1  /* m-> */
412         RLWNM   $0, R1, $~KZERO, R1             /* PADDR(m->) */
413         MOVW    8(R1), R1                               /* m->proc  */
414         RLWNM   $0, R1, $~KZERO, R1             /* PADDR(m->proc) */
415         MOVW    8(R1), R1                               /* m->proc->kstack */
416         RLWNM   $0, R1, $~KZERO, R1             /* PADDR(m->proc->kstack) */
417         ADD     $(KSTACK-UREGSIZE), R1
418         MOVW    R0, R2
419         BL      saveureg(SB)
420         BL      trap(SB)
421         BR      restoreureg
422 ktrap:
423         MOVW    R1, CR
424         MOVW    SPR(SAVER1), R1
425         RLWNM   $0, R1, $~KZERO, R1             /* PADDR(R1) */
426         SUB     $UREGSPACE, R1
427         BL      saveureg(SB)
428         BL      trap(SB)
429         BR      restoreureg
430
431 /*
432  * enter with stack set and mapped.
433  * on return, SB (R2) has been set, and R3 has the Ureg*,
434  * the MMU has been re-enabled, kernel text and PC are in KSEG,
435  * R(MACH) has been set, and R0 contains 0.
436  *
437  */
438 TEXT    saveureg(SB), $-4
439 /*
440  * save state
441  */
442         MOVMW   R2, 48(R1)      /* r2:r31 */
443         MOVW    $setSB(SB), R2
444         RLWNM   $0, R2, $~KZERO, R2             /* PADDR(setSB) */
445         MOVW    $mach0(SB), R(MACH)
446         RLWNM   $0, R(MACH), $~KZERO, R(MACH)           /* PADDR(m->) */
447         MOVW    8(R(MACH)), R(USER)
448         MOVW    $mach0(SB), R(MACH)
449         MOVW    $setSB(SB), R2
450         MOVW    SPR(SAVER1), R4
451         MOVW    R4, 44(R1)
452         MOVW    SPR(SAVER0), R5
453         MOVW    R5, 40(R1)
454         MOVW    CTR, R6
455         MOVW    R6, 36(R1)
456         MOVW    XER, R4
457         MOVW    R4, 32(R1)
458         MOVW    CR, R5
459         MOVW    R5, 28(R1)
460         MOVW    SPR(SAVELR), R6 /* LR */
461         MOVW    R6, 24(R1)
462         /* pad at 20(R1) */
463         MOVW    SPR(SRR0), R0
464         MOVW    R0, 16(R1)                              /* old PC */
465         MOVW    SPR(SRR1), R0
466         MOVW    R0, 12(R1)                              /* old status */
467         MOVW    SPR(SAVEXX), R0
468         MOVW    R0, 8(R1)       /* cause/vector */
469         ADD     $8, R1, R3      /* Ureg* */
470         OR      $KZERO, R3      /* fix ureg */
471         STWCCC  R3, (R1)        /* break any pending reservations */
472         MOVW    $0, R0  /* compiler/linker expect R0 to be zero */
473
474         MOVW    MSR, R5
475         OR      $(MSR_IR|MSR_DR|MSR_FP|MSR_RI), R5      /* enable MMU */
476         MOVW    R5, SPR(SRR1)
477         MOVW    LR, R31
478         OR      $KZERO, R31     /* return PC in KSEG0 */
479         MOVW    R31, SPR(SRR0)
480         OR      $KZERO, R1      /* fix stack pointer */
481         RFI     /* returns to trap handler */
482
483 /*
484  * restore state from Ureg and return from trap/interrupt
485  */
486 TEXT    forkret(SB), $0
487         BR      restoreureg
488
489 restoreureg:
490         MOVMW   48(R1), R2      /* r2:r31 */
491         /* defer R1 */
492         MOVW    40(R1), R0
493         MOVW    R0, SPR(SAVER0)
494         MOVW    36(R1), R0
495         MOVW    R0, CTR
496         MOVW    32(R1), R0
497         MOVW    R0, XER
498         MOVW    28(R1), R0
499         MOVW    R0, CR  /* CR */
500         MOVW    24(R1), R0
501         MOVW    R0, LR
502         /* pad, skip */
503         MOVW    16(R1), R0
504         MOVW    R0, SPR(SRR0)   /* old PC */
505         MOVW    12(R1), R0
506         MOVW    R0, SPR(SRR1)   /* old MSR */
507         /* cause, skip */
508         MOVW    44(R1), R1      /* old SP */
509         MOVW    SPR(SAVER0), R0
510         RFI
511
512 TEXT    fpsave(SB), $0
513         FMOVD   F0, (0*8)(R3)
514         FMOVD   F1, (1*8)(R3)
515         FMOVD   F2, (2*8)(R3)
516         FMOVD   F3, (3*8)(R3)
517         FMOVD   F4, (4*8)(R3)
518         FMOVD   F5, (5*8)(R3)
519         FMOVD   F6, (6*8)(R3)
520         FMOVD   F7, (7*8)(R3)
521         FMOVD   F8, (8*8)(R3)
522         FMOVD   F9, (9*8)(R3)
523         FMOVD   F10, (10*8)(R3)
524         FMOVD   F11, (11*8)(R3)
525         FMOVD   F12, (12*8)(R3)
526         FMOVD   F13, (13*8)(R3)
527         FMOVD   F14, (14*8)(R3)
528         FMOVD   F15, (15*8)(R3)
529         FMOVD   F16, (16*8)(R3)
530         FMOVD   F17, (17*8)(R3)
531         FMOVD   F18, (18*8)(R3)
532         FMOVD   F19, (19*8)(R3)
533         FMOVD   F20, (20*8)(R3)
534         FMOVD   F21, (21*8)(R3)
535         FMOVD   F22, (22*8)(R3)
536         FMOVD   F23, (23*8)(R3)
537         FMOVD   F24, (24*8)(R3)
538         FMOVD   F25, (25*8)(R3)
539         FMOVD   F26, (26*8)(R3)
540         FMOVD   F27, (27*8)(R3)
541         FMOVD   F28, (28*8)(R3)
542         FMOVD   F29, (29*8)(R3)
543         FMOVD   F30, (30*8)(R3)
544         FMOVD   F31, (31*8)(R3)
545         MOVFL   FPSCR, F0
546         FMOVD   F0, (32*8)(R3)
547         RETURN
548
549 TEXT    fprestore(SB), $0
550         FMOVD   (32*8)(R3), F0
551         MOVFL   F0, FPSCR
552         FMOVD   (0*8)(R3), F0
553         FMOVD   (1*8)(R3), F1
554         FMOVD   (2*8)(R3), F2
555         FMOVD   (3*8)(R3), F3
556         FMOVD   (4*8)(R3), F4
557         FMOVD   (5*8)(R3), F5
558         FMOVD   (6*8)(R3), F6
559         FMOVD   (7*8)(R3), F7
560         FMOVD   (8*8)(R3), F8
561         FMOVD   (9*8)(R3), F9
562         FMOVD   (10*8)(R3), F10
563         FMOVD   (11*8)(R3), F11
564         FMOVD   (12*8)(R3), F12
565         FMOVD   (13*8)(R3), F13
566         FMOVD   (14*8)(R3), F14
567         FMOVD   (15*8)(R3), F15
568         FMOVD   (16*8)(R3), F16
569         FMOVD   (17*8)(R3), F17
570         FMOVD   (18*8)(R3), F18
571         FMOVD   (19*8)(R3), F19
572         FMOVD   (20*8)(R3), F20
573         FMOVD   (21*8)(R3), F21
574         FMOVD   (22*8)(R3), F22
575         FMOVD   (23*8)(R3), F23
576         FMOVD   (24*8)(R3), F24
577         FMOVD   (25*8)(R3), F25
578         FMOVD   (26*8)(R3), F26
579         FMOVD   (27*8)(R3), F27
580         FMOVD   (28*8)(R3), F28
581         FMOVD   (29*8)(R3), F29
582         FMOVD   (30*8)(R3), F30
583         FMOVD   (31*8)(R3), F31
584         RETURN