Commit 021424a1 authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt

powerpc: Rename and flesh out the facility unavailable exception handler

The exception at 0xf60 is not the TM (Transactional Memory) unavailable
exception, it is the "Facility Unavailable Exception", rename it as
such.

Flesh out the handler to acknowledge the fact that it can be called for
many reasons, one of which is TM being unavailable.

Use STD_EXCEPTION_COMMON() for the exception body, for some reason we
had it open-coded, I've checked the generated code is identical.
Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
CC: <stable@vger.kernel.org> [v3.10]
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent c9f69518
...@@ -341,10 +341,11 @@ vsx_unavailable_pSeries_1: ...@@ -341,10 +341,11 @@ vsx_unavailable_pSeries_1:
EXCEPTION_PROLOG_0(PACA_EXGEN) EXCEPTION_PROLOG_0(PACA_EXGEN)
b vsx_unavailable_pSeries b vsx_unavailable_pSeries
facility_unavailable_trampoline:
. = 0xf60 . = 0xf60
SET_SCRATCH0(r13) SET_SCRATCH0(r13)
EXCEPTION_PROLOG_0(PACA_EXGEN) EXCEPTION_PROLOG_0(PACA_EXGEN)
b tm_unavailable_pSeries b facility_unavailable_pSeries
#ifdef CONFIG_CBE_RAS #ifdef CONFIG_CBE_RAS
STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error)
...@@ -522,7 +523,7 @@ denorm_done: ...@@ -522,7 +523,7 @@ denorm_done:
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20)
STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40)
STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) STD_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable)
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60)
/* /*
...@@ -829,11 +830,11 @@ vsx_unavailable_relon_pSeries_1: ...@@ -829,11 +830,11 @@ vsx_unavailable_relon_pSeries_1:
EXCEPTION_PROLOG_0(PACA_EXGEN) EXCEPTION_PROLOG_0(PACA_EXGEN)
b vsx_unavailable_relon_pSeries b vsx_unavailable_relon_pSeries
tm_unavailable_relon_pSeries_1: facility_unavailable_relon_trampoline:
. = 0x4f60 . = 0x4f60
SET_SCRATCH0(r13) SET_SCRATCH0(r13)
EXCEPTION_PROLOG_0(PACA_EXGEN) EXCEPTION_PROLOG_0(PACA_EXGEN)
b tm_unavailable_relon_pSeries b facility_unavailable_relon_pSeries
STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint)
#ifdef CONFIG_PPC_DENORMALISATION #ifdef CONFIG_PPC_DENORMALISATION
...@@ -1159,15 +1160,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) ...@@ -1159,15 +1160,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
bl .vsx_unavailable_exception bl .vsx_unavailable_exception
b .ret_from_except b .ret_from_except
.align 7 STD_EXCEPTION_COMMON(0xf60, facility_unavailable, .facility_unavailable_exception)
.globl tm_unavailable_common
tm_unavailable_common:
EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN)
bl .save_nvgprs
DISABLE_INTS
addi r3,r1,STACK_FRAME_OVERHEAD
bl .tm_unavailable_exception
b .ret_from_except
.align 7 .align 7
.globl __end_handlers .globl __end_handlers
...@@ -1180,7 +1173,7 @@ __end_handlers: ...@@ -1180,7 +1173,7 @@ __end_handlers:
STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable)
#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
/* /*
......
...@@ -1286,25 +1286,42 @@ void vsx_unavailable_exception(struct pt_regs *regs) ...@@ -1286,25 +1286,42 @@ void vsx_unavailable_exception(struct pt_regs *regs)
die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT);
} }
void tm_unavailable_exception(struct pt_regs *regs) void facility_unavailable_exception(struct pt_regs *regs)
{ {
static char *facility_strings[] = {
"FPU",
"VMX/VSX",
"DSCR",
"PMU SPRs",
"BHRB",
"TM",
"AT",
"EBB",
"TAR",
};
char *facility;
u64 value;
value = mfspr(SPRN_FSCR) >> 56;
/* We restore the interrupt state now */ /* We restore the interrupt state now */
if (!arch_irq_disabled_regs(regs)) if (!arch_irq_disabled_regs(regs))
local_irq_enable(); local_irq_enable();
/* Currently we never expect a TMU exception. Catch if (value < ARRAY_SIZE(facility_strings))
* this and kill the process! facility = facility_strings[value];
*/ else
printk(KERN_EMERG "Unexpected TM unavailable exception at %lx " facility = "unknown";
"(msr %lx)\n",
regs->nip, regs->msr); pr_err("Facility '%s' unavailable, exception at 0x%lx, MSR=%lx\n",
facility, regs->nip, regs->msr);
if (user_mode(regs)) { if (user_mode(regs)) {
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip); _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
return; return;
} }
die("Unexpected TM unavailable exception", regs, SIGABRT); die("Unexpected facility unavailable exception", regs, SIGABRT);
} }
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment