Massive cleanup of SPARC kernel entry code
[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         mov     %g1,%l4
22         mov     %wim,%l3
23         mov     %g0,%wim
24         and     %l3,1,%g1
25
26         ! this will be patched at runtime; 0 is really NWINDOWS-1
27 .global spill_patchme
28 spill_patchme:
29         sll     %g1,0,%g1
30
31         srl     %l3,1,%l3
32         or      %g1,%l3,%g1
33         mov     %psr,%l3
34
35         save
36         mov     %g1,%wim
37         btst    7,%sp
38         bne     2f
39          lda    [%g0] 4,%g1             ! do the fill in no-fault mode
40         or      %g1,2,%g1               ! NF = 1
41         sta     %g1,[%g0] 4
42         std     %l0,[%sp+ 0]
43         std     %l2,[%sp+ 8]
44         std     %l4,[%sp+16]
45         std     %l6,[%sp+24]
46         std     %i0,[%sp+32]
47         std     %i2,[%sp+40]
48         std     %i4,[%sp+48]
49         std     %i6,[%sp+56]
50         restore
51
52         xor     %g1,2,%g1
53         sta     %g1,[%g0] 4             ! NF = 0
54         mov     0x300,%g1
55         lda     [%g1] 4,%g1
56         btst    0x1C,%g1                ! FT != 0 ?
57         bne     1f
58          mov    %l4,%g1
59
60         // success!
61         mov     %l3,%psr
62         jmp     %l1
63          rett   %l2
64
65 1:      // page fault
66         mov     %l3,%psr
67         MAKE_STACK
68         TRAP_TABLE_ENTRY(spill_pagefault)
69
70 2:      // spill misaligned
71         restore
72         mov     %l3,%psr
73         mov     %l4,%g1
74         MAKE_STACK
75         TRAP_TABLE_ENTRY(spill_misaligned)
76
77 .global handle_window_underflow
78 handle_window_underflow:
79         mov     %wim,%l3
80         mov     %g1,%l4
81         mov     %psr,%l5
82         mov     %g0,%wim
83
84 .global fill_patchme
85 fill_patchme:
86         srl     %l3,0,%l7               ! srl %l3,NWINDOWS-1,%l3
87         and     %l7,1,%l7
88         sll     %l3,1,%l6
89         or      %l7,%l6,%l6
90
91         restore
92         restore
93         btst    7,%sp
94         bne     2f
95          lda    [%g0] 4,%g1             ! do the fill in no-fault mode
96         or      %g1,2,%g1               ! NF = 1
97         sta     %g1,[%g0] 4
98         ldd     [%sp+ 0],%l0
99         ldd     [%sp+ 8],%l2
100         ldd     [%sp+16],%l4
101         ldd     [%sp+24],%l6
102         ldd     [%sp+32],%i0
103         ldd     [%sp+40],%i2
104         ldd     [%sp+48],%i4
105         ldd     [%sp+56],%i6
106         save
107         save
108
109         xor     %g1,2,%g1
110         sta     %g1,[%g0] 4             ! NF = 0
111         mov     0x300,%g1
112         lda     [%g1] 4,%g1
113         btst    0x1C,%g1                ! FT != 0 ?
114         bne     1f
115          mov    %l4,%g1
116
117         // success!
118         mov     %l5,%psr
119         mov     %l6,%wim
120         jmp     %l1
121          rett   %l2
122
123 1:      // page fault
124         mov     %l3,%wim
125         mov     %l5,%psr
126         MAKE_STACK
127         TRAP_TABLE_ENTRY(fill_pagefault)
128
129 2:      // fill misaligned
130         save
131         save
132         mov     %l4,%g1
133         mov     %l3,%wim
134         mov     %l5,%psr
135         MAKE_STACK
136         TRAP_TABLE_ENTRY(fill_misaligned)