diff options
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 23 | ||||
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 21 |
2 files changed, 44 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index b9bcf21dbb11..c6b88c1f3ebd 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -336,6 +336,11 @@ vsx_unavailable_pSeries_1: | |||
| 336 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 336 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
| 337 | b vsx_unavailable_pSeries | 337 | b vsx_unavailable_pSeries |
| 338 | 338 | ||
| 339 | . = 0xf60 | ||
| 340 | SET_SCRATCH0(r13) | ||
| 341 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
| 342 | b tm_unavailable_pSeries | ||
| 343 | |||
| 339 | #ifdef CONFIG_CBE_RAS | 344 | #ifdef CONFIG_CBE_RAS |
| 340 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) | 345 | STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) |
| 341 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) | 346 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) |
| @@ -550,6 +555,8 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | |||
| 550 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) | 555 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) |
| 551 | STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) | 556 | STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) |
| 552 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) | 557 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) |
| 558 | STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | ||
| 559 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) | ||
| 553 | 560 | ||
| 554 | /* | 561 | /* |
| 555 | * An interrupt came in while soft-disabled. We set paca->irq_happened, then: | 562 | * An interrupt came in while soft-disabled. We set paca->irq_happened, then: |
| @@ -852,6 +859,12 @@ vsx_unavailable_relon_pSeries_1: | |||
| 852 | EXCEPTION_PROLOG_0(PACA_EXGEN) | 859 | EXCEPTION_PROLOG_0(PACA_EXGEN) |
| 853 | b vsx_unavailable_relon_pSeries | 860 | b vsx_unavailable_relon_pSeries |
| 854 | 861 | ||
| 862 | tm_unavailable_relon_pSeries_1: | ||
| 863 | . = 0x4f60 | ||
| 864 | SET_SCRATCH0(r13) | ||
| 865 | EXCEPTION_PROLOG_0(PACA_EXGEN) | ||
| 866 | b tm_unavailable_relon_pSeries | ||
| 867 | |||
| 855 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) | 868 | STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) |
| 856 | #ifdef CONFIG_PPC_DENORMALISATION | 869 | #ifdef CONFIG_PPC_DENORMALISATION |
| 857 | . = 0x5500 | 870 | . = 0x5500 |
| @@ -1202,6 +1215,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) | |||
| 1202 | b .ret_from_except | 1215 | b .ret_from_except |
| 1203 | 1216 | ||
| 1204 | .align 7 | 1217 | .align 7 |
| 1218 | .globl tm_unavailable_common | ||
| 1219 | tm_unavailable_common: | ||
| 1220 | EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN) | ||
| 1221 | bl .save_nvgprs | ||
| 1222 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
| 1223 | bl .tm_unavailable_exception | ||
| 1224 | b .ret_from_except | ||
| 1225 | |||
| 1226 | .align 7 | ||
| 1205 | .globl __end_handlers | 1227 | .globl __end_handlers |
| 1206 | __end_handlers: | 1228 | __end_handlers: |
| 1207 | 1229 | ||
| @@ -1220,6 +1242,7 @@ __end_handlers: | |||
| 1220 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) | 1242 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) |
| 1221 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) | 1243 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) |
| 1222 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) | 1244 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) |
| 1245 | STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) | ||
| 1223 | 1246 | ||
| 1224 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) | 1247 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) |
| 1225 | /* | 1248 | /* |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index bd5de5deaf51..f829e05d8b1b 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -1168,6 +1168,27 @@ void vsx_unavailable_exception(struct pt_regs *regs) | |||
| 1168 | die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); | 1168 | die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); |
| 1169 | } | 1169 | } |
| 1170 | 1170 | ||
| 1171 | void tm_unavailable_exception(struct pt_regs *regs) | ||
| 1172 | { | ||
| 1173 | /* We restore the interrupt state now */ | ||
| 1174 | if (!arch_irq_disabled_regs(regs)) | ||
| 1175 | local_irq_enable(); | ||
| 1176 | |||
| 1177 | /* Currently we never expect a TMU exception. Catch | ||
| 1178 | * this and kill the process! | ||
| 1179 | */ | ||
| 1180 | printk(KERN_EMERG "Unexpected TM unavailable exception at %lx " | ||
| 1181 | "(msr %lx)\n", | ||
| 1182 | regs->nip, regs->msr); | ||
| 1183 | |||
| 1184 | if (user_mode(regs)) { | ||
| 1185 | _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); | ||
| 1186 | return; | ||
| 1187 | } | ||
| 1188 | |||
| 1189 | die("Unexpected TM unavailable exception", regs, SIGABRT); | ||
| 1190 | } | ||
| 1191 | |||
| 1171 | void performance_monitor_exception(struct pt_regs *regs) | 1192 | void performance_monitor_exception(struct pt_regs *regs) |
| 1172 | { | 1193 | { |
| 1173 | __get_cpu_var(irq_stat).pmu_irqs++; | 1194 | __get_cpu_var(irq_stat).pmu_irqs++; |
