LoongArch: Humanize the ECFG line when showing registers
authorWANG Xuerui <git@xen0n.name>
Mon, 1 May 2023 09:19:27 +0000 (17:19 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Mon, 1 May 2023 09:19:27 +0000 (17:19 +0800)
Example output looks like:

[   xx.xxxxxx]  ECFG: 00071c1c (LIE=2-4,10-12 VS=7)

Signed-off-by: WANG Xuerui <git@xen0n.name>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/kernel/traps.c

index bd6be798f81dc471d04ec591df5aee8b7063237e..6376997f2ae9b383064b07a32e9554db14ece5f6 100644 (file)
@@ -189,6 +189,12 @@ static void print_memory_type_fragment(const char *key, unsigned long val)
        pr_cont(" %s=%s", key, humanized_type);
 }
 
+static void print_intr_fragment(const char *key, unsigned long val)
+{
+       /* e.g. "LIE=0-1,3,5-7" */
+       pr_cont("%s=%*pbl", key, EXCCODE_INT_NUM, &val);
+}
+
 static void print_crmd(unsigned long x)
 {
        printk(" CRMD: %08lx (", x);
@@ -221,6 +227,13 @@ static void print_euen(unsigned long x)
        pr_cont(")\n");
 }
 
+static void print_ecfg(unsigned long x)
+{
+       printk(" ECFG: %08lx (", x);
+       print_intr_fragment("LIE", FIELD_GET(CSR_ECFG_IM, x));
+       pr_cont(" VS=%d)\n", (int) FIELD_GET(CSR_ECFG_VS, x));
+}
+
 static void __show_regs(const struct pt_regs *regs)
 {
        const int field = 2 * sizeof(unsigned long);
@@ -265,7 +278,7 @@ static void __show_regs(const struct pt_regs *regs)
        print_crmd(regs->csr_crmd);
        print_prmd(regs->csr_prmd);
        print_euen(regs->csr_euen);
-       printk(" ECFG: %08lx\n", regs->csr_ecfg);
+       print_ecfg(regs->csr_ecfg);
        printk("ESTAT: %08lx\n", regs->csr_estat);
 
        exccode = ((regs->csr_estat) & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;