diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/include/asm/exception-64s.h | 65 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_asm.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_book3s_asm.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/cpu_setup_power7.S | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 48 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_rmhandlers.S | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_segment.S | 10 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/exception.S | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/exception.h | 4 |
9 files changed, 86 insertions, 49 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 337b6fa2f8cd..1d98e05be511 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -56,30 +56,37 @@ | |||
56 | #define LOAD_HANDLER(reg, label) \ | 56 | #define LOAD_HANDLER(reg, label) \ |
57 | addi reg,reg,(label)-_stext; /* virt addr of handler ... */ | 57 | addi reg,reg,(label)-_stext; /* virt addr of handler ... */ |
58 | 58 | ||
59 | #define EXCEPTION_PROLOG_1(area) \ | 59 | /* Exception register prefixes */ |
60 | #define EXC_HV H | ||
61 | #define EXC_STD | ||
62 | |||
63 | #define __EXCEPTION_PROLOG_1(area, h) \ | ||
60 | GET_PACA(r13); \ | 64 | GET_PACA(r13); \ |
61 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ | 65 | std r9,area+EX_R9(r13); /* save r9 - r12 */ \ |
62 | std r10,area+EX_R10(r13); \ | 66 | std r10,area+EX_R10(r13); \ |
63 | std r11,area+EX_R11(r13); \ | 67 | std r11,area+EX_R11(r13); \ |
64 | std r12,area+EX_R12(r13); \ | 68 | std r12,area+EX_R12(r13); \ |
65 | mfspr r9,SPRN_SPRG_SCRATCH0; \ | 69 | mfspr r9,SPRN_SPRG_##h##SCRATCH0; \ |
66 | std r9,area+EX_R13(r13); \ | 70 | std r9,area+EX_R13(r13); \ |
67 | mfcr r9 | 71 | mfcr r9 |
72 | #define EXCEPTION_PROLOG_1(area, h) __EXCEPTION_PROLOG_1(area, h) | ||
68 | 73 | ||
69 | #define EXCEPTION_PROLOG_PSERIES_1(label) \ | 74 | #define __EXCEPTION_PROLOG_PSERIES_1(label, h) \ |
70 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ | 75 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ |
71 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ | 76 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ |
72 | mfspr r11,SPRN_SRR0; /* save SRR0 */ \ | 77 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ |
73 | LOAD_HANDLER(r12,label) \ | 78 | LOAD_HANDLER(r12,label) \ |
74 | mtspr SPRN_SRR0,r12; \ | 79 | mtspr SPRN_##h##SRR0,r12; \ |
75 | mfspr r12,SPRN_SRR1; /* and SRR1 */ \ | 80 | mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \ |
76 | mtspr SPRN_SRR1,r10; \ | 81 | mtspr SPRN_##h##SRR1,r10; \ |
77 | rfid; \ | 82 | h##rfid; \ |
78 | b . /* prevent speculative execution */ | 83 | b . /* prevent speculative execution */ |
84 | #define EXCEPTION_PROLOG_PSERIES_1(label, h) \ | ||
85 | __EXCEPTION_PROLOG_PSERIES_1(label, h) | ||
79 | 86 | ||
80 | #define EXCEPTION_PROLOG_PSERIES(area, label) \ | 87 | #define EXCEPTION_PROLOG_PSERIES(area, label, h) \ |
81 | EXCEPTION_PROLOG_1(area); \ | 88 | EXCEPTION_PROLOG_1(area, h); \ |
82 | EXCEPTION_PROLOG_PSERIES_1(label); | 89 | EXCEPTION_PROLOG_PSERIES_1(label, h); |
83 | 90 | ||
84 | /* | 91 | /* |
85 | * The common exception prolog is used for all except a few exceptions | 92 | * The common exception prolog is used for all except a few exceptions |
@@ -150,50 +157,44 @@ label##_pSeries: \ | |||
150 | HMT_MEDIUM; \ | 157 | HMT_MEDIUM; \ |
151 | DO_KVM n; \ | 158 | DO_KVM n; \ |
152 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ | 159 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ |
153 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 160 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_STD) |
154 | 161 | ||
155 | #define HSTD_EXCEPTION_PSERIES(n, label) \ | 162 | #define HSTD_EXCEPTION_PSERIES(n, label) \ |
156 | . = n; \ | 163 | . = n; \ |
157 | .globl label##_pSeries; \ | 164 | .globl label##_pSeries; \ |
158 | label##_pSeries: \ | 165 | label##_pSeries: \ |
159 | HMT_MEDIUM; \ | 166 | HMT_MEDIUM; \ |
160 | mtspr SPRN_SPRG_SCRATCH0,r20; /* save r20 */ \ | 167 | DO_KVM n; \ |
161 | mfspr r20,SPRN_HSRR0; /* copy HSRR0 to SRR0 */ \ | 168 | mtspr SPRN_SPRG_HSCRATCH0,r13;/* save r13 */ \ |
162 | mtspr SPRN_SRR0,r20; \ | 169 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_HV) |
163 | mfspr r20,SPRN_HSRR1; /* copy HSRR0 to SRR0 */ \ | ||
164 | mtspr SPRN_SRR1,r20; \ | ||
165 | mfspr r20,SPRN_SPRG_SCRATCH0; /* restore r20 */ \ | ||
166 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ | ||
167 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | ||
168 | 170 | ||
169 | 171 | ||
170 | #define MASKABLE_EXCEPTION_PSERIES(n, label) \ | 172 | #define __MASKABLE_EXCEPTION_PSERIES(n, label, h) \ |
171 | . = n; \ | ||
172 | .globl label##_pSeries; \ | ||
173 | label##_pSeries: \ | ||
174 | HMT_MEDIUM; \ | 173 | HMT_MEDIUM; \ |
175 | DO_KVM n; \ | 174 | DO_KVM n; \ |
176 | mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ | 175 | mtspr SPRN_SPRG_##h##SCRATCH0,r13; /* save r13 */ \ |
177 | GET_PACA(r13); \ | 176 | GET_PACA(r13); \ |
178 | std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ | 177 | std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ |
179 | std r10,PACA_EXGEN+EX_R10(r13); \ | 178 | std r10,PACA_EXGEN+EX_R10(r13); \ |
180 | lbz r10,PACASOFTIRQEN(r13); \ | 179 | lbz r10,PACASOFTIRQEN(r13); \ |
181 | mfcr r9; \ | 180 | mfcr r9; \ |
182 | cmpwi r10,0; \ | 181 | cmpwi r10,0; \ |
183 | beq masked_interrupt; \ | 182 | beq masked_##h##interrupt; \ |
184 | mfspr r10,SPRN_SPRG_SCRATCH0; \ | 183 | mfspr r10,SPRN_SPRG_##h##SCRATCH0; \ |
185 | std r10,PACA_EXGEN+EX_R13(r13); \ | 184 | std r10,PACA_EXGEN+EX_R13(r13); \ |
186 | std r11,PACA_EXGEN+EX_R11(r13); \ | 185 | std r11,PACA_EXGEN+EX_R11(r13); \ |
187 | std r12,PACA_EXGEN+EX_R12(r13); \ | 186 | std r12,PACA_EXGEN+EX_R12(r13); \ |
188 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ | 187 | ld r12,PACAKBASE(r13); /* get high part of &label */ \ |
189 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ | 188 | ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \ |
190 | mfspr r11,SPRN_SRR0; /* save SRR0 */ \ | 189 | mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ |
191 | LOAD_HANDLER(r12,label##_common) \ | 190 | LOAD_HANDLER(r12,label##_common) \ |
192 | mtspr SPRN_SRR0,r12; \ | 191 | mtspr SPRN_##h##SRR0,r12; \ |
193 | mfspr r12,SPRN_SRR1; /* and SRR1 */ \ | 192 | mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \ |
194 | mtspr SPRN_SRR1,r10; \ | 193 | mtspr SPRN_##h##SRR1,r10; \ |
195 | rfid; \ | 194 | h##rfid; \ |
196 | b . /* prevent speculative execution */ | 195 | b . /* prevent speculative execution */ |
196 | #define MASKABLE_EXCEPTION_PSERIES(n, label, h) \ | ||
197 | __MASKABLE_EXCEPTION_PSERIES(n, label, h) | ||
197 | 198 | ||
198 | #ifdef CONFIG_PPC_ISERIES | 199 | #ifdef CONFIG_PPC_ISERIES |
199 | #define DISABLE_INTS \ | 200 | #define DISABLE_INTS \ |
diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index 5b7504674397..0951b17f4eb5 100644 --- a/arch/powerpc/include/asm/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h | |||
@@ -59,6 +59,7 @@ | |||
59 | #define BOOK3S_INTERRUPT_INST_SEGMENT 0x480 | 59 | #define BOOK3S_INTERRUPT_INST_SEGMENT 0x480 |
60 | #define BOOK3S_INTERRUPT_EXTERNAL 0x500 | 60 | #define BOOK3S_INTERRUPT_EXTERNAL 0x500 |
61 | #define BOOK3S_INTERRUPT_EXTERNAL_LEVEL 0x501 | 61 | #define BOOK3S_INTERRUPT_EXTERNAL_LEVEL 0x501 |
62 | #define BOOK3S_INTERRUPT_EXTERNAL_HV 0x502 | ||
62 | #define BOOK3S_INTERRUPT_ALIGNMENT 0x600 | 63 | #define BOOK3S_INTERRUPT_ALIGNMENT 0x600 |
63 | #define BOOK3S_INTERRUPT_PROGRAM 0x700 | 64 | #define BOOK3S_INTERRUPT_PROGRAM 0x700 |
64 | #define BOOK3S_INTERRUPT_FP_UNAVAIL 0x800 | 65 | #define BOOK3S_INTERRUPT_FP_UNAVAIL 0x800 |
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index 36fdb3aff30b..d5a8a3861635 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
@@ -34,6 +34,7 @@ | |||
34 | (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \ | 34 | (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \ |
35 | (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \ | 35 | (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \ |
36 | (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \ | 36 | (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \ |
37 | (\intno == BOOK3S_INTERRUPT_EXTERNAL_HV) || \ | ||
37 | (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \ | 38 | (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \ |
38 | (\intno == BOOK3S_INTERRUPT_PROGRAM) || \ | 39 | (\intno == BOOK3S_INTERRUPT_PROGRAM) || \ |
39 | (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \ | 40 | (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \ |
diff --git a/arch/powerpc/kernel/cpu_setup_power7.S b/arch/powerpc/kernel/cpu_setup_power7.S index f2b317817c4e..e801ef15d6d0 100644 --- a/arch/powerpc/kernel/cpu_setup_power7.S +++ b/arch/powerpc/kernel/cpu_setup_power7.S | |||
@@ -52,13 +52,14 @@ __init_hvmode_206: | |||
52 | __init_LPCR: | 52 | __init_LPCR: |
53 | /* Setup a sane LPCR: | 53 | /* Setup a sane LPCR: |
54 | * | 54 | * |
55 | * LPES = 0b11 (SRR0/1 used for 0x500) | 55 | * LPES = 0b01 (HSRR0/1 used for 0x500) |
56 | * PECE = 0b111 | 56 | * PECE = 0b111 |
57 | * | 57 | * |
58 | * Other bits untouched for now | 58 | * Other bits untouched for now |
59 | */ | 59 | */ |
60 | mfspr r3,SPRN_LPCR | 60 | mfspr r3,SPRN_LPCR |
61 | ori r3,r3,(LPCR_LPES0|LPCR_LPES1) | 61 | ori r3,r3,(LPCR_LPES0|LPCR_LPES1) |
62 | xori r3,r3, LPCR_LPES0 | ||
62 | ori r3,r3,(LPCR_PECE0|LPCR_PECE1|LPCR_PECE2) | 63 | ori r3,r3,(LPCR_PECE0|LPCR_PECE1|LPCR_PECE2) |
63 | mtspr SPRN_LPCR,r3 | 64 | mtspr SPRN_LPCR,r3 |
64 | isync | 65 | isync |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 6784bf7090f6..17f1d6670635 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -44,7 +44,7 @@ _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 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
47 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 47 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD) |
48 | 48 | ||
49 | . = 0x300 | 49 | . = 0x300 |
50 | .globl data_access_pSeries | 50 | .globl data_access_pSeries |
@@ -71,9 +71,9 @@ BEGIN_FTR_SECTION | |||
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) |
74 | EXCEPTION_PROLOG_PSERIES_1(data_access_common) | 74 | EXCEPTION_PROLOG_PSERIES_1(data_access_common, EXC_STD) |
75 | FTR_SECTION_ELSE | 75 | FTR_SECTION_ELSE |
76 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common) | 76 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD) |
77 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) | 77 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) |
78 | 78 | ||
79 | . = 0x380 | 79 | . = 0x380 |
@@ -147,11 +147,24 @@ instruction_access_slb_pSeries: | |||
147 | bctr | 147 | bctr |
148 | #endif | 148 | #endif |
149 | 149 | ||
150 | MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt) | 150 | . = 0x500; |
151 | .globl hardware_interrupt_pSeries | ||
152 | hardware_interrupt_pSeries: | ||
153 | BEGIN_FTR_SECTION | ||
154 | MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD) | ||
155 | FTR_SECTION_ELSE | ||
156 | MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV) | ||
157 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_HVMODE_206) | ||
158 | |||
151 | STD_EXCEPTION_PSERIES(0x600, alignment) | 159 | STD_EXCEPTION_PSERIES(0x600, alignment) |
152 | STD_EXCEPTION_PSERIES(0x700, program_check) | 160 | STD_EXCEPTION_PSERIES(0x700, program_check) |
153 | STD_EXCEPTION_PSERIES(0x800, fp_unavailable) | 161 | STD_EXCEPTION_PSERIES(0x800, fp_unavailable) |
154 | MASKABLE_EXCEPTION_PSERIES(0x900, decrementer) | 162 | |
163 | . = 0x900; | ||
164 | .globl decrementer_pSeries | ||
165 | decrementer_pSeries: | ||
166 | MASKABLE_EXCEPTION_PSERIES(0x900, decrementer, EXC_STD) | ||
167 | |||
155 | STD_EXCEPTION_PSERIES(0xa00, trap_0a) | 168 | STD_EXCEPTION_PSERIES(0xa00, trap_0a) |
156 | STD_EXCEPTION_PSERIES(0xb00, trap_0b) | 169 | STD_EXCEPTION_PSERIES(0xb00, trap_0b) |
157 | 170 | ||
@@ -207,15 +220,15 @@ vsx_unavailable_pSeries_1: | |||
207 | b vsx_unavailable_pSeries | 220 | b vsx_unavailable_pSeries |
208 | 221 | ||
209 | #ifdef CONFIG_CBE_RAS | 222 | #ifdef CONFIG_CBE_RAS |
210 | HSTD_EXCEPTION_PSERIES(0x1200, cbe_system_error) | 223 | HSTD_EXCEPTION_PSERIES(0x1202, cbe_system_error) |
211 | #endif /* CONFIG_CBE_RAS */ | 224 | #endif /* CONFIG_CBE_RAS */ |
212 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) | 225 | STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) |
213 | #ifdef CONFIG_CBE_RAS | 226 | #ifdef CONFIG_CBE_RAS |
214 | HSTD_EXCEPTION_PSERIES(0x1600, cbe_maintenance) | 227 | HSTD_EXCEPTION_PSERIES(0x1602, cbe_maintenance) |
215 | #endif /* CONFIG_CBE_RAS */ | 228 | #endif /* CONFIG_CBE_RAS */ |
216 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) | 229 | STD_EXCEPTION_PSERIES(0x1700, altivec_assist) |
217 | #ifdef CONFIG_CBE_RAS | 230 | #ifdef CONFIG_CBE_RAS |
218 | HSTD_EXCEPTION_PSERIES(0x1800, cbe_thermal) | 231 | HSTD_EXCEPTION_PSERIES(0x1802, cbe_thermal) |
219 | #endif /* CONFIG_CBE_RAS */ | 232 | #endif /* CONFIG_CBE_RAS */ |
220 | 233 | ||
221 | . = 0x3000 | 234 | . = 0x3000 |
@@ -244,13 +257,26 @@ masked_interrupt: | |||
244 | rfid | 257 | rfid |
245 | b . | 258 | b . |
246 | 259 | ||
260 | masked_Hinterrupt: | ||
261 | stb r10,PACAHARDIRQEN(r13) | ||
262 | mtcrf 0x80,r9 | ||
263 | ld r9,PACA_EXGEN+EX_R9(r13) | ||
264 | mfspr r10,SPRN_HSRR1 | ||
265 | rldicl r10,r10,48,1 /* clear MSR_EE */ | ||
266 | rotldi r10,r10,16 | ||
267 | mtspr SPRN_HSRR1,r10 | ||
268 | ld r10,PACA_EXGEN+EX_R10(r13) | ||
269 | mfspr r13,SPRN_SPRG_HSCRATCH0 | ||
270 | hrfid | ||
271 | b . | ||
272 | |||
247 | .align 7 | 273 | .align 7 |
248 | do_stab_bolted_pSeries: | 274 | do_stab_bolted_pSeries: |
249 | std r11,PACA_EXSLB+EX_R11(r13) | 275 | std r11,PACA_EXSLB+EX_R11(r13) |
250 | std r12,PACA_EXSLB+EX_R12(r13) | 276 | std r12,PACA_EXSLB+EX_R12(r13) |
251 | mfspr r10,SPRN_SPRG_SCRATCH0 | 277 | mfspr r10,SPRN_SPRG_SCRATCH0 |
252 | std r10,PACA_EXSLB+EX_R13(r13) | 278 | std r10,PACA_EXSLB+EX_R13(r13) |
253 | EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted) | 279 | EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD) |
254 | 280 | ||
255 | #ifdef CONFIG_PPC_PSERIES | 281 | #ifdef CONFIG_PPC_PSERIES |
256 | /* | 282 | /* |
@@ -261,14 +287,14 @@ do_stab_bolted_pSeries: | |||
261 | system_reset_fwnmi: | 287 | system_reset_fwnmi: |
262 | HMT_MEDIUM | 288 | HMT_MEDIUM |
263 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ | 289 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
264 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) | 290 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD) |
265 | 291 | ||
266 | .globl machine_check_fwnmi | 292 | .globl machine_check_fwnmi |
267 | .align 7 | 293 | .align 7 |
268 | machine_check_fwnmi: | 294 | machine_check_fwnmi: |
269 | HMT_MEDIUM | 295 | HMT_MEDIUM |
270 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ | 296 | mtspr SPRN_SPRG_SCRATCH0,r13 /* save r13 */ |
271 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 297 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD) |
272 | 298 | ||
273 | #endif /* CONFIG_PPC_PSERIES */ | 299 | #endif /* CONFIG_PPC_PSERIES */ |
274 | 300 | ||
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S index b0ff5ff76e25..046e1f3d4432 100644 --- a/arch/powerpc/kvm/book3s_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_rmhandlers.S | |||
@@ -112,6 +112,7 @@ INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_MACHINE_CHECK | |||
112 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE | 112 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_DATA_STORAGE |
113 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE | 113 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_INST_STORAGE |
114 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL | 114 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL |
115 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_EXTERNAL_HV | ||
115 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT | 116 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_ALIGNMENT |
116 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM | 117 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_PROGRAM |
117 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_FP_UNAVAIL | 118 | INTERRUPT_TRAMPOLINE BOOK3S_INTERRUPT_FP_UNAVAIL |
diff --git a/arch/powerpc/kvm/book3s_segment.S b/arch/powerpc/kvm/book3s_segment.S index 7c52ed0b7051..d842795d0f23 100644 --- a/arch/powerpc/kvm/book3s_segment.S +++ b/arch/powerpc/kvm/book3s_segment.S | |||
@@ -155,9 +155,15 @@ kvmppc_handler_trampoline_exit: | |||
155 | PPC_LL r2, (SHADOW_VCPU_OFF + SVCPU_HOST_R2)(r13) | 155 | PPC_LL r2, (SHADOW_VCPU_OFF + SVCPU_HOST_R2)(r13) |
156 | 156 | ||
157 | /* Save guest PC and MSR */ | 157 | /* Save guest PC and MSR */ |
158 | mfsrr0 r3 | 158 | andi. r0,r12,0x2 |
159 | beq 1f | ||
160 | mfspr r3,SPRN_HSRR0 | ||
161 | mfspr r4,SPRN_HSRR1 | ||
162 | andi. r12,r12,0x3ffd | ||
163 | b 2f | ||
164 | 1: mfsrr0 r3 | ||
159 | mfsrr1 r4 | 165 | mfsrr1 r4 |
160 | 166 | 2: | |
161 | PPC_STL r3, (SHADOW_VCPU_OFF + SVCPU_PC)(r13) | 167 | PPC_STL r3, (SHADOW_VCPU_OFF + SVCPU_PC)(r13) |
162 | PPC_STL r4, (SHADOW_VCPU_OFF + SVCPU_SHADOW_SRR1)(r13) | 168 | PPC_STL r4, (SHADOW_VCPU_OFF + SVCPU_SHADOW_SRR1)(r13) |
163 | 169 | ||
diff --git a/arch/powerpc/platforms/iseries/exception.S b/arch/powerpc/platforms/iseries/exception.S index 32a56c6dfa72..f7a487231a11 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 |
157 | FTR_SECTION_ELSE | 157 | FTR_SECTION_ELSE |
158 | EXCEPTION_PROLOG_1(PACA_EXGEN) | 158 | EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD) |
159 | EXCEPTION_PROLOG_ISERIES_1 | 159 | EXCEPTION_PROLOG_ISERIES_1 |
160 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) | 160 | ALT_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 bae3fba5ad8e..57127d805fe3 100644 --- a/arch/powerpc/platforms/iseries/exception.h +++ b/arch/powerpc/platforms/iseries/exception.h | |||
@@ -39,7 +39,7 @@ | |||
39 | label##_iSeries: \ | 39 | label##_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); \ | 42 | EXCEPTION_PROLOG_1(area, EXC_STD); \ |
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: \ | |||
48 | label##_iSeries: \ | 48 | label##_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); \ | 51 | EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD); \ |
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; \ |