Print the MSR TM bits in oops messages.  This appends them to the end
like this:
 MSR: 8000000502823031 <SF,VEC,VSX,FP,ME,IR,DR,LE,TM[TE]>

You get the TM[] only if at least one TM MSR bit is set.  Inside the
TM[], E means Enabled (bit 32), S means Suspended (bit 33), and T
means Transactional (bit 34)

If no bits are set, you get no TM[] output.

Include rework of printbits() to handle this case.

Signed-off-by: Michael Neuling <mi...@neuling.org>
---
 arch/powerpc/kernel/process.c | 43 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 35 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 75b6676..5fbe5d8 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -934,10 +934,12 @@ static void show_instructions(struct pt_regs *regs)
        printk("\n");
 }
 
-static struct regbit {
+struct regbit {
        unsigned long bit;
        const char *name;
-} msr_bits[] = {
+};
+
+static struct regbit msr_bits[] = {
 #if defined(CONFIG_PPC64) && !defined(CONFIG_BOOKE)
        {MSR_SF,        "SF"},
        {MSR_HV,        "HV"},
@@ -967,16 +969,41 @@ static struct regbit {
        {0,             NULL}
 };
 
-static void printbits(unsigned long val, struct regbit *bits)
+static void printbits(unsigned long val, struct regbit *bits, const char *sep)
 {
-       const char *sep = "";
+       const char *s = "";
 
-       printk("<");
        for (; bits->bit; ++bits)
                if (val & bits->bit) {
-                       printk("%s%s", sep, bits->name);
-                       sep = ",";
+                       printk("%s%s", s, bits->name);
+                       s = sep;
                }
+}
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+static struct regbit msr_tm_bits[] = {
+       {MSR_TS_T,      "T"},
+       {MSR_TS_S,      "S"},
+       {MSR_TM,        "E"},
+       {0,             NULL}
+};
+static void printtmbits(unsigned long val)
+{
+       if (val & (MSR_TM | MSR_TS_S | MSR_TS_T)) {
+               printk(",TM[");
+               printbits(val, msr_tm_bits, "");
+               printk("]");
+       }
+}
+#else
+static void printtmbits(unsigned long val) {}
+#endif
+
+static void printmsrbits(unsigned long val)
+{
+       printk("<");
+       printbits(val, msr_bits, ",");
+       printtmbits(val);
        printk(">");
 }
 
@@ -1001,7 +1028,7 @@ void show_regs(struct pt_regs * regs)
        printk("REGS: %p TRAP: %04lx   %s  (%s)\n",
               regs, regs->trap, print_tainted(), init_utsname()->release);
        printk("MSR: "REG" ", regs->msr);
-       printbits(regs->msr, msr_bits);
+       printmsrbits(regs->msr);
        printk("  CR: %08lx  XER: %08lx\n", regs->ccr, regs->xer);
        trap = TRAP(regs);
        if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
-- 
2.5.0

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to