1
2
3
4
5
6
7
8
9 .type __spitfire_access_error,#function
10 __spitfire_access_error:
11
12
13
14 stxa %g0, [%g0] ASI_ESTATE_ERROR_EN
15 membar #Sync
16
17 mov UDBE_UE, %g1
18 ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
19
20
21
22
23
24 __spitfire_cee_trap_continue:
25 ldxa [%g0] ASI_AFAR, %g5 ! Get AFAR
26
27 rdpr %tt, %g3
28 and %g3, 0x1ff, %g3 ! Paranoia
29 sllx %g3, SFSTAT_TRAP_TYPE_SHIFT, %g3
30 or %g4, %g3, %g4
31 rdpr %tl, %g3
32 cmp %g3, 1
33 mov 1, %g3
34 bleu %xcc, 1f
35 sllx %g3, SFSTAT_TL_GT_ONE_SHIFT, %g3
36
37 or %g4, %g3, %g4
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 1: ldxa [%g0] ASI_UDBH_ERROR_R, %g3
53 and %g3, 0x3ff, %g7 ! Paranoia
54 sllx %g7, SFSTAT_UDBH_SHIFT, %g7
55 or %g4, %g7, %g4
56 andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
57 be,pn %xcc, 1f
58 nop
59 stxa %g3, [%g0] ASI_UDB_ERROR_W
60 membar #Sync
61
62 1: mov 0x18, %g3
63 ldxa [%g3] ASI_UDBL_ERROR_R, %g3
64 and %g3, 0x3ff, %g7 ! Paranoia
65 sllx %g7, SFSTAT_UDBL_SHIFT, %g7
66 or %g4, %g7, %g4
67 andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
68 be,pn %xcc, 1f
69 nop
70 mov 0x18, %g7
71 stxa %g3, [%g7] ASI_UDB_ERROR_W
72 membar #Sync
73
74 1:
75
76
77 stxa %g4, [%g0] ASI_AFSR
78 membar #Sync
79
80 rdpr %tl, %g2
81 cmp %g2, 1
82 rdpr %pil, %g2
83 bleu,pt %xcc, 1f
84 wrpr %g0, PIL_NORMAL_MAX, %pil
85
86 ba,pt %xcc, etraptl1
87 rd %pc, %g7
88
89 ba,a,pt %xcc, 2f
90 nop
91
92 1: ba,pt %xcc, etrap_irq
93 rd %pc, %g7
94
95 2:
96 #ifdef CONFIG_TRACE_IRQFLAGS
97 call trace_hardirqs_off
98 nop
99 #endif
100 mov %l4, %o1
101 mov %l5, %o2
102 call spitfire_access_error
103 add %sp, PTREGS_OFF, %o0
104 ba,a,pt %xcc, rtrap
105 .size __spitfire_access_error,.-__spitfire_access_error
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 .type __spitfire_cee_trap,#function
134 __spitfire_cee_trap:
135 ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
136 mov 1, %g3
137 sllx %g3, SFAFSR_UE_SHIFT, %g3
138 andcc %g4, %g3, %g0 ! Check for UE
139 bne,pn %xcc, __spitfire_access_error
140 nop
141
142
143
144
145
146
147 ldxa [%g0] ASI_ESTATE_ERROR_EN, %g3
148 andn %g3, ESTATE_ERR_CE, %g3
149 stxa %g3, [%g0] ASI_ESTATE_ERROR_EN
150 membar #Sync
151
152
153 ba,pt %xcc, __spitfire_cee_trap_continue
154 mov UDBE_CE, %g1
155 .size __spitfire_cee_trap,.-__spitfire_cee_trap
156
157 .type __spitfire_data_access_exception_tl1,#function
158 __spitfire_data_access_exception_tl1:
159 rdpr %pstate, %g4
160 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
161 mov TLB_SFSR, %g3
162 mov DMMU_SFAR, %g5
163 ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
164 ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
165 stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
166 membar #Sync
167 rdpr %tt, %g3
168 cmp %g3, 0x80 ! first win spill/fill trap
169 blu,pn %xcc, 1f
170 cmp %g3, 0xff ! last win spill/fill trap
171 bgu,pn %xcc, 1f
172 nop
173 ba,pt %xcc, winfix_dax
174 rdpr %tpc, %g3
175 1: sethi %hi(109f), %g7
176 ba,pt %xcc, etraptl1
177 109: or %g7, %lo(109b), %g7
178 mov %l4, %o1
179 mov %l5, %o2
180 call spitfire_data_access_exception_tl1
181 add %sp, PTREGS_OFF, %o0
182 ba,a,pt %xcc, rtrap
183 .size __spitfire_data_access_exception_tl1,.-__spitfire_data_access_exception_tl1
184
185 .type __spitfire_data_access_exception,#function
186 __spitfire_data_access_exception:
187 rdpr %pstate, %g4
188 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
189 mov TLB_SFSR, %g3
190 mov DMMU_SFAR, %g5
191 ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
192 ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
193 stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
194 membar #Sync
195 sethi %hi(109f), %g7
196 ba,pt %xcc, etrap
197 109: or %g7, %lo(109b), %g7
198 mov %l4, %o1
199 mov %l5, %o2
200 call spitfire_data_access_exception
201 add %sp, PTREGS_OFF, %o0
202 ba,a,pt %xcc, rtrap
203 .size __spitfire_data_access_exception,.-__spitfire_data_access_exception
204
205 .type __spitfire_insn_access_exception_tl1,#function
206 __spitfire_insn_access_exception_tl1:
207 rdpr %pstate, %g4
208 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
209 mov TLB_SFSR, %g3
210 ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
211 rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
212 stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
213 membar #Sync
214 sethi %hi(109f), %g7
215 ba,pt %xcc, etraptl1
216 109: or %g7, %lo(109b), %g7
217 mov %l4, %o1
218 mov %l5, %o2
219 call spitfire_insn_access_exception_tl1
220 add %sp, PTREGS_OFF, %o0
221 ba,a,pt %xcc, rtrap
222 .size __spitfire_insn_access_exception_tl1,.-__spitfire_insn_access_exception_tl1
223
224 .type __spitfire_insn_access_exception,#function
225 __spitfire_insn_access_exception:
226 rdpr %pstate, %g4
227 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
228 mov TLB_SFSR, %g3
229 ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
230 rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
231 stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
232 membar #Sync
233 sethi %hi(109f), %g7
234 ba,pt %xcc, etrap
235 109: or %g7, %lo(109b), %g7
236 mov %l4, %o1
237 mov %l5, %o2
238 call spitfire_insn_access_exception
239 add %sp, PTREGS_OFF, %o0
240 ba,a,pt %xcc, rtrap
241 .size __spitfire_insn_access_exception,.-__spitfire_insn_access_exception