summaryrefslogtreecommitdiff
path: root/arch/loongarch
diff options
context:
space:
mode:
authorWANG Xuerui <git@xen0n.name>2023-05-01 17:19:27 +0800
committerHuacai Chen <chenhuacai@loongson.cn>2023-05-01 17:19:27 +0800
commit5e3e784d35c41ca21251f92c243780c791100b02 (patch)
treef88a83d94f1bce97d0bca476b5127f4d163df3c6 /arch/loongarch
parent9718d96c035c594390600168cbca0ae4e0d867f5 (diff)
LoongArch: Humanize the ECFG line when showing registers
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>
Diffstat (limited to 'arch/loongarch')
-rw-r--r--arch/loongarch/kernel/traps.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index bd6be798f81d..6376997f2ae9 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -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;