aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/exception-64s.h15
-rw-r--r--arch/powerpc/include/asm/reg.h14
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S26
-rw-r--r--arch/powerpc/kvm/book3s_rmhandlers.S6
-rw-r--r--arch/powerpc/kvm/book3s_segment.S2
-rw-r--r--arch/powerpc/platforms/iseries/exception.S2
-rw-r--r--arch/powerpc/platforms/iseries/exception.h4
7 files changed, 41 insertions, 28 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index fb5b0af30fcf..d6b4849df9b1 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -60,16 +60,15 @@
60#define EXC_HV H 60#define EXC_HV H
61#define EXC_STD 61#define EXC_STD
62 62
63#define __EXCEPTION_PROLOG_1(area, h) \ 63#define EXCEPTION_PROLOG_1(area) \
64 GET_PACA(r13); \ 64 GET_PACA(r13); \
65 std r9,area+EX_R9(r13); /* save r9 - r12 */ \ 65 std r9,area+EX_R9(r13); /* save r9 - r12 */ \
66 std r10,area+EX_R10(r13); \ 66 std r10,area+EX_R10(r13); \
67 std r11,area+EX_R11(r13); \ 67 std r11,area+EX_R11(r13); \
68 std r12,area+EX_R12(r13); \ 68 std r12,area+EX_R12(r13); \
69 mfspr r9,SPRN_SPRG_##h##SCRATCH0; \ 69 GET_SCRATCH0(r9); \
70 std r9,area+EX_R13(r13); \ 70 std r9,area+EX_R13(r13); \
71 mfcr r9 71 mfcr r9
72#define EXCEPTION_PROLOG_1(area, h) __EXCEPTION_PROLOG_1(area, h)
73 72
74#define __EXCEPTION_PROLOG_PSERIES_1(label, h) \ 73#define __EXCEPTION_PROLOG_PSERIES_1(label, h) \
75 ld r12,PACAKBASE(r13); /* get high part of &label */ \ 74 ld r12,PACAKBASE(r13); /* get high part of &label */ \
@@ -85,7 +84,7 @@
85 __EXCEPTION_PROLOG_PSERIES_1(label, h) 84 __EXCEPTION_PROLOG_PSERIES_1(label, h)
86 85
87#define EXCEPTION_PROLOG_PSERIES(area, label, h) \ 86#define EXCEPTION_PROLOG_PSERIES(area, label, h) \
88 EXCEPTION_PROLOG_1(area, h); \ 87 EXCEPTION_PROLOG_1(area); \
89 EXCEPTION_PROLOG_PSERIES_1(label, h); 88 EXCEPTION_PROLOG_PSERIES_1(label, h);
90 89
91/* 90/*
@@ -156,7 +155,7 @@
156label##_pSeries: \ 155label##_pSeries: \
157 HMT_MEDIUM; \ 156 HMT_MEDIUM; \
158 DO_KVM vec; \ 157 DO_KVM vec; \
159 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ 158 SET_SCRATCH0(r13); /* save r13 */ \
160 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_STD) 159 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_STD)
161 160
162#define STD_EXCEPTION_HV(loc, vec, label) \ 161#define STD_EXCEPTION_HV(loc, vec, label) \
@@ -165,13 +164,13 @@ label##_pSeries: \
165label##_hv: \ 164label##_hv: \
166 HMT_MEDIUM; \ 165 HMT_MEDIUM; \
167 DO_KVM vec; \ 166 DO_KVM vec; \
168 mtspr SPRN_SPRG_HSCRATCH0,r13;/* save r13 */ \ 167 SET_SCRATCH0(r13); /* save r13 */ \
169 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_HV) 168 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_HV)
170 169
171#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h) \ 170#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h) \
172 HMT_MEDIUM; \ 171 HMT_MEDIUM; \
173 DO_KVM vec; \ 172 DO_KVM vec; \
174 mtspr SPRN_SPRG_##h##SCRATCH0,r13; /* save r13 */ \ 173 SET_SCRATCH0(r13); /* save r13 */ \
175 GET_PACA(r13); \ 174 GET_PACA(r13); \
176 std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ 175 std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \
177 std r10,PACA_EXGEN+EX_R10(r13); \ 176 std r10,PACA_EXGEN+EX_R10(r13); \
@@ -179,7 +178,7 @@ label##_hv: \
179 mfcr r9; \ 178 mfcr r9; \
180 cmpwi r10,0; \ 179 cmpwi r10,0; \
181 beq masked_##h##interrupt; \ 180 beq masked_##h##interrupt; \
182 mfspr r10,SPRN_SPRG_##h##SCRATCH0; \ 181 GET_SCRATCH0(r10); \
183 std r10,PACA_EXGEN+EX_R13(r13); \ 182 std r10,PACA_EXGEN+EX_R13(r13); \
184 std r11,PACA_EXGEN+EX_R11(r13); \ 183 std r11,PACA_EXGEN+EX_R11(r13); \
185 std r12,PACA_EXGEN+EX_R12(r13); \ 184 std r12,PACA_EXGEN+EX_R12(r13); \
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 13429a0eba09..76d7d5fea5be 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -802,6 +802,20 @@
802 FTR_SECTION_ELSE_NESTED(66); \ 802 FTR_SECTION_ELSE_NESTED(66); \
803 mtspr SPRN_SPRG_HPACA,rX; \ 803 mtspr SPRN_SPRG_HPACA,rX; \
804 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66) 804 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
805
806#define GET_SCRATCH0(rX) \
807 BEGIN_FTR_SECTION_NESTED(66); \
808 mfspr rX,SPRN_SPRG_SCRATCH0; \
809 FTR_SECTION_ELSE_NESTED(66); \
810 mfspr rX,SPRN_SPRG_HSCRATCH0; \
811 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
812
813#define SET_SCRATCH0(rX) \
814 BEGIN_FTR_SECTION_NESTED(66); \
815 mtspr SPRN_SPRG_SCRATCH0,rX; \
816 FTR_SECTION_ELSE_NESTED(66); \
817 mtspr SPRN_SPRG_HSCRATCH0,rX; \
818 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
805#endif 819#endif
806 820
807#ifdef CONFIG_PPC_BOOK3E_64 821#ifdef CONFIG_PPC_BOOK3E_64
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 805e20657868..e513c1d35b2a 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -43,7 +43,7 @@ __start_interrupts:
43_machine_check_pSeries: 43_machine_check_pSeries:
44 HMT_MEDIUM 44 HMT_MEDIUM
45 DO_KVM 0x200 45 DO_KVM 0x200
46 mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ 46 SET_SCRATCH0(r13)
47 EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD) 47 EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD)
48 48
49 . = 0x300 49 . = 0x300
@@ -51,7 +51,7 @@ _machine_check_pSeries:
51data_access_pSeries: 51data_access_pSeries:
52 HMT_MEDIUM 52 HMT_MEDIUM
53 DO_KVM 0x300 53 DO_KVM 0x300
54 mtspr SPRN_SPRG_SCRATCH0,r13 54 SET_SCRATCH0(r13)
55BEGIN_FTR_SECTION 55BEGIN_FTR_SECTION
56 GET_PACA(r13) 56 GET_PACA(r13)
57 std r9,PACA_EXSLB+EX_R9(r13) 57 std r9,PACA_EXSLB+EX_R9(r13)
@@ -67,7 +67,7 @@ BEGIN_FTR_SECTION
67 std r11,PACA_EXGEN+EX_R11(r13) 67 std r11,PACA_EXGEN+EX_R11(r13)
68 ld r11,PACA_EXSLB+EX_R9(r13) 68 ld r11,PACA_EXSLB+EX_R9(r13)
69 std r12,PACA_EXGEN+EX_R12(r13) 69 std r12,PACA_EXGEN+EX_R12(r13)
70 mfspr r12,SPRN_SPRG_SCRATCH0 70 GET_SCRATCH0(r12)
71 std r10,PACA_EXGEN+EX_R10(r13) 71 std r10,PACA_EXGEN+EX_R10(r13)
72 std r11,PACA_EXGEN+EX_R9(r13) 72 std r11,PACA_EXGEN+EX_R9(r13)
73 std r12,PACA_EXGEN+EX_R13(r13) 73 std r12,PACA_EXGEN+EX_R13(r13)
@@ -81,7 +81,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB)
81data_access_slb_pSeries: 81data_access_slb_pSeries:
82 HMT_MEDIUM 82 HMT_MEDIUM
83 DO_KVM 0x380 83 DO_KVM 0x380
84 mtspr SPRN_SPRG_SCRATCH0,r13 84 SET_SCRATCH0(r13)
85 GET_PACA(r13) 85 GET_PACA(r13)
86 std r3,PACA_EXSLB+EX_R3(r13) 86 std r3,PACA_EXSLB+EX_R3(r13)
87 mfspr r3,SPRN_DAR 87 mfspr r3,SPRN_DAR
@@ -95,7 +95,7 @@ data_access_slb_pSeries:
95 std r10,PACA_EXSLB+EX_R10(r13) 95 std r10,PACA_EXSLB+EX_R10(r13)
96 std r11,PACA_EXSLB+EX_R11(r13) 96 std r11,PACA_EXSLB+EX_R11(r13)
97 std r12,PACA_EXSLB+EX_R12(r13) 97 std r12,PACA_EXSLB+EX_R12(r13)
98 mfspr r10,SPRN_SPRG_SCRATCH0 98 GET_SCRATCH0(r10)
99 std r10,PACA_EXSLB+EX_R13(r13) 99 std r10,PACA_EXSLB+EX_R13(r13)
100 mfspr r12,SPRN_SRR1 /* and SRR1 */ 100 mfspr r12,SPRN_SRR1 /* and SRR1 */
101#ifndef CONFIG_RELOCATABLE 101#ifndef CONFIG_RELOCATABLE
@@ -120,7 +120,7 @@ data_access_slb_pSeries:
120instruction_access_slb_pSeries: 120instruction_access_slb_pSeries:
121 HMT_MEDIUM 121 HMT_MEDIUM
122 DO_KVM 0x480 122 DO_KVM 0x480
123 mtspr SPRN_SPRG_SCRATCH0,r13 123 SET_SCRATCH0(r13)
124 GET_PACA(r13) 124 GET_PACA(r13)
125 std r3,PACA_EXSLB+EX_R3(r13) 125 std r3,PACA_EXSLB+EX_R3(r13)
126 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 126 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
@@ -134,7 +134,7 @@ instruction_access_slb_pSeries:
134 std r10,PACA_EXSLB+EX_R10(r13) 134 std r10,PACA_EXSLB+EX_R10(r13)
135 std r11,PACA_EXSLB+EX_R11(r13) 135 std r11,PACA_EXSLB+EX_R11(r13)
136 std r12,PACA_EXSLB+EX_R12(r13) 136 std r12,PACA_EXSLB+EX_R12(r13)
137 mfspr r10,SPRN_SPRG_SCRATCH0 137 GET_SCRATCH0(r10)
138 std r10,PACA_EXSLB+EX_R13(r13) 138 std r10,PACA_EXSLB+EX_R13(r13)
139 mfspr r12,SPRN_SRR1 /* and SRR1 */ 139 mfspr r12,SPRN_SRR1 /* and SRR1 */
140#ifndef CONFIG_RELOCATABLE 140#ifndef CONFIG_RELOCATABLE
@@ -272,7 +272,7 @@ masked_interrupt:
272 rotldi r10,r10,16 272 rotldi r10,r10,16
273 mtspr SPRN_SRR1,r10 273 mtspr SPRN_SRR1,r10
274 ld r10,PACA_EXGEN+EX_R10(r13) 274 ld r10,PACA_EXGEN+EX_R10(r13)
275 mfspr r13,SPRN_SPRG_SCRATCH0 275 GET_SCRATCH0(r13)
276 rfid 276 rfid
277 b . 277 b .
278 278
@@ -285,7 +285,7 @@ masked_Hinterrupt:
285 rotldi r10,r10,16 285 rotldi r10,r10,16
286 mtspr SPRN_HSRR1,r10 286 mtspr SPRN_HSRR1,r10
287 ld r10,PACA_EXGEN+EX_R10(r13) 287 ld r10,PACA_EXGEN+EX_R10(r13)
288 mfspr r13,SPRN_SPRG_HSCRATCH0 288 GET_SCRATCH0(r13)
289 hrfid 289 hrfid
290 b . 290 b .
291 291
@@ -293,7 +293,7 @@ masked_Hinterrupt:
293do_stab_bolted_pSeries: 293do_stab_bolted_pSeries:
294 std r11,PACA_EXSLB+EX_R11(r13) 294 std r11,PACA_EXSLB+EX_R11(r13)
295 std r12,PACA_EXSLB+EX_R12(r13) 295 std r12,PACA_EXSLB+EX_R12(r13)
296 mfspr r10,SPRN_SPRG_SCRATCH0 296 GET_SCRATCH0(r10)
297 std r10,PACA_EXSLB+EX_R13(r13) 297 std r10,PACA_EXSLB+EX_R13(r13)
298 EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD) 298 EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD)
299 299
@@ -305,14 +305,14 @@ do_stab_bolted_pSeries:
305 .align 7 305 .align 7
306system_reset_fwnmi: 306system_reset_fwnmi:
307 HMT_MEDIUM 307 HMT_MEDIUM
308 mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ 308 SET_SCRATCH0(r13) /* save r13 */
309 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD) 309 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD)
310 310
311 .globl machine_check_fwnmi 311 .globl machine_check_fwnmi
312 .align 7 312 .align 7
313machine_check_fwnmi: 313machine_check_fwnmi:
314 HMT_MEDIUM 314 HMT_MEDIUM
315 mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ 315 SET_SCRATCH0(r13) /* save r13 */
316 EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD) 316 EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD)
317 317
318#endif /* CONFIG_PPC_PSERIES */ 318#endif /* CONFIG_PPC_PSERIES */
@@ -327,7 +327,7 @@ slb_miss_user_pseries:
327 std r10,PACA_EXGEN+EX_R10(r13) 327 std r10,PACA_EXGEN+EX_R10(r13)
328 std r11,PACA_EXGEN+EX_R11(r13) 328 std r11,PACA_EXGEN+EX_R11(r13)
329 std r12,PACA_EXGEN+EX_R12(r13) 329 std r12,PACA_EXGEN+EX_R12(r13)
330 mfspr r10,SPRG_SCRATCH0 330 GET_SCRATCH0(r10)
331 ld r11,PACA_EXSLB+EX_R9(r13) 331 ld r11,PACA_EXSLB+EX_R9(r13)
332 ld r12,PACA_EXSLB+EX_R3(r13) 332 ld r12,PACA_EXSLB+EX_R3(r13)
333 std r10,PACA_EXGEN+EX_R13(r13) 333 std r10,PACA_EXGEN+EX_R13(r13)
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S
index 046e1f3d4432..ae99af66ca34 100644
--- a/arch/powerpc/kvm/book3s_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_rmhandlers.S
@@ -70,7 +70,7 @@
70.global kvmppc_trampoline_\intno 70.global kvmppc_trampoline_\intno
71kvmppc_trampoline_\intno: 71kvmppc_trampoline_\intno:
72 72
73 mtspr SPRN_SPRG_SCRATCH0, r13 /* Save r13 */ 73 SET_SCRATCH0(r13) /* Save r13 */
74 74
75 /* 75 /*
76 * First thing to do is to find out if we're coming 76 * First thing to do is to find out if we're coming
@@ -89,7 +89,7 @@ kvmppc_trampoline_\intno:
89 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13) 89 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
90 mtcr r12 90 mtcr r12
91 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13) 91 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
92 mfspr r13, SPRN_SPRG_SCRATCH0 /* r13 = original r13 */ 92 GET_SCRATCH0(r13) /* r13 = original r13 */
93 b kvmppc_resume_\intno /* Get back original handler */ 93 b kvmppc_resume_\intno /* Get back original handler */
94 94
95 /* Now we know we're handling a KVM guest */ 95 /* Now we know we're handling a KVM guest */
@@ -157,7 +157,7 @@ kvmppc_handler_skip_ins:
157 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13) 157 lwz r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
158 mtcr r12 158 mtcr r12
159 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13) 159 PPC_LL r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
160 mfspr r13, SPRN_SPRG_SCRATCH0 160 GET_SCRATCH0(r13)
161 161
162 /* And get back into the code */ 162 /* And get back into the code */
163 RFI 163 RFI
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S
index d842795d0f23..451264274b8c 100644
--- a/arch/powerpc/kvm/book3s_segment.S
+++ b/arch/powerpc/kvm/book3s_segment.S
@@ -168,7 +168,7 @@ kvmppc_handler_trampoline_exit:
168 PPC_STL r4, (SHADOW_VCPU_OFF + SVCPU_SHADOW_SRR1)(r13) 168 PPC_STL r4, (SHADOW_VCPU_OFF + SVCPU_SHADOW_SRR1)(r13)
169 169
170 /* Get scratch'ed off registers */ 170 /* Get scratch'ed off registers */
171 mfspr r9, SPRN_SPRG_SCRATCH0 171 GET_SCRATCH0(r9)
172 PPC_LL r8, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13) 172 PPC_LL r8, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
173 lwz r7, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13) 173 lwz r7, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
174 174
diff --git a/arch/powerpc/platforms/iseries/exception.S b/arch/powerpc/platforms/iseries/exception.S
index f7a487231a11..32a56c6dfa72 100644
--- a/arch/powerpc/platforms/iseries/exception.S
+++ b/arch/powerpc/platforms/iseries/exception.S
@@ -155,7 +155,7 @@ BEGIN_FTR_SECTION
155 std r12,PACA_EXGEN+EX_R13(r13) 155 std r12,PACA_EXGEN+EX_R13(r13)
156 EXCEPTION_PROLOG_ISERIES_1 156 EXCEPTION_PROLOG_ISERIES_1
157FTR_SECTION_ELSE 157FTR_SECTION_ELSE
158 EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD) 158 EXCEPTION_PROLOG_1(PACA_EXGEN)
159 EXCEPTION_PROLOG_ISERIES_1 159 EXCEPTION_PROLOG_ISERIES_1
160ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) 160ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB)
161 b data_access_common 161 b data_access_common
diff --git a/arch/powerpc/platforms/iseries/exception.h b/arch/powerpc/platforms/iseries/exception.h
index 57127d805fe3..bae3fba5ad8e 100644
--- a/arch/powerpc/platforms/iseries/exception.h
+++ b/arch/powerpc/platforms/iseries/exception.h
@@ -39,7 +39,7 @@
39label##_iSeries: \ 39label##_iSeries: \
40 HMT_MEDIUM; \ 40 HMT_MEDIUM; \
41 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ 41 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \
42 EXCEPTION_PROLOG_1(area, EXC_STD); \ 42 EXCEPTION_PROLOG_1(area); \
43 EXCEPTION_PROLOG_ISERIES_1; \ 43 EXCEPTION_PROLOG_ISERIES_1; \
44 b label##_common 44 b label##_common
45 45
@@ -48,7 +48,7 @@ label##_iSeries: \
48label##_iSeries: \ 48label##_iSeries: \
49 HMT_MEDIUM; \ 49 HMT_MEDIUM; \
50 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ 50 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \
51 EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD); \ 51 EXCEPTION_PROLOG_1(PACA_EXGEN); \
52 lbz r10,PACASOFTIRQEN(r13); \ 52 lbz r10,PACASOFTIRQEN(r13); \
53 cmpwi 0,r10,0; \ 53 cmpwi 0,r10,0; \
54 beq- label##_iSeries_masked; \ 54 beq- label##_iSeries_masked; \