diff options
Diffstat (limited to 'arch/sparc64/kernel/etrap.S')
-rw-r--r-- | arch/sparc64/kernel/etrap.S | 170 |
1 files changed, 72 insertions, 98 deletions
diff --git a/arch/sparc64/kernel/etrap.S b/arch/sparc64/kernel/etrap.S index 0d8eba21111b..149383835c25 100644 --- a/arch/sparc64/kernel/etrap.S +++ b/arch/sparc64/kernel/etrap.S | |||
@@ -31,6 +31,7 @@ | |||
31 | .globl etrap, etrap_irq, etraptl1 | 31 | .globl etrap, etrap_irq, etraptl1 |
32 | etrap: rdpr %pil, %g2 | 32 | etrap: rdpr %pil, %g2 |
33 | etrap_irq: | 33 | etrap_irq: |
34 | TRAP_LOAD_THREAD_REG(%g6, %g1) | ||
34 | rdpr %tstate, %g1 | 35 | rdpr %tstate, %g1 |
35 | sllx %g2, 20, %g3 | 36 | sllx %g2, 20, %g3 |
36 | andcc %g1, TSTATE_PRIV, %g0 | 37 | andcc %g1, TSTATE_PRIV, %g0 |
@@ -54,7 +55,31 @@ etrap_irq: | |||
54 | rd %y, %g3 | 55 | rd %y, %g3 |
55 | stx %g1, [%g2 + STACKFRAME_SZ + PT_V9_TNPC] | 56 | stx %g1, [%g2 + STACKFRAME_SZ + PT_V9_TNPC] |
56 | st %g3, [%g2 + STACKFRAME_SZ + PT_V9_Y] | 57 | st %g3, [%g2 + STACKFRAME_SZ + PT_V9_Y] |
57 | save %g2, -STACK_BIAS, %sp ! Ordering here is critical | 58 | |
59 | rdpr %cansave, %g1 | ||
60 | brnz,pt %g1, etrap_save | ||
61 | nop | ||
62 | |||
63 | rdpr %cwp, %g1 | ||
64 | add %g1, 2, %g1 | ||
65 | wrpr %g1, %cwp | ||
66 | be,pt %xcc, etrap_user_spill | ||
67 | mov ASI_AIUP, %g3 | ||
68 | |||
69 | rdpr %otherwin, %g3 | ||
70 | brz %g3, etrap_kernel_spill | ||
71 | mov ASI_AIUS, %g3 | ||
72 | |||
73 | etrap_user_spill: | ||
74 | |||
75 | wr %g3, 0x0, %asi | ||
76 | ldx [%g6 + TI_FLAGS], %g3 | ||
77 | and %g3, _TIF_32BIT, %g3 | ||
78 | brnz,pt %g3, etrap_user_spill_32bit | ||
79 | nop | ||
80 | ba,a,pt %xcc, etrap_user_spill_64bit | ||
81 | |||
82 | etrap_save: save %g2, -STACK_BIAS, %sp | ||
58 | mov %g6, %l6 | 83 | mov %g6, %l6 |
59 | 84 | ||
60 | bne,pn %xcc, 3f | 85 | bne,pn %xcc, 3f |
@@ -70,42 +95,56 @@ etrap_irq: | |||
70 | wrpr %g2, 0, %wstate | 95 | wrpr %g2, 0, %wstate |
71 | sethi %hi(sparc64_kern_pri_context), %g2 | 96 | sethi %hi(sparc64_kern_pri_context), %g2 |
72 | ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3 | 97 | ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3 |
73 | stxa %g3, [%l4] ASI_DMMU | 98 | |
74 | flush %l6 | 99 | 661: stxa %g3, [%l4] ASI_DMMU |
75 | wr %g0, ASI_AIUS, %asi | 100 | .section .sun4v_1insn_patch, "ax" |
76 | 2: wrpr %g0, 0x0, %tl | 101 | .word 661b |
77 | mov %g4, %l4 | 102 | stxa %g3, [%l4] ASI_MMU |
103 | .previous | ||
104 | |||
105 | sethi %hi(KERNBASE), %l4 | ||
106 | flush %l4 | ||
107 | mov ASI_AIUS, %l7 | ||
108 | 2: mov %g4, %l4 | ||
78 | mov %g5, %l5 | 109 | mov %g5, %l5 |
110 | add %g7, 4, %l2 | ||
111 | |||
112 | /* Go to trap time globals so we can save them. */ | ||
113 | 661: wrpr %g0, ETRAP_PSTATE1, %pstate | ||
114 | .section .sun4v_1insn_patch, "ax" | ||
115 | .word 661b | ||
116 | SET_GL(0) | ||
117 | .previous | ||
79 | 118 | ||
80 | mov %g7, %l2 | ||
81 | wrpr %g0, ETRAP_PSTATE1, %pstate | ||
82 | stx %g1, [%sp + PTREGS_OFF + PT_V9_G1] | 119 | stx %g1, [%sp + PTREGS_OFF + PT_V9_G1] |
83 | stx %g2, [%sp + PTREGS_OFF + PT_V9_G2] | 120 | stx %g2, [%sp + PTREGS_OFF + PT_V9_G2] |
121 | sllx %l7, 24, %l7 | ||
84 | stx %g3, [%sp + PTREGS_OFF + PT_V9_G3] | 122 | stx %g3, [%sp + PTREGS_OFF + PT_V9_G3] |
123 | rdpr %cwp, %l0 | ||
85 | stx %g4, [%sp + PTREGS_OFF + PT_V9_G4] | 124 | stx %g4, [%sp + PTREGS_OFF + PT_V9_G4] |
86 | stx %g5, [%sp + PTREGS_OFF + PT_V9_G5] | 125 | stx %g5, [%sp + PTREGS_OFF + PT_V9_G5] |
87 | stx %g6, [%sp + PTREGS_OFF + PT_V9_G6] | 126 | stx %g6, [%sp + PTREGS_OFF + PT_V9_G6] |
88 | |||
89 | stx %g7, [%sp + PTREGS_OFF + PT_V9_G7] | 127 | stx %g7, [%sp + PTREGS_OFF + PT_V9_G7] |
128 | or %l7, %l0, %l7 | ||
129 | sethi %hi(TSTATE_RMO | TSTATE_PEF), %l0 | ||
130 | or %l7, %l0, %l7 | ||
131 | wrpr %l2, %tnpc | ||
132 | wrpr %l7, (TSTATE_PRIV | TSTATE_IE), %tstate | ||
90 | stx %i0, [%sp + PTREGS_OFF + PT_V9_I0] | 133 | stx %i0, [%sp + PTREGS_OFF + PT_V9_I0] |
91 | stx %i1, [%sp + PTREGS_OFF + PT_V9_I1] | 134 | stx %i1, [%sp + PTREGS_OFF + PT_V9_I1] |
92 | stx %i2, [%sp + PTREGS_OFF + PT_V9_I2] | 135 | stx %i2, [%sp + PTREGS_OFF + PT_V9_I2] |
93 | stx %i3, [%sp + PTREGS_OFF + PT_V9_I3] | 136 | stx %i3, [%sp + PTREGS_OFF + PT_V9_I3] |
94 | stx %i4, [%sp + PTREGS_OFF + PT_V9_I4] | 137 | stx %i4, [%sp + PTREGS_OFF + PT_V9_I4] |
95 | stx %i5, [%sp + PTREGS_OFF + PT_V9_I5] | 138 | stx %i5, [%sp + PTREGS_OFF + PT_V9_I5] |
96 | |||
97 | stx %i6, [%sp + PTREGS_OFF + PT_V9_I6] | 139 | stx %i6, [%sp + PTREGS_OFF + PT_V9_I6] |
98 | stx %i7, [%sp + PTREGS_OFF + PT_V9_I7] | ||
99 | wrpr %g0, ETRAP_PSTATE2, %pstate | ||
100 | mov %l6, %g6 | 140 | mov %l6, %g6 |
101 | #ifdef CONFIG_SMP | 141 | stx %i7, [%sp + PTREGS_OFF + PT_V9_I7] |
102 | mov TSB_REG, %g3 | 142 | LOAD_PER_CPU_BASE(%g5, %g6, %g4, %g3, %l1) |
103 | ldxa [%g3] ASI_IMMU, %g5 | 143 | ldx [%g6 + TI_TASK], %g4 |
104 | #endif | 144 | done |
105 | jmpl %l2 + 0x4, %g0 | ||
106 | ldx [%g6 + TI_TASK], %g4 | ||
107 | 145 | ||
108 | 3: ldub [%l6 + TI_FPDEPTH], %l5 | 146 | 3: mov ASI_P, %l7 |
147 | ldub [%l6 + TI_FPDEPTH], %l5 | ||
109 | add %l6, TI_FPSAVED + 1, %l4 | 148 | add %l6, TI_FPSAVED + 1, %l4 |
110 | srl %l5, 1, %l3 | 149 | srl %l5, 1, %l3 |
111 | add %l5, 2, %l5 | 150 | add %l5, 2, %l5 |
@@ -125,6 +164,7 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself. | |||
125 | * 0x58 TL4's TT | 164 | * 0x58 TL4's TT |
126 | * 0x60 TL | 165 | * 0x60 TL |
127 | */ | 166 | */ |
167 | TRAP_LOAD_THREAD_REG(%g6, %g1) | ||
128 | sub %sp, ((4 * 8) * 4) + 8, %g2 | 168 | sub %sp, ((4 * 8) * 4) + 8, %g2 |
129 | rdpr %tl, %g1 | 169 | rdpr %tl, %g1 |
130 | 170 | ||
@@ -148,6 +188,11 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself. | |||
148 | rdpr %tt, %g3 | 188 | rdpr %tt, %g3 |
149 | stx %g3, [%g2 + STACK_BIAS + 0x38] | 189 | stx %g3, [%g2 + STACK_BIAS + 0x38] |
150 | 190 | ||
191 | sethi %hi(is_sun4v), %g3 | ||
192 | lduw [%g3 + %lo(is_sun4v)], %g3 | ||
193 | brnz,pn %g3, finish_tl1_capture | ||
194 | nop | ||
195 | |||
151 | wrpr %g0, 3, %tl | 196 | wrpr %g0, 3, %tl |
152 | rdpr %tstate, %g3 | 197 | rdpr %tstate, %g3 |
153 | stx %g3, [%g2 + STACK_BIAS + 0x40] | 198 | stx %g3, [%g2 + STACK_BIAS + 0x40] |
@@ -168,91 +213,20 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself. | |||
168 | rdpr %tt, %g3 | 213 | rdpr %tt, %g3 |
169 | stx %g3, [%g2 + STACK_BIAS + 0x78] | 214 | stx %g3, [%g2 + STACK_BIAS + 0x78] |
170 | 215 | ||
171 | wrpr %g1, %tl | ||
172 | stx %g1, [%g2 + STACK_BIAS + 0x80] | 216 | stx %g1, [%g2 + STACK_BIAS + 0x80] |
173 | 217 | ||
218 | finish_tl1_capture: | ||
219 | wrpr %g0, 1, %tl | ||
220 | 661: nop | ||
221 | .section .sun4v_1insn_patch, "ax" | ||
222 | .word 661b | ||
223 | SET_GL(1) | ||
224 | .previous | ||
225 | |||
174 | rdpr %tstate, %g1 | 226 | rdpr %tstate, %g1 |
175 | sub %g2, STACKFRAME_SZ + TRACEREG_SZ - STACK_BIAS, %g2 | 227 | sub %g2, STACKFRAME_SZ + TRACEREG_SZ - STACK_BIAS, %g2 |
176 | ba,pt %xcc, 1b | 228 | ba,pt %xcc, 1b |
177 | andcc %g1, TSTATE_PRIV, %g0 | 229 | andcc %g1, TSTATE_PRIV, %g0 |
178 | 230 | ||
179 | .align 64 | ||
180 | .globl scetrap | ||
181 | scetrap: rdpr %pil, %g2 | ||
182 | rdpr %tstate, %g1 | ||
183 | sllx %g2, 20, %g3 | ||
184 | andcc %g1, TSTATE_PRIV, %g0 | ||
185 | or %g1, %g3, %g1 | ||
186 | bne,pn %xcc, 1f | ||
187 | sub %sp, (STACKFRAME_SZ+TRACEREG_SZ-STACK_BIAS), %g2 | ||
188 | wrpr %g0, 7, %cleanwin | ||
189 | |||
190 | sllx %g1, 51, %g3 | ||
191 | sethi %hi(TASK_REGOFF), %g2 | ||
192 | or %g2, %lo(TASK_REGOFF), %g2 | ||
193 | brlz,pn %g3, 1f | ||
194 | add %g6, %g2, %g2 | ||
195 | wr %g0, 0, %fprs | ||
196 | 1: rdpr %tpc, %g3 | ||
197 | stx %g1, [%g2 + STACKFRAME_SZ + PT_V9_TSTATE] | ||
198 | |||
199 | rdpr %tnpc, %g1 | ||
200 | stx %g3, [%g2 + STACKFRAME_SZ + PT_V9_TPC] | ||
201 | stx %g1, [%g2 + STACKFRAME_SZ + PT_V9_TNPC] | ||
202 | save %g2, -STACK_BIAS, %sp ! Ordering here is critical | ||
203 | mov %g6, %l6 | ||
204 | bne,pn %xcc, 2f | ||
205 | mov ASI_P, %l7 | ||
206 | rdpr %canrestore, %g3 | ||
207 | |||
208 | rdpr %wstate, %g2 | ||
209 | wrpr %g0, 0, %canrestore | ||
210 | sll %g2, 3, %g2 | ||
211 | mov PRIMARY_CONTEXT, %l4 | ||
212 | wrpr %g3, 0, %otherwin | ||
213 | wrpr %g2, 0, %wstate | ||
214 | sethi %hi(sparc64_kern_pri_context), %g2 | ||
215 | ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3 | ||
216 | stxa %g3, [%l4] ASI_DMMU | ||
217 | flush %l6 | ||
218 | |||
219 | mov ASI_AIUS, %l7 | ||
220 | 2: mov %g4, %l4 | ||
221 | mov %g5, %l5 | ||
222 | add %g7, 0x4, %l2 | ||
223 | wrpr %g0, ETRAP_PSTATE1, %pstate | ||
224 | stx %g1, [%sp + PTREGS_OFF + PT_V9_G1] | ||
225 | stx %g2, [%sp + PTREGS_OFF + PT_V9_G2] | ||
226 | sllx %l7, 24, %l7 | ||
227 | |||
228 | stx %g3, [%sp + PTREGS_OFF + PT_V9_G3] | ||
229 | rdpr %cwp, %l0 | ||
230 | stx %g4, [%sp + PTREGS_OFF + PT_V9_G4] | ||
231 | stx %g5, [%sp + PTREGS_OFF + PT_V9_G5] | ||
232 | stx %g6, [%sp + PTREGS_OFF + PT_V9_G6] | ||
233 | stx %g7, [%sp + PTREGS_OFF + PT_V9_G7] | ||
234 | or %l7, %l0, %l7 | ||
235 | sethi %hi(TSTATE_RMO | TSTATE_PEF), %l0 | ||
236 | |||
237 | or %l7, %l0, %l7 | ||
238 | wrpr %l2, %tnpc | ||
239 | wrpr %l7, (TSTATE_PRIV | TSTATE_IE), %tstate | ||
240 | stx %i0, [%sp + PTREGS_OFF + PT_V9_I0] | ||
241 | stx %i1, [%sp + PTREGS_OFF + PT_V9_I1] | ||
242 | stx %i2, [%sp + PTREGS_OFF + PT_V9_I2] | ||
243 | stx %i3, [%sp + PTREGS_OFF + PT_V9_I3] | ||
244 | stx %i4, [%sp + PTREGS_OFF + PT_V9_I4] | ||
245 | |||
246 | stx %i5, [%sp + PTREGS_OFF + PT_V9_I5] | ||
247 | stx %i6, [%sp + PTREGS_OFF + PT_V9_I6] | ||
248 | mov %l6, %g6 | ||
249 | stx %i7, [%sp + PTREGS_OFF + PT_V9_I7] | ||
250 | #ifdef CONFIG_SMP | ||
251 | mov TSB_REG, %g3 | ||
252 | ldxa [%g3] ASI_IMMU, %g5 | ||
253 | #endif | ||
254 | ldx [%g6 + TI_TASK], %g4 | ||
255 | done | ||
256 | |||
257 | #undef TASK_REGOFF | 231 | #undef TASK_REGOFF |
258 | #undef ETRAP_PSTATE1 | 232 | #undef ETRAP_PSTATE1 |