[This time from a good email address :-)] Hi Mikey, On Mon, 5 Aug 2013 17:28:06 +1000 Michael Neuling wrote: > > +++ b/arch/powerpc/kernel/traps.c > @@ -1296,43 +1294,56 @@ void vsx_unavailable_exception(struct pt_regs *regs) > die("Unrecoverable VSX Unavailable Exception", regs, SIGABRT); > } > > +#ifdef CONFIG_PPC64 > void facility_unavailable_exception(struct pt_regs *regs) > { > static char *facility_strings[] = { > - "FPU", > - "VMX/VSX", > - "DSCR", > - "PMU SPRs", > - "BHRB", > - "TM", > - "AT", > - "EBB", > - "TAR", > + [FSCR_FP_LG] = "FPU", > + [FSCR_VECVSX_LG] = "VMX/VSX", > + [FSCR_DSCR_LG] = "DSCR", > + [FSCR_PM_LG] = "PMU SPRs", > + [FSCR_BHRB_LG] = "BHRB", > + [FSCR_TM_LG] = "TM", > + [FSCR_EBB_LG] = "EBB", > + [FSCR_TAR_LG] = "TAR", I assume that you intentionally dropped "AT". > }; > - char *facility, *prefix; > + char *facility; > u64 value; > + u8 status; > + bool hv; > > if (regs->trap == 0xf60) { > value = mfspr(SPRN_FSCR); > - prefix = ""; > + hv = false; > } else { > value = mfspr(SPRN_HFSCR); > - prefix = "Hypervisor "; > + hv = true; > } Maybe: hv = regs->trap == 0xf60; if (hv) value = mfspr(SPRN_HFSCR); else value = mfspr(SPRN_HFSCR); or value = mfspr(hv ? SPRN_HFSCR : SPRN_HFSCR); > - value = value >> 56; > + status = value >> 56; > + > + if (status < ARRAY_SIZE(facility_strings)) > + facility = facility_strings[status]; > + else > + facility = "unknown"; For entries in the array that are not set, this will give facility == NULL. Is that what you intended? > pr_err("%sFacility '%s' unavailable, exception at 0x%lx, MSR=%lx\n", > - prefix, facility, regs->nip, regs->msr); > + hv ? "Hypervisor ":"", facility, regs->nip, regs->msr); ... and this may attempt to print a NULL pointer with %s. Also please put spaces around the : . -- Cheers, Stephen Rothwell sfr@canb.auug.org.au