* [PATCH v2 0/7] riscv: convert bottom half of exception handling to C
@ 2024-07-20 17:12 Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 1/7] riscv: traps: staticalize handle_break() Jisheng Zhang
` (6 more replies)
0 siblings, 7 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
For readability, maintainability and future scalability, convert the
bottom half of the exception handling to C.
During the conversion, I found Anton fixed a performance issue[1]
and my patches will touch the same exception asm code, so this series
is applied against Anton's patch.
patch1 and patch2 are cleanup patches.
patch3~patch7 do the conversion and some cleanup/optimization
after conversion.
Mostly the assembly code is converted to C in a relatively
straightforward manner.
However, there are two modifications I need to mention:
1. the cause I.E the CSR_CAUSE value is passed to do_traps() via. 2nd
param, do_traps() doesn't get it from pt_regs because this way an extra
memory load is needed, the exception handling sits in hot code path,
every instruction matters.
2.To cope with SIFIVE_CIP_453 errata, it looks like we don't need
alternative mechanism any more after the asm->c conversion. Just
replace the excp_vect_table two entries.
Link: https://lore.kernel.org/linux-riscv/20240607061335.2197383-1-cyrilbur@tenstorrent.com/ [1]
since v1:
- add two clean up patches
- remove the two patches which fix imbalance in RAS, instead, explicitly
mark this series is applied against one of them.
- save cause in pt_regs prior to calling do_traps()
- do more clean up and optimization after the asm->c conversion:
staticalize and mark do_irq() as __always_inline.
Jisheng Zhang (7):
riscv: traps: staticalize handle_break()
riscv: traps: remove __visible annotation
riscv: convert bottom half of exception handling to C
riscv: errata: remove ALT_INSN_FAULT and ALT_PAGE_FAULT
riscv: errata: sifive: remove NOMMU handling
riscv: staticalize and remove asmlinkage from updated functions
riscv: traps: mark do_irq() as __always_inline
arch/riscv/errata/sifive/errata.c | 25 +++++++---
arch/riscv/errata/sifive/errata_cip_453.S | 4 --
arch/riscv/include/asm/asm-prototypes.h | 20 +-------
arch/riscv/include/asm/entry-common.h | 1 -
arch/riscv/include/asm/errata_list.h | 21 ++-------
arch/riscv/kernel/entry.S | 57 +----------------------
arch/riscv/kernel/kernel_mode_vector.c | 2 +-
arch/riscv/kernel/traps.c | 55 ++++++++++++++++++----
8 files changed, 73 insertions(+), 112 deletions(-)
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/7] riscv: traps: staticalize handle_break()
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 2/7] riscv: traps: remove __visible annotation Jisheng Zhang
` (5 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
handle_break() is only called in traps.c, make it static.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/include/asm/entry-common.h | 1 -
arch/riscv/kernel/traps.c | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/arch/riscv/include/asm/entry-common.h b/arch/riscv/include/asm/entry-common.h
index 2293e535f865..1458a41c6536 100644
--- a/arch/riscv/include/asm/entry-common.h
+++ b/arch/riscv/include/asm/entry-common.h
@@ -23,7 +23,6 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
void handle_page_fault(struct pt_regs *regs);
-void handle_break(struct pt_regs *regs);
#ifdef CONFIG_RISCV_MISALIGNED
int handle_misaligned_load(struct pt_regs *regs);
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 05a16b1f0aee..84dff89f435d 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -270,7 +270,7 @@ static bool probe_breakpoint_handler(struct pt_regs *regs)
return user ? uprobe_breakpoint_handler(regs) : kprobe_breakpoint_handler(regs);
}
-void handle_break(struct pt_regs *regs)
+static void handle_break(struct pt_regs *regs)
{
if (probe_single_step_handler(regs))
return;
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/7] riscv: traps: remove __visible annotation
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 1/7] riscv: traps: staticalize handle_break() Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 3/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
` (4 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
Commit f307307992bf ("riscv: for C functions called only from assembly,
mark with __visible") resolve sparse warnings for C functions called
only by assembly code by adding __visible annotations instead of
adding prototypes. But after commit 030f1dfa8550 ("riscv: traps: Fix no
prototype warnings"), prototypes were added. So the __visible
annotations are not needed any more, remove them.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/kernel/traps.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 84dff89f435d..3d1f84cb6eac 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -147,7 +147,7 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,
#define __trap_section noinstr
#endif
#define DO_ERROR_INFO(name, signo, code, str) \
-asmlinkage __visible __trap_section void name(struct pt_regs *regs) \
+asmlinkage __trap_section void name(struct pt_regs *regs) \
{ \
if (user_mode(regs)) { \
irqentry_enter_from_user_mode(regs); \
@@ -167,7 +167,7 @@ DO_ERROR_INFO(do_trap_insn_misaligned,
DO_ERROR_INFO(do_trap_insn_fault,
SIGSEGV, SEGV_ACCERR, "instruction access fault");
-asmlinkage __visible __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
+asmlinkage __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
{
bool handled;
@@ -198,7 +198,7 @@ asmlinkage __visible __trap_section void do_trap_insn_illegal(struct pt_regs *re
DO_ERROR_INFO(do_trap_load_fault,
SIGSEGV, SEGV_ACCERR, "load access fault");
-asmlinkage __visible __trap_section void do_trap_load_misaligned(struct pt_regs *regs)
+asmlinkage __trap_section void do_trap_load_misaligned(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -219,7 +219,7 @@ asmlinkage __visible __trap_section void do_trap_load_misaligned(struct pt_regs
}
}
-asmlinkage __visible __trap_section void do_trap_store_misaligned(struct pt_regs *regs)
+asmlinkage __trap_section void do_trap_store_misaligned(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -294,7 +294,7 @@ static void handle_break(struct pt_regs *regs)
die(regs, "Kernel BUG");
}
-asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
+asmlinkage __trap_section void do_trap_break(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -311,7 +311,7 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
}
}
-asmlinkage __visible __trap_section __no_stack_protector
+asmlinkage __trap_section __no_stack_protector
void do_trap_ecall_u(struct pt_regs *regs)
{
if (user_mode(regs)) {
@@ -355,7 +355,7 @@ void do_trap_ecall_u(struct pt_regs *regs)
}
#ifdef CONFIG_MMU
-asmlinkage __visible noinstr void do_page_fault(struct pt_regs *regs)
+asmlinkage noinstr void do_page_fault(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/7] riscv: convert bottom half of exception handling to C
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 1/7] riscv: traps: staticalize handle_break() Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 2/7] riscv: traps: remove __visible annotation Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-11-26 0:08 ` Deepak Gupta
2024-07-20 17:12 ` [PATCH v2 4/7] riscv: errata: remove ALT_INSN_FAULT and ALT_PAGE_FAULT Jisheng Zhang
` (3 subsequent siblings)
6 siblings, 1 reply; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
For readability, maintainability and future scalability, convert the
bottom half of the exception handling to C.
Mostly the assembly code is converted to C in a relatively
straightforward manner.
However, there are two modifications I need to mention:
1. the cause I.E the CSR_CAUSE value is passed to do_traps() via. 2nd
param, do_traps() doesn't get it from pt_regs because this way an extra
memory load is needed, the exception handling sits in hot code path,
every instruction matters.
2.To cope with SIFIVE_CIP_453 errata, it looks like we don't need
alternative mechanism any more after the asm->c conversion. Just
replace the excp_vect_table two entries.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/errata/sifive/errata.c | 25 ++++++++---
arch/riscv/include/asm/asm-prototypes.h | 1 +
arch/riscv/include/asm/errata_list.h | 5 +--
arch/riscv/kernel/entry.S | 57 +------------------------
arch/riscv/kernel/traps.c | 37 ++++++++++++++++
5 files changed, 61 insertions(+), 64 deletions(-)
diff --git a/arch/riscv/errata/sifive/errata.c b/arch/riscv/errata/sifive/errata.c
index 716cfedad3a2..bbba99f207ca 100644
--- a/arch/riscv/errata/sifive/errata.c
+++ b/arch/riscv/errata/sifive/errata.c
@@ -10,9 +10,14 @@
#include <linux/bug.h>
#include <asm/patch.h>
#include <asm/alternative.h>
+#include <asm/csr.h>
#include <asm/vendorid_list.h>
#include <asm/errata_list.h>
+extern void (*excp_vect_table[])(struct pt_regs *regs);
+extern void sifive_cip_453_insn_fault_trp(struct pt_regs *regs);
+extern void sifive_cip_453_page_fault_trp(struct pt_regs *regs);
+
struct errata_info_t {
char name[32];
bool (*check_func)(unsigned long arch_id, unsigned long impid);
@@ -20,6 +25,9 @@ struct errata_info_t {
static bool errata_cip_453_check_func(unsigned long arch_id, unsigned long impid)
{
+ if (!IS_ENABLED(CONFIG_ERRATA_SIFIVE_CIP_453))
+ return false;
+
/*
* Affected cores:
* Architecture ID: 0x8000000000000007
@@ -51,10 +59,6 @@ static bool errata_cip_1200_check_func(unsigned long arch_id, unsigned long imp
}
static struct errata_info_t errata_list[ERRATA_SIFIVE_NUMBER] = {
- {
- .name = "cip-453",
- .check_func = errata_cip_453_check_func
- },
{
.name = "cip-1200",
.check_func = errata_cip_1200_check_func
@@ -62,11 +66,20 @@ static struct errata_info_t errata_list[ERRATA_SIFIVE_NUMBER] = {
};
static u32 __init_or_module sifive_errata_probe(unsigned long archid,
- unsigned long impid)
+ unsigned long impid,
+ unsigned int stage)
{
int idx;
u32 cpu_req_errata = 0;
+ if (stage == RISCV_ALTERNATIVES_BOOT) {
+ if (IS_ENABLED(CONFIG_MMU) &&
+ errata_cip_453_check_func(archid, impid)) {
+ excp_vect_table[EXC_INST_ACCESS] = sifive_cip_453_insn_fault_trp;
+ excp_vect_table[EXC_INST_PAGE_FAULT] = sifive_cip_453_page_fault_trp;
+ }
+ }
+
for (idx = 0; idx < ERRATA_SIFIVE_NUMBER; idx++)
if (errata_list[idx].check_func(archid, impid))
cpu_req_errata |= (1U << idx);
@@ -99,7 +112,7 @@ void sifive_errata_patch_func(struct alt_entry *begin, struct alt_entry *end,
if (stage == RISCV_ALTERNATIVES_EARLY_BOOT)
return;
- cpu_req_errata = sifive_errata_probe(archid, impid);
+ cpu_req_errata = sifive_errata_probe(archid, impid, stage);
for (alt = begin; alt < end; alt++) {
if (alt->vendor_id != SIFIVE_VENDOR_ID)
diff --git a/arch/riscv/include/asm/asm-prototypes.h b/arch/riscv/include/asm/asm-prototypes.h
index cd627ec289f1..c6691e9032dd 100644
--- a/arch/riscv/include/asm/asm-prototypes.h
+++ b/arch/riscv/include/asm/asm-prototypes.h
@@ -55,5 +55,6 @@ DECLARE_DO_ERROR_INFO(do_trap_break);
asmlinkage void handle_bad_stack(struct pt_regs *regs);
asmlinkage void do_page_fault(struct pt_regs *regs);
asmlinkage void do_irq(struct pt_regs *regs);
+asmlinkage void do_traps(struct pt_regs *regs, unsigned long cause);
#endif /* _ASM_RISCV_PROTOTYPES_H */
diff --git a/arch/riscv/include/asm/errata_list.h b/arch/riscv/include/asm/errata_list.h
index 7c8a71a526a3..95b79afc4061 100644
--- a/arch/riscv/include/asm/errata_list.h
+++ b/arch/riscv/include/asm/errata_list.h
@@ -17,9 +17,8 @@
#endif
#ifdef CONFIG_ERRATA_SIFIVE
-#define ERRATA_SIFIVE_CIP_453 0
-#define ERRATA_SIFIVE_CIP_1200 1
-#define ERRATA_SIFIVE_NUMBER 2
+#define ERRATA_SIFIVE_CIP_1200 0
+#define ERRATA_SIFIVE_NUMBER 1
#endif
#ifdef CONFIG_ERRATA_THEAD
diff --git a/arch/riscv/kernel/entry.S b/arch/riscv/kernel/entry.S
index 81dec627a8d4..37c3c2068fef 100644
--- a/arch/riscv/kernel/entry.S
+++ b/arch/riscv/kernel/entry.S
@@ -83,36 +83,10 @@ SYM_CODE_START(handle_exception)
/* Load the kernel shadow call stack pointer if coming from userspace */
scs_load_current_if_task_changed s5
-#ifdef CONFIG_RISCV_ISA_V_PREEMPTIVE
- move a0, sp
- call riscv_v_context_nesting_start
-#endif
move a0, sp /* pt_regs */
-
- /*
- * MSB of cause differentiates between
- * interrupts and exceptions
- */
- bge s4, zero, 1f
-
- /* Handle interrupts */
- call do_irq
+ move a1, s4 /* cause */
+ call do_traps
j ret_from_exception
-1:
- /* Handle other exceptions */
- slli t0, s4, RISCV_LGPTR
- la t1, excp_vect_table
- la t2, excp_vect_table_end
- add t0, t1, t0
- /* Check if exception code lies within bounds */
- bgeu t0, t2, 3f
- REG_L t1, 0(t0)
-2: jalr t1
- j ret_from_exception
-3:
-
- la t1, do_trap_unknown
- j 2b
SYM_CODE_END(handle_exception)
ASM_NOKPROBE(handle_exception)
@@ -329,33 +303,6 @@ SYM_FUNC_START(__switch_to)
ret
SYM_FUNC_END(__switch_to)
-#ifndef CONFIG_MMU
-#define do_page_fault do_trap_unknown
-#endif
-
- .section ".rodata"
- .align LGREG
- /* Exception vector table */
-SYM_DATA_START_LOCAL(excp_vect_table)
- RISCV_PTR do_trap_insn_misaligned
- ALT_INSN_FAULT(RISCV_PTR do_trap_insn_fault)
- RISCV_PTR do_trap_insn_illegal
- RISCV_PTR do_trap_break
- RISCV_PTR do_trap_load_misaligned
- RISCV_PTR do_trap_load_fault
- RISCV_PTR do_trap_store_misaligned
- RISCV_PTR do_trap_store_fault
- RISCV_PTR do_trap_ecall_u /* system call */
- RISCV_PTR do_trap_ecall_s
- RISCV_PTR do_trap_unknown
- RISCV_PTR do_trap_ecall_m
- /* instruciton page fault */
- ALT_PAGE_FAULT(RISCV_PTR do_page_fault)
- RISCV_PTR do_page_fault /* load page fault */
- RISCV_PTR do_trap_unknown
- RISCV_PTR do_page_fault /* store page fault */
-SYM_DATA_END_LABEL(excp_vect_table, SYM_L_LOCAL, excp_vect_table_end)
-
#ifndef CONFIG_MMU
SYM_DATA_START(__user_rt_sigreturn)
li a7, __NR_rt_sigreturn
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 3d1f84cb6eac..3eaa7c72f2be 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -390,6 +390,43 @@ asmlinkage void noinstr do_irq(struct pt_regs *regs)
irqentry_exit(regs, state);
}
+void (*excp_vect_table[])(struct pt_regs *regs) __ro_after_init = {
+ do_trap_insn_misaligned, /* 0 Instruction address misaligned */
+ do_trap_insn_fault, /* 1 Instruction access fault */
+ do_trap_insn_illegal, /* 2 Illegal instruction */
+ do_trap_break, /* 3 Breakpoint */
+ do_trap_load_misaligned, /* 4 Load address misaligned */
+ do_trap_load_fault, /* 5 Load access fault */
+ do_trap_store_misaligned, /* 6 Store/AMO address misaligned */
+ do_trap_store_fault, /* 7 Store/AMO access fault */
+ do_trap_ecall_u, /* 8 Environment call from U-mode */
+ do_trap_ecall_s, /* 9 Environment call from S-mode */
+ do_trap_unknown, /* 10 Reserved */
+ do_trap_ecall_m, /* 11 Environment call from M-mode */
+#ifdef CONFIG_MMU
+ do_page_fault, /* 12 Instruciton page fault */
+ do_page_fault, /* 13 Load page fault */
+ do_trap_unknown, /* 14 Reserved */
+ do_page_fault, /* 15 Store/AMO page fault */
+#endif
+};
+
+asmlinkage void noinstr do_traps(struct pt_regs *regs, unsigned long cause)
+{
+#ifdef CONFIG_RISCV_ISA_V_PREEMPTIVE
+ riscv_v_context_nesting_start(regs);
+#endif
+ if (cause & CAUSE_IRQ_FLAG) {
+ do_irq(regs);
+ } else {
+ if (cause >= ARRAY_SIZE(excp_vect_table)) {
+ do_trap_unknown(regs);
+ return;
+ }
+ excp_vect_table[cause](regs);
+ }
+}
+
#ifdef CONFIG_GENERIC_BUG
int is_valid_bugaddr(unsigned long pc)
{
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/7] riscv: errata: remove ALT_INSN_FAULT and ALT_PAGE_FAULT
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
` (2 preceding siblings ...)
2024-07-20 17:12 ` [PATCH v2 3/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 5/7] riscv: errata: sifive: remove NOMMU handling Jisheng Zhang
` (2 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
They are used for SIFIVE_CIP_453 errata, which has been solved by
replacing the excp_vect_table[] two entries in last commit. So these
two macros are useless now, remove them.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/include/asm/errata_list.h | 16 +---------------
1 file changed, 1 insertion(+), 15 deletions(-)
diff --git a/arch/riscv/include/asm/errata_list.h b/arch/riscv/include/asm/errata_list.h
index 95b79afc4061..46bf00c4a57a 100644
--- a/arch/riscv/include/asm/errata_list.h
+++ b/arch/riscv/include/asm/errata_list.h
@@ -27,21 +27,7 @@
#define ERRATA_THEAD_NUMBER 2
#endif
-#ifdef __ASSEMBLY__
-
-#define ALT_INSN_FAULT(x) \
-ALTERNATIVE(__stringify(RISCV_PTR do_trap_insn_fault), \
- __stringify(RISCV_PTR sifive_cip_453_insn_fault_trp), \
- SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \
- CONFIG_ERRATA_SIFIVE_CIP_453)
-
-#define ALT_PAGE_FAULT(x) \
-ALTERNATIVE(__stringify(RISCV_PTR do_page_fault), \
- __stringify(RISCV_PTR sifive_cip_453_page_fault_trp), \
- SIFIVE_VENDOR_ID, ERRATA_SIFIVE_CIP_453, \
- CONFIG_ERRATA_SIFIVE_CIP_453)
-#else /* !__ASSEMBLY__ */
-
+#ifndef __ASSEMBLY__
#define ALT_SFENCE_VMA_ASID(asid) \
asm(ALTERNATIVE("sfence.vma x0, %0", "sfence.vma", SIFIVE_VENDOR_ID, \
ERRATA_SIFIVE_CIP_1200, CONFIG_ERRATA_SIFIVE_CIP_1200) \
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 5/7] riscv: errata: sifive: remove NOMMU handling
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
` (3 preceding siblings ...)
2024-07-20 17:12 ` [PATCH v2 4/7] riscv: errata: remove ALT_INSN_FAULT and ALT_PAGE_FAULT Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 6/7] riscv: staticalize and remove asmlinkage from updated functions Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 7/7] riscv: traps: mark do_irq() as __always_inline Jisheng Zhang
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
Since NOMMU is now properly handling in generic do_traps() which will
call do_trap_unknown() for instruciton page fault for NOMMU.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/errata/sifive/errata_cip_453.S | 4 ----
1 file changed, 4 deletions(-)
diff --git a/arch/riscv/errata/sifive/errata_cip_453.S b/arch/riscv/errata/sifive/errata_cip_453.S
index b1f7b636fe9a..6f004a1610f6 100644
--- a/arch/riscv/errata/sifive/errata_cip_453.S
+++ b/arch/riscv/errata/sifive/errata_cip_453.S
@@ -23,11 +23,7 @@
SYM_FUNC_START(sifive_cip_453_page_fault_trp)
ADD_SIGN_EXT a0, t0, t1
-#ifdef CONFIG_MMU
la t0, do_page_fault
-#else
- la t0, do_trap_unknown
-#endif
jr t0
SYM_FUNC_END(sifive_cip_453_page_fault_trp)
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 6/7] riscv: staticalize and remove asmlinkage from updated functions
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
` (4 preceding siblings ...)
2024-07-20 17:12 ` [PATCH v2 5/7] riscv: errata: sifive: remove NOMMU handling Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 7/7] riscv: traps: mark do_irq() as __always_inline Jisheng Zhang
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
Now that the callers of these functions have moved into C, they
are only called in trap.c and no longer need the asmlinkage
annotation. So make them static and remove asmlinkage from them.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/include/asm/asm-prototypes.h | 19 +------------------
arch/riscv/kernel/kernel_mode_vector.c | 2 +-
arch/riscv/kernel/traps.c | 16 ++++++++--------
3 files changed, 10 insertions(+), 27 deletions(-)
diff --git a/arch/riscv/include/asm/asm-prototypes.h b/arch/riscv/include/asm/asm-prototypes.h
index c6691e9032dd..067e93e3b400 100644
--- a/arch/riscv/include/asm/asm-prototypes.h
+++ b/arch/riscv/include/asm/asm-prototypes.h
@@ -31,30 +31,13 @@ void xor_regs_5_(unsigned long bytes, unsigned long *__restrict p1,
const unsigned long *__restrict p5);
#ifdef CONFIG_RISCV_ISA_V_PREEMPTIVE
-asmlinkage void riscv_v_context_nesting_start(struct pt_regs *regs);
+void riscv_v_context_nesting_start(struct pt_regs *regs);
asmlinkage void riscv_v_context_nesting_end(struct pt_regs *regs);
#endif /* CONFIG_RISCV_ISA_V_PREEMPTIVE */
#endif /* CONFIG_RISCV_ISA_V */
-#define DECLARE_DO_ERROR_INFO(name) asmlinkage void name(struct pt_regs *regs)
-
-DECLARE_DO_ERROR_INFO(do_trap_unknown);
-DECLARE_DO_ERROR_INFO(do_trap_insn_misaligned);
-DECLARE_DO_ERROR_INFO(do_trap_insn_fault);
-DECLARE_DO_ERROR_INFO(do_trap_insn_illegal);
-DECLARE_DO_ERROR_INFO(do_trap_load_fault);
-DECLARE_DO_ERROR_INFO(do_trap_load_misaligned);
-DECLARE_DO_ERROR_INFO(do_trap_store_misaligned);
-DECLARE_DO_ERROR_INFO(do_trap_store_fault);
-DECLARE_DO_ERROR_INFO(do_trap_ecall_u);
-DECLARE_DO_ERROR_INFO(do_trap_ecall_s);
-DECLARE_DO_ERROR_INFO(do_trap_ecall_m);
-DECLARE_DO_ERROR_INFO(do_trap_break);
-
asmlinkage void handle_bad_stack(struct pt_regs *regs);
-asmlinkage void do_page_fault(struct pt_regs *regs);
-asmlinkage void do_irq(struct pt_regs *regs);
asmlinkage void do_traps(struct pt_regs *regs, unsigned long cause);
#endif /* _ASM_RISCV_PROTOTYPES_H */
diff --git a/arch/riscv/kernel/kernel_mode_vector.c b/arch/riscv/kernel/kernel_mode_vector.c
index 6afe80c7f03a..a6995429ddf5 100644
--- a/arch/riscv/kernel/kernel_mode_vector.c
+++ b/arch/riscv/kernel/kernel_mode_vector.c
@@ -152,7 +152,7 @@ static int riscv_v_start_kernel_context(bool *is_nested)
}
/* low-level V context handling code, called with irq disabled */
-asmlinkage void riscv_v_context_nesting_start(struct pt_regs *regs)
+void riscv_v_context_nesting_start(struct pt_regs *regs)
{
int depth;
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 3eaa7c72f2be..dc1bc84cfe15 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -147,7 +147,7 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,
#define __trap_section noinstr
#endif
#define DO_ERROR_INFO(name, signo, code, str) \
-asmlinkage __trap_section void name(struct pt_regs *regs) \
+static __trap_section void name(struct pt_regs *regs) \
{ \
if (user_mode(regs)) { \
irqentry_enter_from_user_mode(regs); \
@@ -167,7 +167,7 @@ DO_ERROR_INFO(do_trap_insn_misaligned,
DO_ERROR_INFO(do_trap_insn_fault,
SIGSEGV, SEGV_ACCERR, "instruction access fault");
-asmlinkage __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
+static __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
{
bool handled;
@@ -198,7 +198,7 @@ asmlinkage __trap_section void do_trap_insn_illegal(struct pt_regs *regs)
DO_ERROR_INFO(do_trap_load_fault,
SIGSEGV, SEGV_ACCERR, "load access fault");
-asmlinkage __trap_section void do_trap_load_misaligned(struct pt_regs *regs)
+static __trap_section void do_trap_load_misaligned(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -219,7 +219,7 @@ asmlinkage __trap_section void do_trap_load_misaligned(struct pt_regs *regs)
}
}
-asmlinkage __trap_section void do_trap_store_misaligned(struct pt_regs *regs)
+static __trap_section void do_trap_store_misaligned(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -294,7 +294,7 @@ static void handle_break(struct pt_regs *regs)
die(regs, "Kernel BUG");
}
-asmlinkage __trap_section void do_trap_break(struct pt_regs *regs)
+static __trap_section void do_trap_break(struct pt_regs *regs)
{
if (user_mode(regs)) {
irqentry_enter_from_user_mode(regs);
@@ -311,7 +311,7 @@ asmlinkage __trap_section void do_trap_break(struct pt_regs *regs)
}
}
-asmlinkage __trap_section __no_stack_protector
+static __trap_section __no_stack_protector
void do_trap_ecall_u(struct pt_regs *regs)
{
if (user_mode(regs)) {
@@ -355,7 +355,7 @@ void do_trap_ecall_u(struct pt_regs *regs)
}
#ifdef CONFIG_MMU
-asmlinkage noinstr void do_page_fault(struct pt_regs *regs)
+static noinstr void do_page_fault(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);
@@ -378,7 +378,7 @@ static void noinstr handle_riscv_irq(struct pt_regs *regs)
irq_exit_rcu();
}
-asmlinkage void noinstr do_irq(struct pt_regs *regs)
+static void noinstr do_irq(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 7/7] riscv: traps: mark do_irq() as __always_inline
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
` (5 preceding siblings ...)
2024-07-20 17:12 ` [PATCH v2 6/7] riscv: staticalize and remove asmlinkage from updated functions Jisheng Zhang
@ 2024-07-20 17:12 ` Jisheng Zhang
6 siblings, 0 replies; 9+ messages in thread
From: Jisheng Zhang @ 2024-07-20 17:12 UTC (permalink / raw)
To: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Deepak Gupta, Clement Leger
Cc: linux-riscv, linux-kernel
Since do_irq() is only called in traps.c, so mark it as __always_inline
this will allow the compiler to get rid of the stack setup/tear down
code and eliminate a handful of instructions.
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
arch/riscv/kernel/traps.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index dc1bc84cfe15..030c50cb4e78 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -378,7 +378,7 @@ static void noinstr handle_riscv_irq(struct pt_regs *regs)
irq_exit_rcu();
}
-static void noinstr do_irq(struct pt_regs *regs)
+static __always_inline void do_irq(struct pt_regs *regs)
{
irqentry_state_t state = irqentry_enter(regs);
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/7] riscv: convert bottom half of exception handling to C
2024-07-20 17:12 ` [PATCH v2 3/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
@ 2024-11-26 0:08 ` Deepak Gupta
0 siblings, 0 replies; 9+ messages in thread
From: Deepak Gupta @ 2024-11-26 0:08 UTC (permalink / raw)
To: Jisheng Zhang
Cc: Paul Walmsley, Palmer Dabbelt, Albert Ou, Charlie Jenkins,
Clement Leger, linux-riscv, linux-kernel
On Sun, Jul 21, 2024 at 01:12:28AM +0800, Jisheng Zhang wrote:
>For readability, maintainability and future scalability, convert the
>bottom half of the exception handling to C.
>
>Mostly the assembly code is converted to C in a relatively
>straightforward manner.
>
>However, there are two modifications I need to mention:
>
>1. the cause I.E the CSR_CAUSE value is passed to do_traps() via. 2nd
>param, do_traps() doesn't get it from pt_regs because this way an extra
>memory load is needed, the exception handling sits in hot code path,
>every instruction matters.
>
>2.To cope with SIFIVE_CIP_453 errata, it looks like we don't need
>alternative mechanism any more after the asm->c conversion. Just
>replace the excp_vect_table two entries.
>
>Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
>---
> arch/riscv/errata/sifive/errata.c | 25 ++++++++---
> arch/riscv/include/asm/asm-prototypes.h | 1 +
> arch/riscv/include/asm/errata_list.h | 5 +--
> arch/riscv/kernel/entry.S | 57 +------------------------
> arch/riscv/kernel/traps.c | 37 ++++++++++++++++
> 5 files changed, 61 insertions(+), 64 deletions(-)
>
Sorry for noticing it so late. And thanks to Bjorn for pointing it out.
lgtm.
Reviewed-by: Deepak Gupta <debug@rivosinc.com>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-11-26 0:08 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-20 17:12 [PATCH v2 0/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 1/7] riscv: traps: staticalize handle_break() Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 2/7] riscv: traps: remove __visible annotation Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 3/7] riscv: convert bottom half of exception handling to C Jisheng Zhang
2024-11-26 0:08 ` Deepak Gupta
2024-07-20 17:12 ` [PATCH v2 4/7] riscv: errata: remove ALT_INSN_FAULT and ALT_PAGE_FAULT Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 5/7] riscv: errata: sifive: remove NOMMU handling Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 6/7] riscv: staticalize and remove asmlinkage from updated functions Jisheng Zhang
2024-07-20 17:12 ` [PATCH v2 7/7] riscv: traps: mark do_irq() as __always_inline Jisheng Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).