* [PATCH 00/13] LoongArch: Better backtraces
@ 2022-10-24 12:12 WANG Xuerui
2022-10-24 12:12 ` [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual WANG Xuerui
` (13 more replies)
0 siblings, 14 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Hi,
Here are some long overdue cleanups of MIPS legacy stuff from
arch/loongarch codebase , and a bunch of tweaks to the backtrace code so
the Quality of Life for unfortunate LoongArch kernel devs (including but
not limited to, myself) could be marginally improved by relieving them of
having to mentally decode the register names and CSR bitfields.
Before:
> [ 17.879976] $ 0 : 0000000000000000 9000000000cc980c 90000001002cc000 90000001002cfe30
> [ 17.887936] $ 4 : 0000000000000010 9000000000f1f770 90000001002cc000 9000000000cc3468
> [ 17.895895] $ 8 : 900000010028fd00 0000000000000001 000055558e569190 0000000000000004
> [ 17.903853] $12 : 0000000000000000 0000000000000004 9000000001026000 900000000132b2d8
> [ 17.911811] $16 : 9000000001026000 000000006674b539 9000000000d51d10 0000000000000001
> [ 17.919769] $20 : 0000000000000000 900000000025c27c 0000000000000004 0000000000000002
> [ 17.927727] $24 : 900000000102e5b0 900000000102e508 0000000000000000 0000000000000004
> [ 17.935686] $28 : 9000000009007840 0000000000000004 0000000000000000 0000000000000004
> [ 17.943644] era : 90000000002215a0 __arch_cpu_idle+0x20/0x24
> [ 17.949438] ra : 9000000000cc980c default_idle_call+0x34/0x5c
> [ 17.955406] CSR crmd: 000000b0
> [ 17.955408] CSR prmd: 00000004
> [ 17.958521] CSR euen: 00000000
> [ 17.961635] CSR ecfg: 00071c1c
> [ 17.964748] CSR estat: 00001000
> [ 17.971062] ExcCode : 0 (SubCode 0)
> [ 17.974522] PrId : 0014c010 (Loongson-64bit)
After:
> [ 45.869200] pc 90000000002215a0 ra 9000000000ce86bc tp 90000001002cc000
> [ 45.875858] sp 90000001002cfe30 a0 0000000000000018 a1 9000000000f41ee0
> [ 45.882516] a2 0000000000000001 a3 000000000000000a a4 90000000098032c0
> [ 45.889173] a5 000000000000001b a6 000000008ea4398a a7 0000000000000004
> [ 45.895831] t0 0000000000000000 t1 0000000000000004 t2 0000000000003c00
> [ 45.902488] t3 0000000000cccccd t4 ffffffffffffffff t5 000000010d1ff6c8
> [ 45.909146] t6 0000000000000000 t7 0000000000000000 t8 000000000000005b
> [ 45.915803] r21 0000000a390fa6c0 s9 0000000000000001 s0 0000000000000003
> [ 45.922460] s1 90000000010565c0 s2 9000000001056518 s3 0000000000000000
> [ 45.929118] s4 0000000000000004 s5 0000000000000004 s6 9000000000228194
> [ 45.935775] s7 900000000102e220 s8 9000000100093e58
> [ 45.940704] pc: 90000000002215a0 __arch_cpu_idle+0x20/0x24
> [ 45.946412] ra: 9000000000ce86bc default_idle_call+0x34/0x5c
> [ 45.952294] crmd: 000000b0 (-WE DACM=CC DACF=CC +PG -DA -IE PLV0)
> [ 45.958443] prmd: 00000004 (-PWE +PIE PPLV0)
> [ 45.962772] euen: 00000000 (-BTE -ASXE -SXE -FPE)
> [ 45.967532] ecfg: 00071c1c (VS=7 LIE=2-4,10-12)
> [ 45.972119] estat: 00001000 [INT] (EsubCode=0 ECode=0 IS=12)
> [ 45.977741] prid: 0014c010 (Loongson-64bit)
Please review, and let the bikeshedding begin!
WANG Xuerui (13):
LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA
manual
LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE
LoongArch: Unify the exception code definitions with the manual
LoongArch: Clean up the architectural interrupt definitions
LoongArch: Print GPRs with ABI names when showing registers
LoongArch: Print symbol info for PC and $ra only for kernel-mode
contexts
LoongArch: Fix format of CSR lines during show_regs
LoongArch: Humanize the CRMD line when showing registers
LoongArch: Humanize the PRMD line when showing registers
LoongArch: Humanize the EUEN line when showing registers
LoongArch: Humanize the ECFG line when showing registers
LoongArch: Humanize the ESTAT line when showing registers
LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID
lines in show_regs
arch/loongarch/include/asm/fpu.h | 10 +-
arch/loongarch/include/asm/loongarch.h | 147 ++++++++-------
arch/loongarch/kernel/fpu.S | 2 +-
arch/loongarch/kernel/irq.c | 2 +-
arch/loongarch/kernel/perf_event.c | 2 +-
arch/loongarch/kernel/process.c | 2 +-
arch/loongarch/kernel/time.c | 2 +-
arch/loongarch/kernel/traps.c | 245 ++++++++++++++++++++-----
arch/loongarch/mm/fault.c | 4 +-
arch/loongarch/mm/tlb.c | 14 +-
drivers/irqchip/irq-loongarch-cpu.c | 2 +-
11 files changed, 294 insertions(+), 138 deletions(-)
--
2.38.0
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 14:53 ` Huacai Chen
2022-10-24 12:12 ` [PATCH 02/13] LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE WANG Xuerui
` (12 subsequent siblings)
13 siblings, 1 reply; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
The current field names of CSR.EUEN and CSR.ECFG are not consistent with
the LoongArch ISA manual v1.02, and seems to be leftover from an earlier
time. Change to the ISA manual names.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/include/asm/fpu.h | 10 +++++-----
arch/loongarch/include/asm/loongarch.h | 22 +++++++++++-----------
arch/loongarch/kernel/fpu.S | 2 +-
arch/loongarch/kernel/process.c | 2 +-
4 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h
index 358b254d9c1d..a5015b6536bc 100644
--- a/arch/loongarch/include/asm/fpu.h
+++ b/arch/loongarch/include/asm/fpu.h
@@ -37,13 +37,13 @@ static inline unsigned long mask_fcsr_x(unsigned long fcsr)
static inline int is_fp_enabled(void)
{
- return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPEN) ?
+ return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPE) ?
1 : 0;
}
-#define enable_fpu() set_csr_euen(CSR_EUEN_FPEN)
+#define enable_fpu() set_csr_euen(CSR_EUEN_FPE)
-#define disable_fpu() clear_csr_euen(CSR_EUEN_FPEN)
+#define disable_fpu() clear_csr_euen(CSR_EUEN_FPE)
#define clear_fpu_owner() clear_thread_flag(TIF_USEDFPU)
@@ -56,7 +56,7 @@ static inline void __own_fpu(void)
{
enable_fpu();
set_thread_flag(TIF_USEDFPU);
- KSTK_EUEN(current) |= CSR_EUEN_FPEN;
+ KSTK_EUEN(current) |= CSR_EUEN_FPE;
}
static inline void own_fpu_inatomic(int restore)
@@ -83,7 +83,7 @@ static inline void lose_fpu_inatomic(int save, struct task_struct *tsk)
disable_fpu();
clear_tsk_thread_flag(tsk, TIF_USEDFPU);
}
- KSTK_EUEN(tsk) &= ~(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
+ KSTK_EUEN(tsk) &= ~(CSR_EUEN_FPE | CSR_EUEN_SXE | CSR_EUEN_ASXE);
}
static inline void lose_fpu(int save)
diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
index 7f8d57a61c8b..534352d6ed18 100644
--- a/arch/loongarch/include/asm/loongarch.h
+++ b/arch/loongarch/include/asm/loongarch.h
@@ -295,14 +295,14 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
#define CSR_PRMD_PPLV (_ULCAST_(0x3) << CSR_PRMD_PPLV_SHIFT)
#define LOONGARCH_CSR_EUEN 0x2 /* Extended unit enable */
-#define CSR_EUEN_LBTEN_SHIFT 3
-#define CSR_EUEN_LBTEN (_ULCAST_(0x1) << CSR_EUEN_LBTEN_SHIFT)
-#define CSR_EUEN_LASXEN_SHIFT 2
-#define CSR_EUEN_LASXEN (_ULCAST_(0x1) << CSR_EUEN_LASXEN_SHIFT)
-#define CSR_EUEN_LSXEN_SHIFT 1
-#define CSR_EUEN_LSXEN (_ULCAST_(0x1) << CSR_EUEN_LSXEN_SHIFT)
-#define CSR_EUEN_FPEN_SHIFT 0
-#define CSR_EUEN_FPEN (_ULCAST_(0x1) << CSR_EUEN_FPEN_SHIFT)
+#define CSR_EUEN_BTE_SHIFT 3
+#define CSR_EUEN_BTE (_ULCAST_(0x1) << CSR_EUEN_BTE_SHIFT)
+#define CSR_EUEN_ASXE_SHIFT 2
+#define CSR_EUEN_ASXE (_ULCAST_(0x1) << CSR_EUEN_ASXE_SHIFT)
+#define CSR_EUEN_SXE_SHIFT 1
+#define CSR_EUEN_SXE (_ULCAST_(0x1) << CSR_EUEN_SXE_SHIFT)
+#define CSR_EUEN_FPE_SHIFT 0
+#define CSR_EUEN_FPE (_ULCAST_(0x1) << CSR_EUEN_FPE_SHIFT)
#define LOONGARCH_CSR_MISC 0x3 /* Misc config */
@@ -310,9 +310,9 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
#define CSR_ECFG_VS_SHIFT 16
#define CSR_ECFG_VS_WIDTH 3
#define CSR_ECFG_VS (_ULCAST_(0x7) << CSR_ECFG_VS_SHIFT)
-#define CSR_ECFG_IM_SHIFT 0
-#define CSR_ECFG_IM_WIDTH 13
-#define CSR_ECFG_IM (_ULCAST_(0x1fff) << CSR_ECFG_IM_SHIFT)
+#define CSR_ECFG_LIE_SHIFT 0
+#define CSR_ECFG_LIE_WIDTH 13
+#define CSR_ECFG_LIE (_ULCAST_(0x1fff) << CSR_ECFG_LIE_SHIFT)
#define LOONGARCH_CSR_ESTAT 0x5 /* Exception status */
#define CSR_ESTAT_ESUBCODE_SHIFT 22
diff --git a/arch/loongarch/kernel/fpu.S b/arch/loongarch/kernel/fpu.S
index ccde94140c89..7b1691f67509 100644
--- a/arch/loongarch/kernel/fpu.S
+++ b/arch/loongarch/kernel/fpu.S
@@ -175,7 +175,7 @@ SYM_FUNC_END(_restore_fp)
*/
SYM_FUNC_START(_init_fpu)
- li.w t1, CSR_EUEN_FPEN
+ li.w t1, CSR_EUEN_FPE
csrxchg t1, t1, LOONGARCH_CSR_EUEN
movgr2fcsr fcsr0, a0
diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
index 1256e3582475..b88a5864e03d 100644
--- a/arch/loongarch/kernel/process.c
+++ b/arch/loongarch/kernel/process.c
@@ -79,7 +79,7 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
prmd |= PLV_USER;
regs->csr_prmd = prmd;
- euen = regs->csr_euen & ~(CSR_EUEN_FPEN);
+ euen = regs->csr_euen & ~(CSR_EUEN_FPE);
regs->csr_euen = euen;
lose_fpu(0);
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 02/13] LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
2022-10-24 12:12 ` [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:12 ` [PATCH 03/13] LoongArch: Unify the exception code definitions with the manual WANG Xuerui
` (11 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Clean up more MIPS leftover, where exception codes are named
"exc"-something instead of "ecode".
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/include/asm/loongarch.h | 10 +++++-----
arch/loongarch/kernel/traps.c | 8 ++++----
arch/loongarch/mm/fault.c | 4 ++--
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
index 534352d6ed18..ca01d04c784e 100644
--- a/arch/loongarch/include/asm/loongarch.h
+++ b/arch/loongarch/include/asm/loongarch.h
@@ -318,9 +318,9 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
#define CSR_ESTAT_ESUBCODE_SHIFT 22
#define CSR_ESTAT_ESUBCODE_WIDTH 9
#define CSR_ESTAT_ESUBCODE (_ULCAST_(0x1ff) << CSR_ESTAT_ESUBCODE_SHIFT)
-#define CSR_ESTAT_EXC_SHIFT 16
-#define CSR_ESTAT_EXC_WIDTH 6
-#define CSR_ESTAT_EXC (_ULCAST_(0x3f) << CSR_ESTAT_EXC_SHIFT)
+#define CSR_ESTAT_ECODE_SHIFT 16
+#define CSR_ESTAT_ECODE_WIDTH 6
+#define CSR_ESTAT_ECODE (_ULCAST_(0x3f) << CSR_ESTAT_ECODE_SHIFT)
#define CSR_ESTAT_IS_SHIFT 0
#define CSR_ESTAT_IS_WIDTH 15
#define CSR_ESTAT_IS (_ULCAST_(0x7fff) << CSR_ESTAT_IS_SHIFT)
@@ -1194,9 +1194,9 @@ static inline void csr_any_send(unsigned int addr, unsigned int data,
iocsr_write64(val, LOONGARCH_IOCSR_ANY_SEND);
}
-static inline unsigned int read_csr_excode(void)
+static inline unsigned int read_csr_ecode(void)
{
- return (csr_read32(LOONGARCH_CSR_ESTAT) & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
+ return (csr_read32(LOONGARCH_CSR_ESTAT) & CSR_ESTAT_ECODE) >> CSR_ESTAT_ECODE_SHIFT;
}
static inline void write_csr_index(unsigned int idx)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 7ea62faeeadb..8d959e853ec3 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -194,7 +194,7 @@ static void __show_regs(const struct pt_regs *regs)
pr_cont("\n");
- exccode = ((regs->csr_estat) & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
+ exccode = ((regs->csr_estat) & CSR_ESTAT_ECODE) >> CSR_ESTAT_ECODE_SHIFT;
excsubcode = ((regs->csr_estat) & CSR_ESTAT_ESUBCODE) >> CSR_ESTAT_ESUBCODE_SHIFT;
printk("ExcCode : %x (SubCode %x)\n", exccode, excsubcode);
@@ -436,7 +436,7 @@ asmlinkage void noinstr do_bp(struct pt_regs *regs)
irqentry_state_t state = irqentry_enter(regs);
local_irq_enable();
- current->thread.trap_nr = read_csr_excode();
+ current->thread.trap_nr = read_csr_ecode();
if (__get_inst(&opcode, (u32 *)era, user))
goto out_sigsegv;
@@ -520,7 +520,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)
irqentry_state_t state = irqentry_enter(regs);
local_irq_enable();
- current->thread.trap_nr = read_csr_excode();
+ current->thread.trap_nr = read_csr_ecode();
if (notify_die(DIE_RI, "RI Fault", regs, 0, current->thread.trap_nr,
SIGILL) == NOTIFY_STOP)
@@ -612,7 +612,7 @@ asmlinkage void noinstr do_reserved(struct pt_regs *regs)
* caused by a fatal error after another hardware/software error.
*/
pr_err("Caught reserved exception %u on pid:%d [%s] - should not happen\n",
- read_csr_excode(), current->pid, current->comm);
+ read_csr_ecode(), current->pid, current->comm);
die_if_kernel("do_reserved exception", regs);
force_sig(SIGUNUSED);
diff --git a/arch/loongarch/mm/fault.c b/arch/loongarch/mm/fault.c
index 1ccd53655cab..062632205020 100644
--- a/arch/loongarch/mm/fault.c
+++ b/arch/loongarch/mm/fault.c
@@ -78,7 +78,7 @@ static void __kprobes do_sigbus(struct pt_regs *regs,
* or user mode.
*/
current->thread.csr_badvaddr = address;
- current->thread.trap_nr = read_csr_excode();
+ current->thread.trap_nr = read_csr_ecode();
force_sig_fault(SIGBUS, BUS_ADRERR, (void __user *)address);
}
@@ -100,7 +100,7 @@ static void __kprobes do_sigsegv(struct pt_regs *regs,
current->thread.error_code = 1;
else
current->thread.error_code = 2;
- current->thread.trap_nr = read_csr_excode();
+ current->thread.trap_nr = read_csr_ecode();
if (show_unhandled_signals &&
unhandled_signal(current, SIGSEGV) && __ratelimit(&ratelimit_state)) {
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 03/13] LoongArch: Unify the exception code definitions with the manual
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
2022-10-24 12:12 ` [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual WANG Xuerui
2022-10-24 12:12 ` [PATCH 02/13] LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:12 ` [PATCH 04/13] LoongArch: Clean up the architectural interrupt definitions WANG Xuerui
` (10 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
There is apparently much MIPS leftover in those definitions. Amend the
names and comments according to the LoongArch ISA manual.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/include/asm/loongarch.h | 68 +++++++++++++-------------
arch/loongarch/kernel/traps.c | 26 +++++-----
arch/loongarch/mm/tlb.c | 14 +++---
3 files changed, 55 insertions(+), 53 deletions(-)
diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
index ca01d04c784e..143e9ce912ae 100644
--- a/arch/loongarch/include/asm/loongarch.h
+++ b/arch/loongarch/include/asm/loongarch.h
@@ -1381,39 +1381,41 @@ __BUILD_CSR_OP(tlbidx)
#error Bad page size configuration for hugetlbfs!
#endif
-/* ExStatus.ExcCode */
-#define EXCCODE_RSV 0 /* Reserved */
-#define EXCCODE_TLBL 1 /* TLB miss on a load */
-#define EXCCODE_TLBS 2 /* TLB miss on a store */
-#define EXCCODE_TLBI 3 /* TLB miss on a ifetch */
-#define EXCCODE_TLBM 4 /* TLB modified fault */
-#define EXCCODE_TLBNR 5 /* TLB Read-Inhibit exception */
-#define EXCCODE_TLBNX 6 /* TLB Execution-Inhibit exception */
-#define EXCCODE_TLBPE 7 /* TLB Privilege Error */
-#define EXCCODE_ADE 8 /* Address Error */
- #define EXSUBCODE_ADEF 0 /* Fetch Instruction */
- #define EXSUBCODE_ADEM 1 /* Access Memory*/
-#define EXCCODE_ALE 9 /* Unalign Access */
-#define EXCCODE_OOB 10 /* Out of bounds */
-#define EXCCODE_SYS 11 /* System call */
-#define EXCCODE_BP 12 /* Breakpoint */
-#define EXCCODE_INE 13 /* Inst. Not Exist */
-#define EXCCODE_IPE 14 /* Inst. Privileged Error */
-#define EXCCODE_FPDIS 15 /* FPU Disabled */
-#define EXCCODE_LSXDIS 16 /* LSX Disabled */
-#define EXCCODE_LASXDIS 17 /* LASX Disabled */
-#define EXCCODE_FPE 18 /* Floating Point Exception */
- #define EXCSUBCODE_FPE 0 /* Floating Point Exception */
- #define EXCSUBCODE_VFPE 1 /* Vector Exception */
-#define EXCCODE_WATCH 19 /* Watch address reference */
-#define EXCCODE_BTDIS 20 /* Binary Trans. Disabled */
-#define EXCCODE_BTE 21 /* Binary Trans. Exception */
-#define EXCCODE_PSI 22 /* Guest Privileged Error */
-#define EXCCODE_HYP 23 /* Hypercall */
-#define EXCCODE_GCM 24 /* Guest CSR modified */
- #define EXCSUBCODE_GCSC 0 /* Software caused */
- #define EXCSUBCODE_GCHC 1 /* Hardware caused */
-#define EXCCODE_SE 25 /* Security */
+/* CSR.ESTAT.ECode & EsubCode */
+#define ECODE_INT 0 /* INTerrupt */
+#define ECODE_PIL 1 /* Page Invalid for Load */
+#define ECODE_PIS 2 /* Page Invalid for Store */
+#define ECODE_PIF 3 /* Page Invalid for instruction Fetch */
+#define ECODE_PME 4 /* Page Modified Exception */
+#define ECODE_PNR 5 /* Page Non-Readable */
+#define ECODE_PNX 6 /* Page Non-eXecutable */
+#define ECODE_PPI 7 /* Page Privilege level Illegal */
+#define ECODE_ADE 8 /* ADdress Error */
+ #define ESUBCODE_ADEF 0 /* ... on instruction Fetch */
+ #define ESUBCODE_ADEM 1 /* ... on Memory access */
+#define ECODE_ALE 9 /* ALignment Exception */
+#define ECODE_BCE 10 /* Bound Check Error */
+#define ECODE_SYS 11 /* SYStem call */
+#define ECODE_BRK 12 /* BReaKpoint */
+#define ECODE_INE 13 /* Instruction Non-Existent */
+#define ECODE_IPE 14 /* Instruction Privilege Error */
+#define ECODE_FPD 15 /* FPU Disabled */
+#define ECODE_SXD 16 /* LSX unit Disabled */
+#define ECODE_ASXD 17 /* LASX unit Disabled */
+#define ECODE_FPE 18 /* FP Exception */
+ #define ESUBCODE_FPE 0 /* FPU Exception */
+ #define ESUBCODE_VFPE 1 /* Vector FPU Exception */
+#define ECODE_WPE 19 /* WatchPoint Exception */
+ #define ESUBCODE_WPEF 0 /* ... on instruction Fetch */
+ #define ESUBCODE_WPEM 1 /* ... on Memory access */
+#define ECODE_BTD 20 /* LBT unit Disabled */
+#define ECODE_BTE 21 /* LBT unit Exception */
+#define ECODE_GSPR 22 /* Guest Sensitive Privileged Resource exception */
+#define ECODE_HVC 23 /* HyperVisor Call */
+#define ECODE_GCM 24 /* Guest CSR modified */
+ #define ESUBCODE_GCSC 0 /* ..., Software Caused */
+ #define ESUBCODE_GCHC 1 /* ..., Hardware Caused */
+#define ECODE_SE 25 /* Undocumented: Security */
#define EXCCODE_INT_START 64
#define EXCCODE_SIP0 64
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 8d959e853ec3..8e4691801e34 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -198,7 +198,7 @@ static void __show_regs(const struct pt_regs *regs)
excsubcode = ((regs->csr_estat) & CSR_ESTAT_ESUBCODE) >> CSR_ESTAT_ESUBCODE_SHIFT;
printk("ExcCode : %x (SubCode %x)\n", exccode, excsubcode);
- if (exccode >= EXCCODE_TLBL && exccode <= EXCCODE_ALE)
+ if (exccode >= ECODE_PIL && exccode <= ECODE_ALE)
printk("BadVA : %0*lx\n", field, regs->csr_badvaddr);
printk("PrId : %08x (%s)\n", read_cpucfg(LOONGARCH_CPUCFG0),
@@ -746,18 +746,18 @@ void __init trap_init(void)
for (i = EXCCODE_INT_START; i < EXCCODE_INT_END; i++)
set_handler(i * VECSIZE, handle_vint, VECSIZE);
- set_handler(EXCCODE_ADE * VECSIZE, handle_ade, VECSIZE);
- set_handler(EXCCODE_ALE * VECSIZE, handle_ale, VECSIZE);
- set_handler(EXCCODE_SYS * VECSIZE, handle_sys, VECSIZE);
- set_handler(EXCCODE_BP * VECSIZE, handle_bp, VECSIZE);
- set_handler(EXCCODE_INE * VECSIZE, handle_ri, VECSIZE);
- set_handler(EXCCODE_IPE * VECSIZE, handle_ri, VECSIZE);
- set_handler(EXCCODE_FPDIS * VECSIZE, handle_fpu, VECSIZE);
- set_handler(EXCCODE_LSXDIS * VECSIZE, handle_lsx, VECSIZE);
- set_handler(EXCCODE_LASXDIS * VECSIZE, handle_lasx, VECSIZE);
- set_handler(EXCCODE_FPE * VECSIZE, handle_fpe, VECSIZE);
- set_handler(EXCCODE_BTDIS * VECSIZE, handle_lbt, VECSIZE);
- set_handler(EXCCODE_WATCH * VECSIZE, handle_watch, VECSIZE);
+ set_handler(ECODE_ADE * VECSIZE, handle_ade, VECSIZE);
+ set_handler(ECODE_ALE * VECSIZE, handle_ale, VECSIZE);
+ set_handler(ECODE_SYS * VECSIZE, handle_sys, VECSIZE);
+ set_handler(ECODE_BRK * VECSIZE, handle_bp, VECSIZE);
+ set_handler(ECODE_INE * VECSIZE, handle_ri, VECSIZE);
+ set_handler(ECODE_IPE * VECSIZE, handle_ri, VECSIZE);
+ set_handler(ECODE_FPD * VECSIZE, handle_fpu, VECSIZE);
+ set_handler(ECODE_SXD * VECSIZE, handle_lsx, VECSIZE);
+ set_handler(ECODE_ASXD * VECSIZE, handle_lasx, VECSIZE);
+ set_handler(ECODE_FPE * VECSIZE, handle_fpe, VECSIZE);
+ set_handler(ECODE_BTD * VECSIZE, handle_lbt, VECSIZE);
+ set_handler(ECODE_WPE * VECSIZE, handle_watch, VECSIZE);
cache_error_setup();
diff --git a/arch/loongarch/mm/tlb.c b/arch/loongarch/mm/tlb.c
index da3681f131c8..caaf70e8f5ec 100644
--- a/arch/loongarch/mm/tlb.c
+++ b/arch/loongarch/mm/tlb.c
@@ -264,13 +264,13 @@ void setup_tlb_handler(int cpu)
if (cpu == 0) {
memcpy((void *)tlbrentry, handle_tlb_refill, 0x80);
local_flush_icache_range(tlbrentry, tlbrentry + 0x80);
- set_handler(EXCCODE_TLBI * VECSIZE, handle_tlb_load, VECSIZE);
- set_handler(EXCCODE_TLBL * VECSIZE, handle_tlb_load, VECSIZE);
- set_handler(EXCCODE_TLBS * VECSIZE, handle_tlb_store, VECSIZE);
- set_handler(EXCCODE_TLBM * VECSIZE, handle_tlb_modify, VECSIZE);
- set_handler(EXCCODE_TLBNR * VECSIZE, handle_tlb_protect, VECSIZE);
- set_handler(EXCCODE_TLBNX * VECSIZE, handle_tlb_protect, VECSIZE);
- set_handler(EXCCODE_TLBPE * VECSIZE, handle_tlb_protect, VECSIZE);
+ set_handler(ECODE_PIF * VECSIZE, handle_tlb_load, VECSIZE);
+ set_handler(ECODE_PIL * VECSIZE, handle_tlb_load, VECSIZE);
+ set_handler(ECODE_PIS * VECSIZE, handle_tlb_store, VECSIZE);
+ set_handler(ECODE_PME * VECSIZE, handle_tlb_modify, VECSIZE);
+ set_handler(ECODE_PNR * VECSIZE, handle_tlb_protect, VECSIZE);
+ set_handler(ECODE_PNX * VECSIZE, handle_tlb_protect, VECSIZE);
+ set_handler(ECODE_PPI * VECSIZE, handle_tlb_protect, VECSIZE);
}
#ifdef CONFIG_NUMA
else {
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 04/13] LoongArch: Clean up the architectural interrupt definitions
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (2 preceding siblings ...)
2022-10-24 12:12 ` [PATCH 03/13] LoongArch: Unify the exception code definitions with the manual WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:12 ` [PATCH 05/13] LoongArch: Print GPRs with ABI names when showing registers WANG Xuerui
` (9 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
While interrupts are assigned ECodes `64 + interrupt number`, all
existing use sites of interrupt numbers want the 64 subtracted.
Re-arrange the definitions so that the actual interrupt number is used
everywhere.
While at it, document an ISA manual erratum that is confirmed by Huacai
but not yet officially fixed in the official (Chinese) version of the
manual.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/include/asm/loongarch.h | 45 ++++++++++++++++----------
arch/loongarch/kernel/irq.c | 2 +-
arch/loongarch/kernel/perf_event.c | 2 +-
arch/loongarch/kernel/time.c | 2 +-
arch/loongarch/kernel/traps.c | 2 +-
drivers/irqchip/irq-loongarch-cpu.c | 2 +-
6 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
index 143e9ce912ae..86fe0eda1534 100644
--- a/arch/loongarch/include/asm/loongarch.h
+++ b/arch/loongarch/include/asm/loongarch.h
@@ -1417,23 +1417,34 @@ __BUILD_CSR_OP(tlbidx)
#define ESUBCODE_GCHC 1 /* ..., Hardware Caused */
#define ECODE_SE 25 /* Undocumented: Security */
-#define EXCCODE_INT_START 64
-#define EXCCODE_SIP0 64
-#define EXCCODE_SIP1 65
-#define EXCCODE_IP0 66
-#define EXCCODE_IP1 67
-#define EXCCODE_IP2 68
-#define EXCCODE_IP3 69
-#define EXCCODE_IP4 70
-#define EXCCODE_IP5 71
-#define EXCCODE_IP6 72
-#define EXCCODE_IP7 73
-#define EXCCODE_PMC 74 /* Performance Counter */
-#define EXCCODE_TIMER 75
-#define EXCCODE_IPI 76
-#define EXCCODE_NMI 77
-#define EXCCODE_INT_END 78
-#define EXCCODE_INT_NUM (EXCCODE_INT_END - EXCCODE_INT_START)
+/*
+ * Interrupt numbers
+ *
+ * The LoongArch ISA manual v1.02 says there are 13 interrupts in total (see
+ * the description about CSR.ESTAT, Volume 1, section 7.4.6), unfortunately
+ * in this case the manual is wrong, and the definitions here shall prevail.
+ * In other words, the widths of CSR.ECFG.LIE and CSR.ESTAT.IS are 14 bits,
+ * instead of 13 as the manual suggests otherwise.
+ */
+#define INT_SWI0 0 /* Software Interrupts */
+#define INT_SWI1 1
+#define INT_HWI0 2 /* Hardware Interrupts */
+#define INT_HWI1 3
+#define INT_HWI2 4
+#define INT_HWI3 5
+#define INT_HWI4 6
+#define INT_HWI5 7
+#define INT_HWI6 8
+#define INT_HWI7 9
+#define INT_PCOV 10 /* Performance Counter Overflow */
+#define INT_TI 11 /* Timer */
+#define INT_IPI 12
+#define INT_NMI 13
+#define INT_NUM (INT_NMI - INT_SWI0)
+
+/* ECodes corresponding to interrupts */
+#define ECODE_INT_START 64
+#define ECODE_INT_END (ECODE_INT_START + INT_NUM)
/* FPU register names */
#define LOONGARCH_FCSR0 $r0
diff --git a/arch/loongarch/kernel/irq.c b/arch/loongarch/kernel/irq.c
index 1ba19c76563e..242c22a0b994 100644
--- a/arch/loongarch/kernel/irq.c
+++ b/arch/loongarch/kernel/irq.c
@@ -92,7 +92,7 @@ static int __init get_ipi_irq(void)
struct irq_domain *d = irq_find_matching_fwnode(cpuintc_handle, DOMAIN_BUS_ANY);
if (d)
- return irq_create_mapping(d, EXCCODE_IPI - EXCCODE_INT_START);
+ return irq_create_mapping(d, INT_IPI);
return -EINVAL;
}
diff --git a/arch/loongarch/kernel/perf_event.c b/arch/loongarch/kernel/perf_event.c
index 707bd32e5c4f..ff28f99b47d7 100644
--- a/arch/loongarch/kernel/perf_event.c
+++ b/arch/loongarch/kernel/perf_event.c
@@ -461,7 +461,7 @@ static int get_pmc_irq(void)
struct irq_domain *d = irq_find_matching_fwnode(cpuintc_handle, DOMAIN_BUS_ANY);
if (d)
- return irq_create_mapping(d, EXCCODE_PMC - EXCCODE_INT_START);
+ return irq_create_mapping(d, INT_PCOV);
return -EINVAL;
}
diff --git a/arch/loongarch/kernel/time.c b/arch/loongarch/kernel/time.c
index 786735dcc8d6..571a7e639e64 100644
--- a/arch/loongarch/kernel/time.c
+++ b/arch/loongarch/kernel/time.c
@@ -128,7 +128,7 @@ static int get_timer_irq(void)
struct irq_domain *d = irq_find_matching_fwnode(cpuintc_handle, DOMAIN_BUS_ANY);
if (d)
- return irq_create_mapping(d, EXCCODE_TIMER - EXCCODE_INT_START);
+ return irq_create_mapping(d, INT_TI);
return -EINVAL;
}
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 8e4691801e34..d4dc35c39296 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -743,7 +743,7 @@ void __init trap_init(void)
long i;
/* Set interrupt vector handler */
- for (i = EXCCODE_INT_START; i < EXCCODE_INT_END; i++)
+ for (i = ECODE_INT_START; i < ECODE_INT_END; i++)
set_handler(i * VECSIZE, handle_vint, VECSIZE);
set_handler(ECODE_ADE * VECSIZE, handle_ade, VECSIZE);
diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
index 093609c8eaa7..3fc5c9ea426a 100644
--- a/drivers/irqchip/irq-loongarch-cpu.c
+++ b/drivers/irqchip/irq-loongarch-cpu.c
@@ -125,7 +125,7 @@ static int __init cpuintc_acpi_init(union acpi_subtable_headers *header,
clear_csr_estat(ESTATF_IP);
cpuintc_handle = irq_domain_alloc_named_fwnode("CPUINTC");
- irq_domain = irq_domain_create_linear(cpuintc_handle, EXCCODE_INT_NUM,
+ irq_domain = irq_domain_create_linear(cpuintc_handle, INT_NUM,
&loongarch_cpu_intc_irq_domain_ops, NULL);
if (!irq_domain)
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 05/13] LoongArch: Print GPRs with ABI names when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (3 preceding siblings ...)
2022-10-24 12:12 ` [PATCH 04/13] LoongArch: Clean up the architectural interrupt definitions WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:12 ` [PATCH 06/13] LoongArch: Print symbol info for PC and $ra only for kernel-mode contexts WANG Xuerui
` (8 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Print 3 registers per line to fit the entire line within 75 columns even
with timestamp prefixed to each line, to ease future copy-pastes for all.
And show PC (CSR.ERA) in place of $zero, like what arch/riscv does.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 36 ++++++++++++++++++++++-------------
1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index d4dc35c39296..c6fe09bc5ccc 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -161,22 +161,32 @@ static void __show_regs(const struct pt_regs *regs)
const int field = 2 * sizeof(unsigned long);
unsigned int excsubcode;
unsigned int exccode;
- int i;
show_regs_print_info(KERN_DEFAULT);
- /*
- * Saved main processor registers
- */
- for (i = 0; i < 32; ) {
- if ((i % 4) == 0)
- printk("$%2d :", i);
- pr_cont(" %0*lx", field, regs->regs[i]);
-
- i++;
- if ((i % 4) == 0)
- pr_cont("\n");
- }
+ /* Print PC and GPRs, 3 per row to fit output in 75 columns */
+ pr_cont(" pc %0*lx ra %0*lx tp %0*lx\n",
+ field, regs->csr_era, field, regs->regs[1], field, regs->regs[2]);
+ pr_cont(" sp %0*lx a0 %0*lx a1 %0*lx\n",
+ field, regs->regs[3], field, regs->regs[4], field, regs->regs[5]);
+ pr_cont(" a2 %0*lx a3 %0*lx a4 %0*lx\n",
+ field, regs->regs[6], field, regs->regs[7], field, regs->regs[8]);
+ pr_cont(" a5 %0*lx a6 %0*lx a7 %0*lx\n",
+ field, regs->regs[9], field, regs->regs[10], field, regs->regs[11]);
+ pr_cont(" t0 %0*lx t1 %0*lx t2 %0*lx\n",
+ field, regs->regs[12], field, regs->regs[13], field, regs->regs[14]);
+ pr_cont(" t3 %0*lx t4 %0*lx t5 %0*lx\n",
+ field, regs->regs[15], field, regs->regs[16], field, regs->regs[17]);
+ pr_cont(" t6 %0*lx t7 %0*lx t8 %0*lx\n",
+ field, regs->regs[18], field, regs->regs[19], field, regs->regs[20]);
+ pr_cont("r21 %0*lx s9 %0*lx s0 %0*lx\n",
+ field, regs->regs[21], field, regs->regs[22], field, regs->regs[23]);
+ pr_cont(" s1 %0*lx s2 %0*lx s3 %0*lx\n",
+ field, regs->regs[24], field, regs->regs[25], field, regs->regs[26]);
+ pr_cont(" s4 %0*lx s5 %0*lx s6 %0*lx\n",
+ field, regs->regs[27], field, regs->regs[28], field, regs->regs[29]);
+ pr_cont(" s7 %0*lx s8 %0*lx\n",
+ field, regs->regs[30], field, regs->regs[31]);
/*
* Saved csr registers
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 06/13] LoongArch: Print symbol info for PC and $ra only for kernel-mode contexts
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (4 preceding siblings ...)
2022-10-24 12:12 ` [PATCH 05/13] LoongArch: Print GPRs with ABI names when showing registers WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:12 ` [PATCH 07/13] LoongArch: Fix format of CSR lines during show_regs WANG Xuerui
` (7 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Otherwise the addresses wouldn't make sense at all. And show "pc"
instead of "era" for a tiny bit of user friendliness.
While at it, align the "map keys" to maintain right-alignment with the
"estat:" line too.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index c6fe09bc5ccc..e24435c78086 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -188,14 +188,12 @@ static void __show_regs(const struct pt_regs *regs)
pr_cont(" s7 %0*lx s8 %0*lx\n",
field, regs->regs[30], field, regs->regs[31]);
- /*
- * Saved csr registers
- */
- printk("era : %0*lx %pS\n", field, regs->csr_era,
- (void *) regs->csr_era);
- printk("ra : %0*lx %pS\n", field, regs->regs[1],
- (void *) regs->regs[1]);
+ if (!user_mode(regs)) {
+ pr_cont(" pc: %0*lx %pS\n", field, regs->csr_era, (void *) regs->csr_era);
+ pr_cont(" ra: %0*lx %pS\n", field, regs->regs[1], (void *) regs->regs[1]);
+ }
+ /* Print important CSRs */
printk("CSR crmd: %08lx ", regs->csr_crmd);
printk("CSR prmd: %08lx ", regs->csr_prmd);
printk("CSR euen: %08lx ", regs->csr_euen);
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 07/13] LoongArch: Fix format of CSR lines during show_regs
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (5 preceding siblings ...)
2022-10-24 12:12 ` [PATCH 06/13] LoongArch: Print symbol info for PC and $ra only for kernel-mode contexts WANG Xuerui
@ 2022-10-24 12:12 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 08/13] LoongArch: Humanize the CRMD line when showing registers WANG Xuerui
` (6 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:12 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Use lowercase CSR names throughout, and right-align the keys. The "CSR"
part is inferrable from context, hence dropped for more horizontal
space.
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index e24435c78086..92a12f544f5e 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -194,13 +194,11 @@ static void __show_regs(const struct pt_regs *regs)
}
/* Print important CSRs */
- printk("CSR crmd: %08lx ", regs->csr_crmd);
- printk("CSR prmd: %08lx ", regs->csr_prmd);
- printk("CSR euen: %08lx ", regs->csr_euen);
- printk("CSR ecfg: %08lx ", regs->csr_ecfg);
- printk("CSR estat: %08lx ", regs->csr_estat);
-
- pr_cont("\n");
+ pr_cont(" crmd: %08lx\n", regs->csr_crmd);
+ pr_cont(" prmd: %08lx\n", regs->csr_prmd);
+ pr_cont(" euen: %08lx\n", regs->csr_euen);
+ pr_cont(" ecfg: %08lx\n", regs->csr_ecfg);
+ pr_cont("estat: %08lx\n", regs->csr_estat);
exccode = ((regs->csr_estat) & CSR_ESTAT_ECODE) >> CSR_ESTAT_ECODE_SHIFT;
excsubcode = ((regs->csr_estat) & CSR_ESTAT_ESUBCODE) >> CSR_ESTAT_ESUBCODE_SHIFT;
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 08/13] LoongArch: Humanize the CRMD line when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (6 preceding siblings ...)
2022-10-24 12:12 ` [PATCH 07/13] LoongArch: Fix format of CSR lines during show_regs WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 09/13] LoongArch: Humanize the PRMD " WANG Xuerui
` (5 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Example output looks like:
[ xx.xxxxxx] crmd: 000000b0 (-WE DACM=CC DACF=CC +PG -DA -IE PLV0)
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 46 ++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 92a12f544f5e..760119e02820 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -3,6 +3,7 @@
* Author: Huacai Chen <chenhuacai@loongson.cn>
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
*/
+#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/bug.h>
#include <linux/compiler.h>
@@ -156,6 +157,49 @@ static void show_code(unsigned int *pc, bool user)
pr_cont("\n");
}
+static void print_bool_fragment(const char *key, unsigned long val, bool first)
+{
+ /* e.g. "+PG", "-DA" */
+ pr_cont("%s%c%s", first ? "" : " ", val ? '+' : '-', key);
+}
+
+static void print_plv_fragment(const char *key, int val)
+{
+ /* e.g. "PLV0", "PPLV3" */
+ pr_cont(" %s%d", key, val);
+}
+
+static void print_memory_type_fragment(const char *key, unsigned long val)
+{
+ /* e.g. "DATM=WUC" */
+ const char *humanized_type = NULL;
+
+ switch (val) {
+ case 0: humanized_type = "SUC"; break;
+ case 1: humanized_type = "CC"; break;
+ case 2: humanized_type = "WUC"; break;
+ }
+
+ if (humanized_type) {
+ pr_cont(" %s=%s", key, humanized_type);
+ } else {
+ pr_cont(" %s=Reserved(%lu)", key, val);
+ }
+}
+
+static void print_crmd(unsigned long x)
+{
+ pr_cont(" crmd: %08lx (", x);
+ print_bool_fragment("WE", FIELD_GET(CSR_CRMD_WE, x), true);
+ print_memory_type_fragment("DACM", FIELD_GET(CSR_CRMD_DACM, x));
+ print_memory_type_fragment("DACF", FIELD_GET(CSR_CRMD_DACF, x));
+ print_bool_fragment("PG", FIELD_GET(CSR_CRMD_PG, x), false);
+ print_bool_fragment("DA", FIELD_GET(CSR_CRMD_DA, x), false);
+ print_bool_fragment("IE", FIELD_GET(CSR_CRMD_IE, x), false);
+ print_plv_fragment("PLV", (int) FIELD_GET(CSR_CRMD_PLV, x));
+ pr_cont(")\n");
+}
+
static void __show_regs(const struct pt_regs *regs)
{
const int field = 2 * sizeof(unsigned long);
@@ -194,7 +238,7 @@ static void __show_regs(const struct pt_regs *regs)
}
/* Print important CSRs */
- pr_cont(" crmd: %08lx\n", regs->csr_crmd);
+ print_crmd(regs->csr_crmd);
pr_cont(" prmd: %08lx\n", regs->csr_prmd);
pr_cont(" euen: %08lx\n", regs->csr_euen);
pr_cont(" ecfg: %08lx\n", regs->csr_ecfg);
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 09/13] LoongArch: Humanize the PRMD line when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (7 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 08/13] LoongArch: Humanize the CRMD line when showing registers WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 10/13] LoongArch: Humanize the EUEN " WANG Xuerui
` (4 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Example output looks like:
[ xx.xxxxxx] prmd: 00000004 (-PWE +PIE PPLV0)
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 760119e02820..570f93303588 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -200,6 +200,15 @@ static void print_crmd(unsigned long x)
pr_cont(")\n");
}
+static void print_prmd(unsigned long x)
+{
+ pr_cont(" prmd: %08lx (", x);
+ print_bool_fragment("PWE", FIELD_GET(CSR_PRMD_PWE, x), true);
+ print_bool_fragment("PIE", FIELD_GET(CSR_PRMD_PIE, x), false);
+ print_plv_fragment("PPLV", (int) FIELD_GET(CSR_PRMD_PPLV, x));
+ pr_cont(")\n");
+}
+
static void __show_regs(const struct pt_regs *regs)
{
const int field = 2 * sizeof(unsigned long);
@@ -239,7 +248,7 @@ static void __show_regs(const struct pt_regs *regs)
/* Print important CSRs */
print_crmd(regs->csr_crmd);
- pr_cont(" prmd: %08lx\n", regs->csr_prmd);
+ print_prmd(regs->csr_prmd);
pr_cont(" euen: %08lx\n", regs->csr_euen);
pr_cont(" ecfg: %08lx\n", regs->csr_ecfg);
pr_cont("estat: %08lx\n", regs->csr_estat);
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 10/13] LoongArch: Humanize the EUEN line when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (8 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 09/13] LoongArch: Humanize the PRMD " WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 11/13] LoongArch: Humanize the ECFG " WANG Xuerui
` (3 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Example output looks like:
[ xx.xxxxxx] euen: 00000000 (-BTE -ASXE -SXE -FPE)
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 570f93303588..b95e473eee58 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -209,6 +209,16 @@ static void print_prmd(unsigned long x)
pr_cont(")\n");
}
+static void print_euen(unsigned long x)
+{
+ pr_cont(" euen: %08lx (", x);
+ print_bool_fragment("BTE", FIELD_GET(CSR_EUEN_BTE, x), true);
+ print_bool_fragment("ASXE", FIELD_GET(CSR_EUEN_ASXE, x), false);
+ print_bool_fragment("SXE", FIELD_GET(CSR_EUEN_SXE, x), false);
+ print_bool_fragment("FPE", FIELD_GET(CSR_EUEN_FPE, x), false);
+ pr_cont(")\n");
+}
+
static void __show_regs(const struct pt_regs *regs)
{
const int field = 2 * sizeof(unsigned long);
@@ -249,7 +259,7 @@ static void __show_regs(const struct pt_regs *regs)
/* Print important CSRs */
print_crmd(regs->csr_crmd);
print_prmd(regs->csr_prmd);
- pr_cont(" euen: %08lx\n", regs->csr_euen);
+ print_euen(regs->csr_euen);
pr_cont(" ecfg: %08lx\n", regs->csr_ecfg);
pr_cont("estat: %08lx\n", regs->csr_estat);
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 11/13] LoongArch: Humanize the ECFG line when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (9 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 10/13] LoongArch: Humanize the EUEN " WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 12/13] LoongArch: Humanize the ESTAT " WANG Xuerui
` (2 subsequent siblings)
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Example output looks like:
[ xx.xxxxxx] ecfg: 00071c1c (VS=7 LIE=2-4,10-12)
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index b95e473eee58..1d3879d4aeeb 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -187,6 +187,12 @@ static void print_memory_type_fragment(const char *key, unsigned long val)
}
}
+static void print_intr_fragment(const char *key, unsigned long val)
+{
+ /* e.g. "LIE=0-1,3,5-7" */
+ pr_cont(" %s=%*pbl", key, INT_NUM, &val);
+}
+
static void print_crmd(unsigned long x)
{
pr_cont(" crmd: %08lx (", x);
@@ -219,6 +225,13 @@ static void print_euen(unsigned long x)
pr_cont(")\n");
}
+static void print_ecfg(unsigned long x)
+{
+ pr_cont(" ecfg: %08lx (VS=%d", x, (int) FIELD_GET(CSR_ECFG_VS, x));
+ print_intr_fragment("LIE", FIELD_GET(CSR_ECFG_LIE, x));
+ pr_cont(")\n");
+}
+
static void __show_regs(const struct pt_regs *regs)
{
const int field = 2 * sizeof(unsigned long);
@@ -260,7 +273,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);
- pr_cont(" ecfg: %08lx\n", regs->csr_ecfg);
+ print_ecfg(regs->csr_ecfg);
pr_cont("estat: %08lx\n", regs->csr_estat);
exccode = ((regs->csr_estat) & CSR_ESTAT_ECODE) >> CSR_ESTAT_ECODE_SHIFT;
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 12/13] LoongArch: Humanize the ESTAT line when showing registers
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (10 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 11/13] LoongArch: Humanize the ECFG " WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 12:13 ` [PATCH 13/13] LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID lines in show_regs WANG Xuerui
2022-10-24 15:03 ` [PATCH 00/13] LoongArch: Better backtraces Huacai Chen
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Example output looks like:
[ xx.xxxxxx] estat: 00001000 [INT] (EsubCode=0 ECode=0 IS=12)
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 77 +++++++++++++++++++++++++++++++----
1 file changed, 69 insertions(+), 8 deletions(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 1d3879d4aeeb..27a4ac049d64 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -232,11 +232,76 @@ static void print_ecfg(unsigned long x)
pr_cont(")\n");
}
+static const char *humanize_exc_name(unsigned int ecode, unsigned int esubcode)
+{
+ switch (ecode) {
+ case ECODE_INT: return "INT";
+ case ECODE_PIL: return "PIL";
+ case ECODE_PIS: return "PIS";
+ case ECODE_PIF: return "PIF";
+ case ECODE_PME: return "PME";
+ case ECODE_PNR: return "PNR";
+ case ECODE_PNX: return "PNX";
+ case ECODE_PPI: return "PPI";
+ case ECODE_ADE:
+ switch (esubcode) {
+ case ESUBCODE_ADEF: return "ADEF";
+ case ESUBCODE_ADEM: return "ADEM";
+ }
+ break;
+ case ECODE_ALE: return "ALE";
+ case ECODE_BCE: return "BCE";
+ case ECODE_SYS: return "SYS";
+ case ECODE_BRK: return "BRK";
+ case ECODE_INE: return "INE";
+ case ECODE_IPE: return "IPE";
+ case ECODE_FPD: return "FPD";
+ case ECODE_SXD: return "SXD";
+ case ECODE_ASXD: return "ASXD";
+ case ECODE_FPE:
+ switch (esubcode) {
+ case ESUBCODE_FPE: return "FPE";
+ case ESUBCODE_VFPE: return "VFPE";
+ }
+ break;
+ case ECODE_WPE:
+ switch (esubcode) {
+ case ESUBCODE_WPEF: return "WPEF";
+ case ESUBCODE_WPEM: return "WPEM";
+ }
+ break;
+ case ECODE_BTD: return "BTD";
+ case ECODE_BTE: return "BTE";
+ case ECODE_GSPR: return "GSPR";
+ case ECODE_HVC: return "HVC";
+ case ECODE_GCM:
+ switch (esubcode) {
+ case ESUBCODE_GCSC: return "GCSC";
+ case ESUBCODE_GCHC: return "GCHC";
+ }
+ break;
+ }
+
+ return "???";
+}
+
+static void print_estat(unsigned long x)
+{
+ unsigned int ecode = FIELD_GET(CSR_ESTAT_ECODE, x);
+ unsigned int esubcode = FIELD_GET(CSR_ESTAT_ESUBCODE, x);
+
+ pr_cont("estat: %08lx [%s] (EsubCode=%d ECode=%d", x,
+ humanize_exc_name(ecode, esubcode),
+ (int) FIELD_GET(CSR_ESTAT_ESUBCODE, x),
+ (int) FIELD_GET(CSR_ESTAT_ECODE, x));
+ print_intr_fragment("IS", FIELD_GET(CSR_ESTAT_IS, x));
+ pr_cont(")\n");
+}
+
static void __show_regs(const struct pt_regs *regs)
{
const int field = 2 * sizeof(unsigned long);
- unsigned int excsubcode;
- unsigned int exccode;
+ unsigned int ecode = FIELD_GET(CSR_ESTAT_ECODE, regs->csr_estat);
show_regs_print_info(KERN_DEFAULT);
@@ -274,13 +339,9 @@ static void __show_regs(const struct pt_regs *regs)
print_prmd(regs->csr_prmd);
print_euen(regs->csr_euen);
print_ecfg(regs->csr_ecfg);
- pr_cont("estat: %08lx\n", regs->csr_estat);
-
- exccode = ((regs->csr_estat) & CSR_ESTAT_ECODE) >> CSR_ESTAT_ECODE_SHIFT;
- excsubcode = ((regs->csr_estat) & CSR_ESTAT_ESUBCODE) >> CSR_ESTAT_ESUBCODE_SHIFT;
- printk("ExcCode : %x (SubCode %x)\n", exccode, excsubcode);
+ print_estat(regs->csr_estat);
- if (exccode >= ECODE_PIL && exccode <= ECODE_ALE)
+ if (ecode >= ECODE_PIL && ecode <= ECODE_ALE)
printk("BadVA : %0*lx\n", field, regs->csr_badvaddr);
printk("PrId : %08x (%s)\n", read_cpucfg(LOONGARCH_CPUCFG0),
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 13/13] LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID lines in show_regs
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (11 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 12/13] LoongArch: Humanize the ESTAT " WANG Xuerui
@ 2022-10-24 12:13 ` WANG Xuerui
2022-10-24 15:03 ` [PATCH 00/13] LoongArch: Better backtraces Huacai Chen
13 siblings, 0 replies; 17+ messages in thread
From: WANG Xuerui @ 2022-10-24 12:13 UTC (permalink / raw)
To: Huacai Chen; +Cc: loongarch, WANG Xuerui
From: WANG Xuerui <git@xen0n.name>
Signed-off-by: WANG Xuerui <git@xen0n.name>
---
arch/loongarch/kernel/traps.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 27a4ac049d64..d1b9f5a891dd 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -342,9 +342,9 @@ static void __show_regs(const struct pt_regs *regs)
print_estat(regs->csr_estat);
if (ecode >= ECODE_PIL && ecode <= ECODE_ALE)
- printk("BadVA : %0*lx\n", field, regs->csr_badvaddr);
+ printk(" badv: %0*lx\n", field, regs->csr_badvaddr);
- printk("PrId : %08x (%s)\n", read_cpucfg(LOONGARCH_CPUCFG0),
+ printk(" prid: %08x (%s)\n", read_cpucfg(LOONGARCH_CPUCFG0),
cpu_family_string());
}
--
2.38.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual
2022-10-24 12:12 ` [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual WANG Xuerui
@ 2022-10-24 14:53 ` Huacai Chen
2022-10-25 2:49 ` Xi Ruoyao
0 siblings, 1 reply; 17+ messages in thread
From: Huacai Chen @ 2022-10-24 14:53 UTC (permalink / raw)
To: WANG Xuerui; +Cc: loongarch, WANG Xuerui
On Mon, Oct 24, 2022 at 8:13 PM WANG Xuerui <kernel@xen0n.name> wrote:
>
> From: WANG Xuerui <git@xen0n.name>
>
> The current field names of CSR.EUEN and CSR.ECFG are not consistent with
> the LoongArch ISA manual v1.02, and seems to be leftover from an earlier
> time. Change to the ISA manual names.
>
> Signed-off-by: WANG Xuerui <git@xen0n.name>
> ---
> arch/loongarch/include/asm/fpu.h | 10 +++++-----
> arch/loongarch/include/asm/loongarch.h | 22 +++++++++++-----------
> arch/loongarch/kernel/fpu.S | 2 +-
> arch/loongarch/kernel/process.c | 2 +-
> 4 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h
> index 358b254d9c1d..a5015b6536bc 100644
> --- a/arch/loongarch/include/asm/fpu.h
> +++ b/arch/loongarch/include/asm/fpu.h
> @@ -37,13 +37,13 @@ static inline unsigned long mask_fcsr_x(unsigned long fcsr)
>
> static inline int is_fp_enabled(void)
> {
> - return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPEN) ?
> + return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPE) ?
> 1 : 0;
> }
>
> -#define enable_fpu() set_csr_euen(CSR_EUEN_FPEN)
> +#define enable_fpu() set_csr_euen(CSR_EUEN_FPE)
I don't think code should be exactly the same as manual, especially
FPE may be misunderstood as "FP Exception".
Huacai
>
> -#define disable_fpu() clear_csr_euen(CSR_EUEN_FPEN)
> +#define disable_fpu() clear_csr_euen(CSR_EUEN_FPE)
>
> #define clear_fpu_owner() clear_thread_flag(TIF_USEDFPU)
>
> @@ -56,7 +56,7 @@ static inline void __own_fpu(void)
> {
> enable_fpu();
> set_thread_flag(TIF_USEDFPU);
> - KSTK_EUEN(current) |= CSR_EUEN_FPEN;
> + KSTK_EUEN(current) |= CSR_EUEN_FPE;
> }
>
> static inline void own_fpu_inatomic(int restore)
> @@ -83,7 +83,7 @@ static inline void lose_fpu_inatomic(int save, struct task_struct *tsk)
> disable_fpu();
> clear_tsk_thread_flag(tsk, TIF_USEDFPU);
> }
> - KSTK_EUEN(tsk) &= ~(CSR_EUEN_FPEN | CSR_EUEN_LSXEN | CSR_EUEN_LASXEN);
> + KSTK_EUEN(tsk) &= ~(CSR_EUEN_FPE | CSR_EUEN_SXE | CSR_EUEN_ASXE);
> }
>
> static inline void lose_fpu(int save)
> diff --git a/arch/loongarch/include/asm/loongarch.h b/arch/loongarch/include/asm/loongarch.h
> index 7f8d57a61c8b..534352d6ed18 100644
> --- a/arch/loongarch/include/asm/loongarch.h
> +++ b/arch/loongarch/include/asm/loongarch.h
> @@ -295,14 +295,14 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
> #define CSR_PRMD_PPLV (_ULCAST_(0x3) << CSR_PRMD_PPLV_SHIFT)
>
> #define LOONGARCH_CSR_EUEN 0x2 /* Extended unit enable */
> -#define CSR_EUEN_LBTEN_SHIFT 3
> -#define CSR_EUEN_LBTEN (_ULCAST_(0x1) << CSR_EUEN_LBTEN_SHIFT)
> -#define CSR_EUEN_LASXEN_SHIFT 2
> -#define CSR_EUEN_LASXEN (_ULCAST_(0x1) << CSR_EUEN_LASXEN_SHIFT)
> -#define CSR_EUEN_LSXEN_SHIFT 1
> -#define CSR_EUEN_LSXEN (_ULCAST_(0x1) << CSR_EUEN_LSXEN_SHIFT)
> -#define CSR_EUEN_FPEN_SHIFT 0
> -#define CSR_EUEN_FPEN (_ULCAST_(0x1) << CSR_EUEN_FPEN_SHIFT)
> +#define CSR_EUEN_BTE_SHIFT 3
> +#define CSR_EUEN_BTE (_ULCAST_(0x1) << CSR_EUEN_BTE_SHIFT)
> +#define CSR_EUEN_ASXE_SHIFT 2
> +#define CSR_EUEN_ASXE (_ULCAST_(0x1) << CSR_EUEN_ASXE_SHIFT)
> +#define CSR_EUEN_SXE_SHIFT 1
> +#define CSR_EUEN_SXE (_ULCAST_(0x1) << CSR_EUEN_SXE_SHIFT)
> +#define CSR_EUEN_FPE_SHIFT 0
> +#define CSR_EUEN_FPE (_ULCAST_(0x1) << CSR_EUEN_FPE_SHIFT)
>
> #define LOONGARCH_CSR_MISC 0x3 /* Misc config */
>
> @@ -310,9 +310,9 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
> #define CSR_ECFG_VS_SHIFT 16
> #define CSR_ECFG_VS_WIDTH 3
> #define CSR_ECFG_VS (_ULCAST_(0x7) << CSR_ECFG_VS_SHIFT)
> -#define CSR_ECFG_IM_SHIFT 0
> -#define CSR_ECFG_IM_WIDTH 13
> -#define CSR_ECFG_IM (_ULCAST_(0x1fff) << CSR_ECFG_IM_SHIFT)
> +#define CSR_ECFG_LIE_SHIFT 0
> +#define CSR_ECFG_LIE_WIDTH 13
> +#define CSR_ECFG_LIE (_ULCAST_(0x1fff) << CSR_ECFG_LIE_SHIFT)
>
> #define LOONGARCH_CSR_ESTAT 0x5 /* Exception status */
> #define CSR_ESTAT_ESUBCODE_SHIFT 22
> diff --git a/arch/loongarch/kernel/fpu.S b/arch/loongarch/kernel/fpu.S
> index ccde94140c89..7b1691f67509 100644
> --- a/arch/loongarch/kernel/fpu.S
> +++ b/arch/loongarch/kernel/fpu.S
> @@ -175,7 +175,7 @@ SYM_FUNC_END(_restore_fp)
> */
>
> SYM_FUNC_START(_init_fpu)
> - li.w t1, CSR_EUEN_FPEN
> + li.w t1, CSR_EUEN_FPE
> csrxchg t1, t1, LOONGARCH_CSR_EUEN
>
> movgr2fcsr fcsr0, a0
> diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
> index 1256e3582475..b88a5864e03d 100644
> --- a/arch/loongarch/kernel/process.c
> +++ b/arch/loongarch/kernel/process.c
> @@ -79,7 +79,7 @@ void start_thread(struct pt_regs *regs, unsigned long pc, unsigned long sp)
> prmd |= PLV_USER;
> regs->csr_prmd = prmd;
>
> - euen = regs->csr_euen & ~(CSR_EUEN_FPEN);
> + euen = regs->csr_euen & ~(CSR_EUEN_FPE);
> regs->csr_euen = euen;
> lose_fpu(0);
>
> --
> 2.38.0
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 00/13] LoongArch: Better backtraces
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
` (12 preceding siblings ...)
2022-10-24 12:13 ` [PATCH 13/13] LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID lines in show_regs WANG Xuerui
@ 2022-10-24 15:03 ` Huacai Chen
13 siblings, 0 replies; 17+ messages in thread
From: Huacai Chen @ 2022-10-24 15:03 UTC (permalink / raw)
To: WANG Xuerui; +Cc: loongarch, WANG Xuerui
Generally, I agree to improve the output format, but I don't think we
need to modify the register definitions.
Huacai
On Mon, Oct 24, 2022 at 8:13 PM WANG Xuerui <kernel@xen0n.name> wrote:
>
> From: WANG Xuerui <git@xen0n.name>
>
> Hi,
>
> Here are some long overdue cleanups of MIPS legacy stuff from
> arch/loongarch codebase , and a bunch of tweaks to the backtrace code so
> the Quality of Life for unfortunate LoongArch kernel devs (including but
> not limited to, myself) could be marginally improved by relieving them of
> having to mentally decode the register names and CSR bitfields.
>
> Before:
>
> > [ 17.879976] $ 0 : 0000000000000000 9000000000cc980c 90000001002cc000 90000001002cfe30
> > [ 17.887936] $ 4 : 0000000000000010 9000000000f1f770 90000001002cc000 9000000000cc3468
> > [ 17.895895] $ 8 : 900000010028fd00 0000000000000001 000055558e569190 0000000000000004
> > [ 17.903853] $12 : 0000000000000000 0000000000000004 9000000001026000 900000000132b2d8
> > [ 17.911811] $16 : 9000000001026000 000000006674b539 9000000000d51d10 0000000000000001
> > [ 17.919769] $20 : 0000000000000000 900000000025c27c 0000000000000004 0000000000000002
> > [ 17.927727] $24 : 900000000102e5b0 900000000102e508 0000000000000000 0000000000000004
> > [ 17.935686] $28 : 9000000009007840 0000000000000004 0000000000000000 0000000000000004
> > [ 17.943644] era : 90000000002215a0 __arch_cpu_idle+0x20/0x24
> > [ 17.949438] ra : 9000000000cc980c default_idle_call+0x34/0x5c
> > [ 17.955406] CSR crmd: 000000b0
> > [ 17.955408] CSR prmd: 00000004
> > [ 17.958521] CSR euen: 00000000
> > [ 17.961635] CSR ecfg: 00071c1c
> > [ 17.964748] CSR estat: 00001000
> > [ 17.971062] ExcCode : 0 (SubCode 0)
> > [ 17.974522] PrId : 0014c010 (Loongson-64bit)
>
> After:
>
> > [ 45.869200] pc 90000000002215a0 ra 9000000000ce86bc tp 90000001002cc000
> > [ 45.875858] sp 90000001002cfe30 a0 0000000000000018 a1 9000000000f41ee0
> > [ 45.882516] a2 0000000000000001 a3 000000000000000a a4 90000000098032c0
> > [ 45.889173] a5 000000000000001b a6 000000008ea4398a a7 0000000000000004
> > [ 45.895831] t0 0000000000000000 t1 0000000000000004 t2 0000000000003c00
> > [ 45.902488] t3 0000000000cccccd t4 ffffffffffffffff t5 000000010d1ff6c8
> > [ 45.909146] t6 0000000000000000 t7 0000000000000000 t8 000000000000005b
> > [ 45.915803] r21 0000000a390fa6c0 s9 0000000000000001 s0 0000000000000003
> > [ 45.922460] s1 90000000010565c0 s2 9000000001056518 s3 0000000000000000
> > [ 45.929118] s4 0000000000000004 s5 0000000000000004 s6 9000000000228194
> > [ 45.935775] s7 900000000102e220 s8 9000000100093e58
> > [ 45.940704] pc: 90000000002215a0 __arch_cpu_idle+0x20/0x24
> > [ 45.946412] ra: 9000000000ce86bc default_idle_call+0x34/0x5c
> > [ 45.952294] crmd: 000000b0 (-WE DACM=CC DACF=CC +PG -DA -IE PLV0)
> > [ 45.958443] prmd: 00000004 (-PWE +PIE PPLV0)
> > [ 45.962772] euen: 00000000 (-BTE -ASXE -SXE -FPE)
> > [ 45.967532] ecfg: 00071c1c (VS=7 LIE=2-4,10-12)
> > [ 45.972119] estat: 00001000 [INT] (EsubCode=0 ECode=0 IS=12)
> > [ 45.977741] prid: 0014c010 (Loongson-64bit)
>
> Please review, and let the bikeshedding begin!
>
> WANG Xuerui (13):
> LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA
> manual
> LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE
> LoongArch: Unify the exception code definitions with the manual
> LoongArch: Clean up the architectural interrupt definitions
> LoongArch: Print GPRs with ABI names when showing registers
> LoongArch: Print symbol info for PC and $ra only for kernel-mode
> contexts
> LoongArch: Fix format of CSR lines during show_regs
> LoongArch: Humanize the CRMD line when showing registers
> LoongArch: Humanize the PRMD line when showing registers
> LoongArch: Humanize the EUEN line when showing registers
> LoongArch: Humanize the ECFG line when showing registers
> LoongArch: Humanize the ESTAT line when showing registers
> LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID
> lines in show_regs
>
> arch/loongarch/include/asm/fpu.h | 10 +-
> arch/loongarch/include/asm/loongarch.h | 147 ++++++++-------
> arch/loongarch/kernel/fpu.S | 2 +-
> arch/loongarch/kernel/irq.c | 2 +-
> arch/loongarch/kernel/perf_event.c | 2 +-
> arch/loongarch/kernel/process.c | 2 +-
> arch/loongarch/kernel/time.c | 2 +-
> arch/loongarch/kernel/traps.c | 245 ++++++++++++++++++++-----
> arch/loongarch/mm/fault.c | 4 +-
> arch/loongarch/mm/tlb.c | 14 +-
> drivers/irqchip/irq-loongarch-cpu.c | 2 +-
> 11 files changed, 294 insertions(+), 138 deletions(-)
>
> --
> 2.38.0
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual
2022-10-24 14:53 ` Huacai Chen
@ 2022-10-25 2:49 ` Xi Ruoyao
0 siblings, 0 replies; 17+ messages in thread
From: Xi Ruoyao @ 2022-10-25 2:49 UTC (permalink / raw)
To: Huacai Chen, WANG Xuerui; +Cc: loongarch, WANG Xuerui
On Mon, 2022-10-24 at 22:53 +0800, Huacai Chen wrote:
> > diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h
> > index 358b254d9c1d..a5015b6536bc 100644
> > --- a/arch/loongarch/include/asm/fpu.h
> > +++ b/arch/loongarch/include/asm/fpu.h
> > @@ -37,13 +37,13 @@ static inline unsigned long mask_fcsr_x(unsigned long fcsr)
> >
> > static inline int is_fp_enabled(void)
> > {
> > - return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPEN) ?
> > + return (csr_read32(LOONGARCH_CSR_EUEN) & CSR_EUEN_FPE) ?
> > 1 : 0;
> > }
> >
> > -#define enable_fpu() set_csr_euen(CSR_EUEN_FPEN)
> > +#define enable_fpu() set_csr_euen(CSR_EUEN_FPE)
> I don't think code should be exactly the same as manual, especially
> FPE may be misunderstood as "FP Exception".
If I were naming this field I'd say "CSR_EUEN_FP". After all "EN" in
"EUEN" already means "enable".
--
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2022-10-25 2:49 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-24 12:12 [PATCH 00/13] LoongArch: Better backtraces WANG Xuerui
2022-10-24 12:12 ` [PATCH 01/13] LoongArch: Unify CSR.EUEN and CSR.ECFG bitfield names with the ISA manual WANG Xuerui
2022-10-24 14:53 ` Huacai Chen
2022-10-25 2:49 ` Xi Ruoyao
2022-10-24 12:12 ` [PATCH 02/13] LoongArch: Rename CSR_ESTAT_EXC -> CSR_ESTAT_ECODE WANG Xuerui
2022-10-24 12:12 ` [PATCH 03/13] LoongArch: Unify the exception code definitions with the manual WANG Xuerui
2022-10-24 12:12 ` [PATCH 04/13] LoongArch: Clean up the architectural interrupt definitions WANG Xuerui
2022-10-24 12:12 ` [PATCH 05/13] LoongArch: Print GPRs with ABI names when showing registers WANG Xuerui
2022-10-24 12:12 ` [PATCH 06/13] LoongArch: Print symbol info for PC and $ra only for kernel-mode contexts WANG Xuerui
2022-10-24 12:12 ` [PATCH 07/13] LoongArch: Fix format of CSR lines during show_regs WANG Xuerui
2022-10-24 12:13 ` [PATCH 08/13] LoongArch: Humanize the CRMD line when showing registers WANG Xuerui
2022-10-24 12:13 ` [PATCH 09/13] LoongArch: Humanize the PRMD " WANG Xuerui
2022-10-24 12:13 ` [PATCH 10/13] LoongArch: Humanize the EUEN " WANG Xuerui
2022-10-24 12:13 ` [PATCH 11/13] LoongArch: Humanize the ECFG " WANG Xuerui
2022-10-24 12:13 ` [PATCH 12/13] LoongArch: Humanize the ESTAT " WANG Xuerui
2022-10-24 12:13 ` [PATCH 13/13] LoongArch: Use lowercase ISA manual names for BADV and CPUCFG.PRID lines in show_regs WANG Xuerui
2022-10-24 15:03 ` [PATCH 00/13] LoongArch: Better backtraces Huacai Chen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.