Go to the documentation of this file. 1 #ifndef _ASM_POWERPC_EXCEPTION_H
2 #define _ASM_POWERPC_EXCEPTION_H
57 #define LOAD_HANDLER(reg, label) \
58 addi reg,reg,(label)-_stext;
64 #define __EXCEPTION_PROLOG_1(area, extra, vec) \
66 std r9,area+EX_R9(r13); \
67 std r10,area+EX_R10(r13); \
68 BEGIN_FTR_SECTION_NESTED(66); \
69 mfspr r10,SPRN_CFAR; \
70 std r10,area+EX_CFAR(r13); \
71 END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \
74 std r11,area+EX_R11(r13); \
75 std r12,area+EX_R12(r13); \
77 std r10,area+EX_R13(r13)
78 #define EXCEPTION_PROLOG_1(area, extra, vec) \
79 __EXCEPTION_PROLOG_1(area, extra, vec)
81 #define __EXCEPTION_PROLOG_PSERIES_1(label, h) \
82 ld r12,PACAKBASE(r13); \
83 ld r10,PACAKMSR(r13); \
84 mfspr r11,SPRN_##h##SRR0; \
85 LOAD_HANDLER(r12,label) \
86 mtspr SPRN_##h##SRR0,r12; \
87 mfspr r12,SPRN_##h##SRR1; \
88 mtspr SPRN_##h##SRR1,r10; \
91 #define EXCEPTION_PROLOG_PSERIES_1(label, h) \
92 __EXCEPTION_PROLOG_PSERIES_1(label, h)
94 #define EXCEPTION_PROLOG_PSERIES(area, label, h, extra, vec) \
95 EXCEPTION_PROLOG_1(area, extra, vec); \
96 EXCEPTION_PROLOG_PSERIES_1(label, h);
98 #define __KVMTEST(n) \
99 lbz r10,HSTATE_IN_GUEST(r13); \
103 #define __KVM_HANDLER(area, h, n) \
105 ld r10,area+EX_R10(r13); \
106 stw r9,HSTATE_SCRATCH1(r13); \
107 ld r9,area+EX_R9(r13); \
108 std r12,HSTATE_SCRATCH0(r13); \
112 #define __KVM_HANDLER_SKIP(area, h, n) \
114 cmpwi r10,KVM_GUEST_MODE_SKIP; \
115 ld r10,area+EX_R10(r13); \
117 stw r9,HSTATE_SCRATCH1(r13); \
118 ld r9,area+EX_R9(r13); \
119 std r12,HSTATE_SCRATCH0(r13); \
121 b kvmppc_interrupt; \
122 89: mtocrf 0x80,r9; \
123 ld r9,area+EX_R9(r13); \
124 b kvmppc_skip_##h##interrupt
126 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
127 #define KVMTEST(n) __KVMTEST(n)
128 #define KVM_HANDLER(area, h, n) __KVM_HANDLER(area, h, n)
129 #define KVM_HANDLER_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n)
133 #define KVM_HANDLER(area, h, n)
134 #define KVM_HANDLER_SKIP(area, h, n)
137 #ifdef CONFIG_KVM_BOOK3S_PR
138 #define KVMTEST_PR(n) __KVMTEST(n)
139 #define KVM_HANDLER_PR(area, h, n) __KVM_HANDLER(area, h, n)
140 #define KVM_HANDLER_PR_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n)
143 #define KVMTEST_PR(n)
144 #define KVM_HANDLER_PR(area, h, n)
145 #define KVM_HANDLER_PR_SKIP(area, h, n)
160 #define EXCEPTION_PROLOG_COMMON(n, area) \
161 andi. r10,r12,MSR_PR; \
163 subi r1,r1,INT_FRAME_SIZE; \
165 ld r1,PACAKSAVE(r13); \
169 sth r1,PACA_TRAP_SAVE(r13); \
170 std r3,area+EX_R3(r13); \
173 3: std r9,_CCR(r1); \
179 ACCOUNT_CPU_USER_ENTRY(r9, r10); \
183 ld r9,area+EX_R9(r13); \
184 ld r10,area+EX_R10(r13); \
187 ld r9,area+EX_R11(r13); \
188 ld r10,area+EX_R12(r13); \
189 ld r11,area+EX_R13(r13); \
193 BEGIN_FTR_SECTION_NESTED(66); \
194 ld r10,area+EX_CFAR(r13); \
195 std r10,ORIG_GPR3(r1); \
196 END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \
197 ld r2,PACATOC(r13); \
202 lbz r10,PACASOFTIRQEN(r13); \
203 mfspr r11,SPRN_XER; \
209 ld r11,exception_marker@toc(r2); \
210 std r10,RESULT(r1); \
211 std r11,STACK_FRAME_OVERHEAD-16(r1); \
217 #define STD_EXCEPTION_PSERIES(loc, vec, label) \
219 .globl label##_pSeries; \
223 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \
224 EXC_STD, KVMTEST_PR, vec)
226 #define STD_EXCEPTION_HV(loc, vec, label) \
232 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \
233 EXC_HV, KVMTEST, vec)
236 #define SOFTEN_VALUE_0x500 PACA_IRQ_EE
237 #define SOFTEN_VALUE_0x502 PACA_IRQ_EE
238 #define SOFTEN_VALUE_0x900 PACA_IRQ_DEC
239 #define SOFTEN_VALUE_0x982 PACA_IRQ_DEC
241 #define __SOFTEN_TEST(h, vec) \
242 lbz r10,PACASOFTIRQEN(r13); \
244 li r10,SOFTEN_VALUE_##vec; \
245 beq masked_##h##interrupt
246 #define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
248 #define SOFTEN_TEST_PR(vec) \
250 _SOFTEN_TEST(EXC_STD, vec)
252 #define SOFTEN_TEST_HV(vec) \
254 _SOFTEN_TEST(EXC_HV, vec)
256 #define SOFTEN_TEST_HV_201(vec) \
258 _SOFTEN_TEST(EXC_STD, vec)
260 #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
263 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
264 EXCEPTION_PROLOG_PSERIES_1(label##_common, h);
265 #define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
266 __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)
268 #define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \
270 .globl label##_pSeries; \
272 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
273 EXC_STD, SOFTEN_TEST_PR)
275 #define MASKABLE_EXCEPTION_HV(loc, vec, label) \
279 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
280 EXC_HV, SOFTEN_TEST_HV)
289 #define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11)
294 #define RUNLATCH_ON \
296 CURRENT_THREAD_INFO(r3, r1); \
297 ld r4,TI_LOCAL_FLAGS(r3); \
298 andi. r0,r4,_TLF_RUNLATCH; \
299 beql ppc64_runlatch_on_trampoline; \
300 END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
302 #define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \
304 .globl label##_common; \
306 EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
308 addi r3,r1,STACK_FRAME_OVERHEAD; \
312 #define STD_EXCEPTION_COMMON(trap, label, hdlr) \
313 EXCEPTION_COMMON(trap, label, hdlr, ret_from_except, \
314 ADD_NVGPRS;DISABLE_INTS)
321 #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \
322 EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \
323 FINISH_NAP;RUNLATCH_ON;DISABLE_INTS)
332 #ifdef CONFIG_PPC_970_NAP
335 CURRENT_THREAD_INFO(r11, r1); \
336 ld r9,TI_LOCAL_FLAGS(r11); \
337 andi. r10,r9,_TLF_NAPPING; \
338 bnel power4_fixup_nap; \
339 END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)