summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorBalbir Singh <bsingharora@gmail.com>2016-11-30 17:45:09 +1100
committerMichael Ellerman <mpe@ellerman.id.au>2016-12-02 13:00:53 +1100
commit93c2ec0f7019a155769d1ecfc08a7de83b47e03d (patch)
treebc6984f73cfff551bfa51a82c2c6aad5a047a402 /arch
parent335967276bb6c9ca6a16e5aa0e61ae5e22ddff6f (diff)
downloadlinux-93c2ec0f7019a155769d1ecfc08a7de83b47e03d.tar.gz
linux-93c2ec0f7019a155769d1ecfc08a7de83b47e03d.tar.bz2
linux-93c2ec0f7019a155769d1ecfc08a7de83b47e03d.zip
powerpc Don't print misleading facility name in facility unavailable exception
The current facility_strings[] are correct when the trap address is 0xf80 (hypervisor facility unavailable). When the trap address is 0xf60 (facility unavailable) IC (Interruption Cause) a.k.a status in the code is undefined for values 0 and 1. Add a check to prevent printing the (misleading) facility name for IC 0 and 1 when we came in via 0xf60. In all cases, print the actual IC value, to avoid any confusion. This hasn't been seen on real hardware, on only qemu which was misreporting an exception. Signed-off-by: Balbir Singh <bsingharora@gmail.com> [mpe: Fix indentation, combine printks(), massage change log] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/traps.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 5faaed2f2144..4239aaf74886 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -1519,7 +1519,8 @@ void facility_unavailable_exception(struct pt_regs *regs)
return;
}
- if ((status < ARRAY_SIZE(facility_strings)) &&
+ if ((hv || status >= 2) &&
+ (status < ARRAY_SIZE(facility_strings)) &&
facility_strings[status])
facility = facility_strings[status];
@@ -1527,9 +1528,8 @@ void facility_unavailable_exception(struct pt_regs *regs)
if (!arch_irq_disabled_regs(regs))
local_irq_enable();
- pr_err_ratelimited(
- "%sFacility '%s' unavailable, exception at 0x%lx, MSR=%lx\n",
- hv ? "Hypervisor " : "", facility, regs->nip, regs->msr);
+ pr_err_ratelimited("%sFacility '%s' unavailable (%d), exception at 0x%lx, MSR=%lx\n",
+ hv ? "Hypervisor " : "", facility, status, regs->nip, regs->msr);
out:
if (user_mode(regs)) {