Made stuff work on SPARC HW
[akaros.git] / kern / arch / sparc / spillfill.S
1 #include <arch/mmu.h>
2 #include <arch/sparc.h>
3 #include <arch/trap.h>
4 #include <ros/memlayout.h>
5 #include <arch/trap_table.h>
6
7 #define MAKE_STACK \
8         set     bootstacktop - SIZEOF_TRAPFRAME_T - 64,%fp; \
9         mov     CORE_ID_REG,%l0; \
10         sll     %l0,KSTKSHIFT,%l0; \
11         sub     %fp,%l0,%fp
12
13 ! preconditions:
14 ! WIM & (1<<CWP) != 0
15 ! link address in %l7
16 ! postconditions:
17 ! CWP same, but is now valid
18 ! %l0, %l1, %l2, %l5, %l6, %l7 have not changed 
19 .global handle_window_overflow
20 handle_window_overflow:
21         ! clear out MMU faults (workaround for HW bug :()
22         mov     0x300,%l3
23         lda     [%l3] 4,%g0
24
25         mov     %g1,%l4
26         mov     %wim,%l3
27         mov     %g0,%wim
28         and     %l3,1,%g1
29
30         ! this will be patched at runtime; 0 is really NWINDOWS-1
31 .global spill_patchme
32 spill_patchme:
33         sll     %g1,0,%g1
34
35         srl     %l3,1,%l3
36         or      %g1,%l3,%g1
37         mov     %psr,%l3
38
39         save
40         mov     %g1,%wim
41         btst    7,%sp
42         bne     2f
43          lda    [%g0] 4,%g1             ! do the fill in no-fault mode
44         or      %g1,2,%g1               ! NF = 1
45         sta     %g1,[%g0] 4
46         std     %l0,[%sp+ 0]
47         std     %l2,[%sp+ 8]
48         std     %l4,[%sp+16]
49         std     %l6,[%sp+24]
50         std     %i0,[%sp+32]
51         std     %i2,[%sp+40]
52         std     %i4,[%sp+48]
53         std     %i6,[%sp+56]
54         restore
55
56         xor     %g1,2,%g1
57         sta     %g1,[%g0] 4             ! NF = 0
58         mov     0x300,%g1
59         lda     [%g1] 4,%g1
60         btst    0x1C,%g1                ! FT != 0 ?
61         bne     1f
62          mov    %l4,%g1
63
64         // success!
65         mov     %l3,%psr
66         jmp     %l1
67          rett   %l2
68
69 1:      // page fault
70         mov     %l3,%psr
71         MAKE_STACK
72         TRAP_TABLE_ENTRY(spill_pagefault)
73
74 2:      // spill misaligned
75         restore
76         mov     %l3,%psr
77         mov     %l4,%g1
78         MAKE_STACK
79         TRAP_TABLE_ENTRY(spill_misaligned)
80
81 .global handle_window_underflow
82 handle_window_underflow:
83         ! clear out MMU faults (workaround for HW bug :()
84         mov     0x300,%l3
85         lda     [%l3] 4,%g0
86
87         mov     %wim,%l3
88         mov     %g1,%l4
89         mov     %psr,%l5
90         mov     %g0,%wim
91
92 .global fill_patchme
93 fill_patchme:
94         srl     %l3,0,%l7               ! srl %l3,NWINDOWS-1,%l3
95         and     %l7,1,%l7
96         sll     %l3,1,%l6
97         or      %l7,%l6,%l6
98
99         restore
100         restore
101         btst    7,%sp
102         bne     2f
103          lda    [%g0] 4,%g1             ! do the fill in no-fault mode
104         or      %g1,2,%g1               ! NF = 1
105         sta     %g1,[%g0] 4
106         ldd     [%sp+ 0],%l0
107         ldd     [%sp+ 8],%l2
108         ldd     [%sp+16],%l4
109         ldd     [%sp+24],%l6
110         ldd     [%sp+32],%i0
111         ldd     [%sp+40],%i2
112         ldd     [%sp+48],%i4
113         ldd     [%sp+56],%i6
114         save
115         save
116
117         xor     %g1,2,%g1
118         sta     %g1,[%g0] 4             ! NF = 0
119         mov     0x300,%g1
120         lda     [%g1] 4,%g1
121         btst    0x1C,%g1                ! FT != 0 ?
122         bne     1f
123          mov    %l4,%g1
124
125         // success!
126         mov     %l5,%psr
127         mov     %l6,%wim
128         jmp     %l1
129          rett   %l2
130
131 1:      // page fault
132         mov     %l3,%wim
133         mov     %l5,%psr
134         MAKE_STACK
135         TRAP_TABLE_ENTRY(fill_pagefault)
136
137 2:      // fill misaligned
138         save
139         save
140         mov     %l4,%g1
141         mov     %l3,%wim
142         mov     %l5,%psr
143         MAKE_STACK
144         TRAP_TABLE_ENTRY(fill_misaligned)