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