riscv: Add GENERIC_ENTRY, irq stack support
Subsystems (3)
v3 cover riscv: Add GENERIC_ENTRY, irq stack support
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. You can try it directly with [1].
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- Fixup CONFIG_COMPAT=n compile error
- Add THREAD_SIZE_ORDER config
- Optimize elf_kexec.c warning fixup
- Add static to irq_stack_ptr definition
V2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warning
- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv: elf_kexec: Fixup compile warning
riscv: compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: Support HAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: Support HAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack size
arch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++ arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-) create mode 100644 arch/riscv/include/asm/entry-common.h create mode 100644 arch/riscv/include/asm/vmap_stack.h
Signature · 1 line
2.36.1
PATCH v3 1/7 riscv: elf_kexec: Fixup compile warning
From: Guo Ren <[email protected]>
If CRYTPO or CRYPTO_SHA256 or KEXE_FILE is not enabled, then:
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash arch/riscv/
../arch/riscv/kernel/elf_kexec.c: In function 'elf_kexec_load':../arch/riscv/kernel/elf_kexec.c:185:23: warning: variable 'kernel_start' set but not used [-Wunused-but-set-variable]
185 | unsigned long kernel_start;
| ^~~~~~~~~~~~--- arch/riscv/kernel/elf_kexec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/elf_kexec.c +1 -1
@@ -198,7 +198,7 @@ static void *elf_kexec_load(struct kimage *image, char *kernel_buf,if (ret) goto out; kernel_start = image->start; -pr_notice ("The entry point of kernel at 0x%lx\n" , image->start); +pr_notice ("The entry point of kernel at 0x%lx\n" , kernel_start);/* Add the kernel binary to the image */ ret = riscv_kexec_elf_load(image, &ehdr, &elf_info,
Signature · 1 line
2.36.1
PATCH v3 2/7 riscv: compat_syscall_table: Fixup compile warning
In reply to [email protected]From: Guo Ren <[email protected]>
../arch/riscv/kernel/compat_syscall_table.c:12:41: warning: initialized field overwritten [-Woverride-init]
12 | #define __SYSCALL(nr, call) [nr] = (call),
| ^../include/uapi/asm-generic/unistd.h:567:1: note: in expansion of macro '__SYSCALL'
567 | __SYSCALL(__NR_semget, sys_semget)
--- arch/riscv/kernel/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/riscv/kernel/Makefile +1 -0
@@ -9,6 +9,7 @@ CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE) endif CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,) +CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,) ifdef CONFIG_KEXEC AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax)
Signature · 1 line
2.36.1
PATCH v3 3/7 riscv: ptrace: Remove duplicate operation
In reply to [email protected]From: Guo Ren <[email protected]>
The TIF_SYSCALL_TRACE is controlled by a common code, see kernel/ptrace.c and include/linux/thread.h.
clear_task_syscall_work(child, SYSCALL_TRACE);
--- arch/riscv/kernel/ptrace.c | 1 - 1 file changed, 1 deletion(-)
arch/riscv/kernel/ptrace.c +0 -1
@@ -212,7 +212,6 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n)void ptrace_disable (struct task_struct *child) { -clear_tsk_thread_flag (child,TIF_SYSCALL_TRACE ); } long arch_ptrace(struct task_struct *child, long request,
Signature · 7 lines
2.36.1 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
PATCH v3 4/7 riscv: convert to generic entry
In reply to [email protected]From: Guo Ren <[email protected]>
This patch converts riscv to use the generic entry infrastructure from kernel/entry/*. The generic entry makes maintainers' work easier and codes more elegant. Here are the changes than before:
- More clear entry.S with handle_exception and ret_from_exception
- Get rid of complex custom signal implementation
- More readable syscall procedure
- Little modification on ret_from_fork & ret_from_kernel_thread
- Wrap with irqentry_enter/exit and syscall_enter/exit_from_user_mode
- Use the standard preemption code instead of custom
--- arch/riscv/Kconfig | 1 + arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 13 +- arch/riscv/kernel/entry.S | 228 +++----------------------- arch/riscv/kernel/irq.c | 15 ++ arch/riscv/kernel/ptrace.c | 40 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 14 files changed, 117 insertions(+), 281 deletions(-) create mode 100644 arch/riscv/include/asm/entry-common.h
arch/riscv/Kconfig +1 -0
@@ -56,6 +56,7 @@ config RISCV select GENERIC_ATOMIC64 if !64BIT select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_EARLY_IOREMAP + select GENERIC_ENTRY select GENERIC_GETTIMEOFDAY if HAVE_GENERIC_VDSO select GENERIC_IDLE_POLL_SETUP select GENERIC_IOREMAP if MMU
arch/riscv/include/asm/csr.h +0 -1
@@ -40,7 +40,6 @@#define SR_UXL _AC(0x300000000, UL)/* XLEN mask for U-mode */ #define SR_UXL_32 _AC(0x100000000, UL)/* XLEN = 32 for U-mode */ #define SR_UXL_64 _AC(0x200000000, UL)/* XLEN = 64 for U-mode */ -#define SR_UXL_SHIFT 32#endif /* SATP flags */
arch/riscv/include/asm/entry-common.h new file +8 -0
@@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _ASM_RISCV_ENTRY_COMMON_H +#define _ASM_RISCV_ENTRY_COMMON_H + +#include <asm/stacktrace.h> + +#endif /* _ASM_RISCV_ENTRY_COMMON_H */
arch/riscv/include/asm/ptrace.h +8 -2
@@ -53,6 +53,9 @@ struct pt_regs {unsigned long orig_a0; }; +#define PTRACE_SYSEMU 0x1f +#define PTRACE_SYSEMU_SINGLESTEP 0x20 +#ifdef CONFIG_64BIT #define REG_FMT "%016lx"#else
@@ -121,8 +124,6 @@ extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,void prepare_ftrace_return (unsigned long *parent,unsigned long self_addr,unsigned long frame_pointer); -int do_syscall_trace_enter (struct pt_regs *regs); -void do_syscall_trace_exit (struct pt_regs *regs);/** * regs_get_register() - get register value from its offset
@@ -172,6 +173,11 @@ static inline unsigned long regs_get_kernel_argument(struct pt_regs *regs,return 0 ; } +static inline int regs_irqs_disabled (struct pt_regs *regs) +{ +return !(regs->status &SR_IE ); +} +#endif /* __ASSEMBLY__ */ #endif /* _ASM_RISCV_PTRACE_H */
arch/riscv/include/asm/stacktrace.h +5 -0
@@ -16,4 +16,9 @@ extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *reextern void dump_backtrace (struct pt_regs *regs,struct task_struct *task,const char *loglvl); +static inline bool on_thread_stack (void ) +{ +return !(((unsigned long )(current->stack) ^ current_stack_pointer) & ~(THREAD_SIZE -1 )); +} +#endif /* _ASM_RISCV_STACKTRACE_H */
arch/riscv/include/asm/syscall.h +6 -0
@@ -74,5 +74,11 @@ static inline int syscall_get_arch(struct task_struct *task)#endif } +static inline bool arch_syscall_is_vdso_sigreturn (struct pt_regs *regs) +{ +return false; +} +asmlinkage long sys_riscv_flush_icache (uintptr_t ,uintptr_t ,uintptr_t ); +asmlinkage void do_sys_ecall_u(struct pt_regs *regs);#endif /* _ASM_RISCV_SYSCALL_H */
arch/riscv/include/asm/thread_info.h +1 -12
@@ -66,6 +66,7 @@ struct thread_info {long kernel_sp;/* Kernel stack pointer */ long user_sp;/* User stack pointer */ int cpu; +unsigned long syscall_work;/* SYSCALL_WORK_ flags */ };/*
@@ -88,26 +89,18 @@ struct thread_info {* - pending work-to-be-done flags are in lowest half-word * - other flags in upper half-word(s) */ -#define TIF_SYSCALL_TRACE 0/* syscall trace active */ #define TIF_NOTIFY_RESUME 1/* callback before returning to user */ #define TIF_SIGPENDING 2/* signal pending */ #define TIF_NEED_RESCHED 3/* rescheduling necessary */ #define TIF_RESTORE_SIGMASK 4/* restore signal mask in do_signal() */ #define TIF_MEMDIE 5/* is terminating due to OOM killer */ -#define TIF_SYSCALL_TRACEPOINT 6/* syscall tracepoint instrumentation */ -#define TIF_SYSCALL_AUDIT 7/* syscall auditing */ -#define TIF_SECCOMP 8/* syscall secure computing */ #define TIF_NOTIFY_SIGNAL 9/* signal notifications exist */ #define TIF_UPROBE 10/* uprobe breakpoint or singlestep */ #define TIF_32BIT 11/* compat-mode 32bit process */ -#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) -#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) -#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -#define _TIF_SECCOMP (1 << TIF_SECCOMP)#define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)#define _TIF_UPROBE (1 << TIF_UPROBE)
@@ -115,8 +108,4 @@ struct thread_info { (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NEED_RESCHED | \ _TIF_NOTIFY_SIGNAL | _TIF_UPROBE) -#define _TIF_SYSCALL_WORK \ - (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT | \ - _TIF_SECCOMP) -#endif /* _ASM_RISCV_THREAD_INFO_H */
arch/riscv/kernel/entry.S +22 -206
312 lines not on this page · raw message
arch/riscv/kernel/irq.c +15 -0
@@ -5,6 +5,7 @@* Copyright (C) 2018 Christoph Hellwig */ +#include <linux/entry-common.h> #include <linux/interrupt.h> #include <linux/irqchip.h> #include <linux/seq_file.h>
@@ -22,3 +23,17 @@ void __init init_IRQ(void)if (!handle_arch_irq)panic ("No interrupt controller found." ); } + +asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs) +{ +struct pt_regs *old_regs; +irqentry_state_t state =irqentry_enter (regs); + +irq_enter_rcu (); + old_regs =set_irq_regs (regs); +handle_arch_irq (regs); +set_irq_regs (old_regs); +irq_exit_rcu (); + +irqentry_exit (regs, state); +}
arch/riscv/kernel/ptrace.c +0 -40
@@ -228,46 +228,6 @@ long arch_ptrace(struct task_struct *child, long request,return ret; } -/* -* Allows PTRACE_SYSCALL to work. These are called from entry.S in -* {handle,ret_from}_syscall. -*/ -__visible int do_syscall_trace_enter(struct pt_regs *regs) -{ -if (test_thread_flag (TIF_SYSCALL_TRACE )) -if (ptrace_report_syscall_entry (regs)) -return -1 ; - -/* -* Do the secure computing after ptrace; failures should be fast. -* If this fails we might have return value in a0 from seccomp -* (via SECCOMP_RET_ERRNO/TRACE). -*/ -if (secure_computing () ==-1 ) -return -1 ; - -#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS -if (test_thread_flag (TIF_SYSCALL_TRACEPOINT )) -trace_sys_enter (regs,syscall_get_nr (current, regs)); -#endif - -audit_syscall_entry (regs->a7, regs->a0, regs->a1, regs->a2, regs->a3); -return 0 ; -} - -__visible void do_syscall_trace_exit(struct pt_regs *regs) -{ -audit_syscall_exit (regs); - -if (test_thread_flag (TIF_SYSCALL_TRACE )) -ptrace_report_syscall_exit (regs,0 ); - -#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS -if (test_thread_flag (TIF_SYSCALL_TRACEPOINT )) -trace_sys_exit (regs,regs_return_value (regs)); -#endif -} -#ifdef CONFIG_COMPAT static int compat_riscv_gpr_get(struct task_struct *target, const struct user_regset *regset,
arch/riscv/kernel/signal.c +2 -19
@@ -12,6 +12,7 @@#include <linux/syscalls.h> #include <linux/resume_user_mode.h> #include <linux/linkage.h> +#include <linux/entry-common.h> #include <asm/ucontext.h> #include <asm/vdso.h>
@@ -272,7 +273,7 @@ static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)signal_setup_done (ret, ksig,0 ); } -static void do_signal (struct pt_regs *regs) +void arch_do_signal_or_restart (struct pt_regs *regs) {struct ksignal ksig;
@@ -309,21 +310,3 @@ static void do_signal(struct pt_regs *regs)*/ restore_saved_sigmask (); } - -/* -* notification of userspace execution resumption -* - triggered by the _TIF_WORK_MASK flags -*/ -asmlinkage __visible void do_notify_resume(struct pt_regs *regs, -unsigned long thread_info_flags) -{ -if (thread_info_flags & _TIF_UPROBE) -uprobe_notify_resume (regs); - -/* Handle pending signal delivery */ -if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) -do_signal (regs); - -if (thread_info_flags & _TIF_NOTIFY_RESUME) -resume_user_mode_work (regs); -}
arch/riscv/kernel/sys_riscv.c +27 -0
@@ -5,8 +5,10 @@* Copyright (C) 2017 SiFive */ +#include <linux/entry-common.h> #include <linux/syscalls.h> #include <asm/unistd.h> +#include <asm/syscall.h> #include <asm/cacheflush.h> #include <asm-generic/mman-common.h>
@@ -72,3 +74,28 @@ SYSCALL_DEFINE3(riscv_flush_icache, uintptr_t, start, uintptr_t, end,return 0 ; } + +typedef long (*syscall_t )(ulong ,ulong ,ulong ,ulong ,ulong ,ulong ,ulong ); + +asmlinkage void do_sys_ecall_u(struct pt_regs *regs) +{ +syscall_t syscall; +ulong nr = regs->a7; + + regs->epc +=4 ; + regs->orig_a0 = regs->a0; + regs->a0 = -ENOSYS ; + + nr =syscall_enter_from_user_mode (regs, nr); +#ifdef CONFIG_COMPAT +if ((regs->status &SR_UXL ) ==SR_UXL_32 ) + syscall = compat_sys_call_table[nr]; + else +#endif + syscall = sys_call_table[nr]; + +if (nr < NR_syscalls) + regs->a0 =syscall (regs->orig_a0, regs->a1, regs->a2, + regs->a3, regs->a4, regs->a5, regs->a6); +syscall_exit_to_user_mode (regs); +}
arch/riscv/kernel/traps.c +11 -0
@@ -17,6 +17,7 @@#include <linux/module.h> #include <linux/irq.h> #include <linux/kexec.h> +#include <linux/entry-common.h> #include <asm/asm-prototypes.h> #include <asm/bug.h>
@@ -99,7 +100,9 @@ static void do_trap_error(struct pt_regs *regs, int signo, int code,#define DO_ERROR_INFO (name, signo, code, str) \ asmlinkage __visible __trap_section void name(struct pt_regs *regs) \ { \ + irqentry_state_t state = irqentry_enter(regs); \ do_trap_error(regs, signo, code, regs->epc, "Oops - " str); \ + irqentry_exit(regs, state); \ } DO_ERROR_INFO(do_trap_unknown,
@@ -123,18 +126,22 @@ int handle_misaligned_store(struct pt_regs *regs); asmlinkage void __trap_section do_trap_load_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_load (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - load address misaligned" ); +irqentry_exit (regs, state); } asmlinkage void __trap_section do_trap_store_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_store (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - store (or AMO) address misaligned" ); +irqentry_exit (regs, state); }#endif DO_ERROR_INFO(do_trap_store_fault,
@@ -158,6 +165,8 @@ static inline unsigned long get_break_insn_length(unsigned long pc) asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs); +#ifdef CONFIG_KPROBES if (kprobe_single_step_handler (regs))return ;
@@ -185,6 +194,8 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) regs->epc +=get_break_insn_length (regs->epc); else die(regs, "Kernel BUG"); + +irqentry_exit (regs, state); }NOKPROBE_SYMBOL (do_trap_break);
arch/riscv/mm/fault.c +11 -1
@@ -15,6 +15,7 @@#include <linux/uaccess.h> #include <linux/kprobes.h> #include <linux/kfence.h> +#include <linux/entry-common.h> #include <asm/ptrace.h> #include <asm/tlbflush.h>
@@ -203,7 +204,7 @@ static inline bool access_error(unsigned long cause, struct vm_area_struct *vma)* This routine handles page faults. It determines the address and the * problem, and then passes it off to one of the appropriate routines. */ -asmlinkage void do_page_fault(struct pt_regs *regs) +static void __do_page_fault (struct pt_regs *regs) {struct task_struct *tsk;struct vm_area_struct *vma;
@@ -350,4 +351,13 @@ asmlinkage void do_page_fault(struct pt_regs *regs) }return ; } + +asmlinkage void do_page_fault(struct pt_regs *regs) +{ +irqentry_state_t state =irqentry_enter (regs); + +__do_page_fault (regs); + +irqentry_exit (regs, state); +}NOKPROBE_SYMBOL (do_page_fault);
Signature · 7 lines
2.36.1 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
Re: [PATCH V3 4/7] riscv: convert to generic entry
arch/riscv/kernel/irq.c void __init init_IRQ(void) · line 39
Quoted 13 lines · On Mon, Sep 05, 2022 at 11:54:20PM -0400, [email protected] wrote:
arch/riscv/kernel/irq.c +13
-0+asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs) +{ +struct pt_regs *old_regs; +irqentry_state_t state =irqentry_enter (regs); + +irq_enter_rcu (); + old_regs =set_irq_regs (regs); +handle_arch_irq (regs); +set_irq_regs (old_regs); +irq_exit_rcu (); + +irqentry_exit (regs, state); +}
The above is right in that everything that calls irqentry_enter() should be noinstr; however all the below instances get it wrong:
Quoted 49 lines
#define
DO_ERROR_INFO(name, signo, code, str)\
asmlinkage__visible__trap_sectionvoidname(struct pt_regs *regs)\
{ \arch/riscv/kernel/traps.c +10
-0+irqentry_state_t state =irqentry_enter (regs); \do_trap_error (regs, signo, code, regs->epc,"Oops - " str); \ +irqentry_exit (regs, state); \ } DO_ERROR_INFO(do_trap_unknown,@@ -123,18 +126,22 @@ int handle_misaligned_store(struct pt_regs *regs); asmlinkage void __trap_section do_trap_load_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_load (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - load address misaligned" ); +irqentry_exit (regs, state); } asmlinkage void __trap_section do_trap_store_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_store (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - store (or AMO) address misaligned" ); +irqentry_exit (regs, state); }#endif DO_ERROR_INFO(do_trap_store_fault,@@ -158,6 +165,8 @@ static inline unsigned long get_break_insn_length(unsigned long pc) asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs); +#ifdef CONFIG_KPROBES if (kprobe_single_step_handler (regs))return ;@@ -185,6 +194,8 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) regs->epc +=get_break_insn_length (regs->epc); else die(regs, "Kernel BUG"); + +irqentry_exit (regs, state); }NOKPROBE_SYMBOL (do_trap_break);
arch/riscv/kernel/traps.c asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs)
Quoted 10 lines
arch/riscv/kernel/traps.c +8
-0+asmlinkage void do_page_fault(struct pt_regs *regs) +{ +irqentry_state_t state =irqentry_enter (regs); + +__do_page_fault (regs); + +irqentry_exit (regs, state); +}NOKPROBE_SYMBOL (do_page_fault);
Without noinstr the compiler is free to insert instrumentation (think all the k*SAN, KCov, GCov, ftrace etc..) which can call code we're not yet ready to run this early in the entry path, for instance it could rely on RCU which isn't on yet, or expect lockdep state.
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
Re: [PATCH V3 4/7] riscv: convert to generic entry
Quoted 70 lines · Peter Zijlstra
arch/riscv/kernel/irq.c void __init init_IRQ(void) · line 39
Quoted 13 lines · On Mon, Sep 05, 2022 at 11:54:20PM -0400, [email protected] wrote:
arch/riscv/kernel/irq.c +13
-0+asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs) +{ +struct pt_regs *old_regs; +irqentry_state_t state =irqentry_enter (regs); + +irq_enter_rcu (); + old_regs =set_irq_regs (regs); +handle_arch_irq (regs); +set_irq_regs (old_regs); +irq_exit_rcu (); + +irqentry_exit (regs, state); +}The above is right in that everything that calls
irqentry_enter()should be noinstr; however all the below instances get it wrong:Quoted 49 lines
#define
DO_ERROR_INFO(name, signo, code, str)\
asmlinkage__visible__trap_sectionvoidname(struct pt_regs *regs)\
{ \arch/riscv/kernel/traps.c +10
-0+irqentry_state_t state =irqentry_enter (regs); \do_trap_error (regs, signo, code, regs->epc,"Oops - " str); \ +irqentry_exit (regs, state); \ } DO_ERROR_INFO(do_trap_unknown,@@ -123,18 +126,22 @@ int handle_misaligned_store(struct pt_regs *regs); asmlinkage void __trap_section do_trap_load_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_load (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - load address misaligned" ); +irqentry_exit (regs, state); } asmlinkage void __trap_section do_trap_store_misaligned(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs);if (!handle_misaligned_store (regs))return ;do_trap_error (regs,SIGBUS ,BUS_ADRALN , regs->epc,"Oops - store (or AMO) address misaligned" ); +irqentry_exit (regs, state); }#endif DO_ERROR_INFO(do_trap_store_fault,@@ -158,6 +165,8 @@ static inline unsigned long get_break_insn_length(unsigned long pc) asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) { +irqentry_state_t state =irqentry_enter (regs); +#ifdef CONFIG_KPROBES if (kprobe_single_step_handler (regs))return ;@@ -185,6 +194,8 @@ asmlinkage __visible __trap_section void do_trap_break(struct pt_regs *regs) regs->epc +=get_break_insn_length (regs->epc); else die(regs, "Kernel BUG"); + +irqentry_exit (regs, state); }NOKPROBE_SYMBOL (do_trap_break);
Quoted 14 lines
arch/riscv/mm/fault.c asmlinkage void do_page_fault(struct pt_regs *regs) · line 363
Quoted 9 lines
arch/riscv/mm/fault.c +8
-0+asmlinkage void do_page_fault(struct pt_regs *regs) +{ +irqentry_state_t state =irqentry_enter (regs); + +__do_page_fault (regs); + +irqentry_exit (regs, state); +}NOKPROBE_SYMBOL (do_page_fault);Without noinstr the compiler is free to insert instrumentation (think all the k*SAN, KCov, GCov, ftrace etc..) which can call code we're not yet ready to run this early in the entry path, for instance it could rely on RCU which isn't on yet, or expect lockdep state.
I'll add a patch to fix it in the next version. Thx for pointing it out.
Quoted 2 lines
Signature · 2 lines
Best Regards Guo Ren
PATCH v3 5/7 riscv: Support HAVE_IRQ_EXIT_ON_IRQ_STACK
In reply to [email protected]From: Guo Ren <[email protected]>
Add independent irq stacks for percpu to prevent kernel stack overflows. It is also compatible with VMAP_STACK by implementing arch_alloc_vmap_stack. Many architectures have supported HAVE_IRQ_EXIT_ON_IRQ_STACK, riscv should follow up.
--- arch/riscv/Kconfig | 8 +++++ arch/riscv/include/asm/irq.h | 3 ++ arch/riscv/include/asm/thread_info.h | 2 ++ arch/riscv/include/asm/vmap_stack.h | 28 ++++++++++++++++ arch/riscv/kernel/entry.S | 27 ++++++++++++++++ arch/riscv/kernel/irq.c | 48 ++++++++++++++++++++++++++-- 6 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 arch/riscv/include/asm/vmap_stack.h
arch/riscv/Kconfig +8 -0
@@ -433,6 +433,14 @@ config FPU If you don't know what to do here, say Y. +config IRQ_STACKS + bool "Independent irq stacks" + default y + select HAVE_IRQ_EXIT_ON_IRQ_STACK + help + Add independent irq stacks for percpu to prevent kernel stack overflows. + We may save some memory footprint by disabling IRQ_STACKS. + endmenu # "Platform type" menu "Kernel features"
arch/riscv/include/asm/irq.h +3 -0
@@ -13,5 +13,8 @@#include <asm-generic/irq.h> extern void __init init_IRQ (void ); +asmlinkage void call_on_stack(struct pt_regs *regs, ulong *sp, +void (*fn)(struct pt_regs *),ulong tmp); +asmlinkage void noinstr do_riscv_irq(struct pt_regs *regs);#endif /* _ASM_RISCV_IRQ_H */
arch/riscv/include/asm/thread_info.h +2 -0
@@ -40,6 +40,8 @@#define OVERFLOW_STACK_SIZE SZ_4K#define SHADOW_OVERFLOW_STACK_SIZE (1024) +#define IRQ_STACK_SIZE THREAD_SIZE +#ifndef __ASSEMBLY__extern long shadow_stack[SHADOW_OVERFLOW_STACK_SIZE /sizeof (long )];
arch/riscv/include/asm/vmap_stack.h new file +28 -0
@@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copied from arch/arm64/include/asm/vmap_stack.h. +#ifndef _ASM_RISCV_VMAP_STACK_H +#define _ASM_RISCV_VMAP_STACK_H + +#include <linux/bug.h> +#include <linux/gfp.h> +#include <linux/kconfig.h> +#include <linux/vmalloc.h> +#include <linux/pgtable.h> +#include <asm/thread_info.h> + +/* +* To ensure that VMAP'd stack overflow detection works correctly, all VMAP'd +* stacks need to have the same alignment. +*/ +static inline unsigned long *arch_alloc_vmap_stack (size_t stack_size,int node) +{ +void *p; + +BUILD_BUG_ON (!IS_ENABLED (CONFIG_VMAP_STACK )); + + p =__vmalloc_node (stack_size,THREAD_ALIGN ,THREADINFO_GFP , node, +__builtin_return_address (0 )); +return kasan_reset_tag (p); +} + +#endif /* _ASM_RISCV_VMAP_STACK_H */
arch/riscv/kernel/entry.S +27 -0
@@ -332,6 +332,33 @@ ENTRY(ret_from_kernel_thread) tail syscall_exit_to_user_mode ENDPROC(ret_from_kernel_thread) +#ifdef CONFIG_IRQ_STACKS +ENTRY(call_on_stack) + /* Create a frame record to save our ra and fp */ + addi sp, sp, -RISCV_SZPTR + REG_S ra, (sp) + addi sp, sp, -RISCV_SZPTR + REG_S fp, (sp) + + /* Save sp in fp */ + move fp, sp + + /* Move to the new stack and call the function there */ + la a3, IRQ_STACK_SIZE + add sp, a1, a3 + jalr a2 + + /* + * Restore sp from prev fp, and fp, ra from the frame + */ + move sp, fp + REG_L fp, (sp) + addi sp, sp, RISCV_SZPTR + REG_L ra, (sp) + addi sp, sp, RISCV_SZPTR + ret +ENDPROC(call_on_stack) +#endif /* * Integer register context switch
arch/riscv/kernel/irq.c +46 -2
73 lines not on this page · raw message
Signature · 7 lines
2.36.1 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
PATCH v3 6/7 riscv: Support HAVE_SOFTIRQ_ON_OWN_STACK
In reply to [email protected]From: Guo Ren <[email protected]>
Add the HAVE_SOFTIRQ_ON_OWN_STACK feature for the IRQ_STACKS config. The irq and softirq use the same independent irq_stack of percpu by time division multiplexing.
--- arch/riscv/Kconfig | 7 ++++--- arch/riscv/kernel/irq.c | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-)
arch/riscv/Kconfig +4 -3
@@ -434,12 +434,13 @@ config FPU If you don't know what to do here, say Y. config IRQ_STACKS - bool "Independent irq stacks" + bool "Independent irq & softirq stacks" default y select HAVE_IRQ_EXIT_ON_IRQ_STACK + select HAVE_SOFTIRQ_ON_OWN_STACK help - Add independent irq stacks for percpu to prevent kernel stack overflows. - We may save some memory footprint by disabling IRQ_STACKS. + Add independent irq & softirq stacks for percpu to prevent kernel stack + overflows. We may save some memory footprint by disabling IRQ_STACKS. endmenu # "Platform type"
arch/riscv/kernel/irq.c +16 -0
@@ -11,6 +11,7 @@#include <linux/seq_file.h> #include <asm/smp.h> #include <asm/vmap_stack.h> +#include <asm/softirq_stack.h> #ifdef CONFIG_IRQ_STACKS static DEFINE_PER_CPU(ulong *, irq_stack_ptr);
@@ -38,6 +39,21 @@ static void init_irq_stacks(void)per_cpu (irq_stack_ptr, cpu) =per_cpu (irq_stack, cpu); }#endif /* CONFIG_VMAP_STACK */ + +#ifndef CONFIG_PREEMPT_RT +static void do_riscv_softirq (struct pt_regs *regs) +{ +__do_softirq (); +} + +void do_softirq_own_stack (void ) +{ +ulong *sp =per_cpu (irq_stack_ptr,smp_processor_id ()); + +call_on_stack (NULL , sp, do_riscv_softirq,0 ); +} +#endif /* CONFIG_PREEMPT_RT */ +#else static void init_irq_stacks (void ) {}#endif /* CONFIG_IRQ_STACKS */
Signature · 7 lines
2.36.1 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
PATCH v3 7/7 riscv: Add config of thread stack size
In reply to [email protected]From: Guo Ren <[email protected]>
0cac21b02ba5 ("risc v: use 16KB kernel stack on 64-bit") increase the thread size mandatory, but some scenarios, such as D1 with a small memory footprint, would suffer from that. After independent irq stack support, let's give users a choice to determine their custom stack size.
--- arch/riscv/Kconfig | 9 +++++++++ arch/riscv/include/asm/thread_info.h | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-)
arch/riscv/Kconfig +9 -0
@@ -442,6 +442,15 @@ config IRQ_STACKS Add independent irq & softirq stacks for percpu to prevent kernel stack overflows. We may save some memory footprint by disabling IRQ_STACKS. +config THREAD_SIZE_ORDER + int "Pages of thread stack size (as a power of 2)" + range 1 4 + default "1" if 32BIT + default "2" if 64BIT + help + Specify the Pages of thread stack size (from 8KB to 64KB), which also + affects irq stack size, which is equal to thread stack size. + endmenu # "Platform type" menu "Kernel features"
arch/riscv/include/asm/thread_info.h +2 -2
@@ -19,9 +19,9 @@/* thread information allocation */ #ifdef CONFIG_64BIT -#define THREAD_SIZE_ORDER (2 + KASAN_STACK_ORDER) +#define THREAD_SIZE_ORDER (CONFIG_THREAD_SIZE_ORDER + KASAN_STACK_ORDER)#else -#define THREAD_SIZE_ORDER (1 + KASAN_STACK_ORDER) +#define THREAD_SIZE_ORDER (CONFIG_THREAD_SIZE_ORDER + KASAN_STACK_ORDER)#endif #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
Signature · 7 lines
2.36.1 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv
Quoted 6 lines · On 06/09/2022 04:54, [email protected] wrote:
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from
kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add theHAVE_SOFTIRQ_ON_OWN_STACKfeature for theIRQ_STACKSconfig. You can try it directly with [1].
Hey Guo Ren,
I applied this patchset to v6.0-rc4 & ran into a build error:
/stuff/linux/arch/riscv/kernel/entry.S:347:9: error: operand must be a bare symbol name
la a3, ((1 << (12)) << (2 + 0))
^
CC arch/riscv/kernel/process.o
make[5]: *** [/stuff/linux/scripts/Makefile.build:322: arch/riscv/kernel/entry.o] Error 1 make[5]: *** Waiting for unfinished jobs....
Thanks,
Conor.
Quoted 42 lines
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- FixupCONFIG_COMPAT=ncompile error
- AddTHREAD_SIZE_ORDERconfig
- Optimizeelf_kexec.cwarning fixup
- Add static toirq_stack_ptrdefinitionV2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warningReported-by kernel test robot <[email protected]>- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv:elf_kexec: Fixup compile warning
riscv:compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: SupportHAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: SupportHAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack sizearch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++
Quoted 9 lines
arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-) create mode 100644 arch/riscv/include/asm/entry-common.h create mode 100644 arch/riscv/include/asm/vmap_stack.h
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
Quoted 9 lines · On Wed, Sep 7, 2022 at 1:42 AM <[email protected]> wrote:
Quoted 6 lines · On 06/09/2022 04:54, [email protected] wrote:
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from
kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add theHAVE_SOFTIRQ_ON_OWN_STACKfeature for theIRQ_STACKSconfig. You can try it directly with [1].
Quoted 4 lines
Hey Guo Ren,
I applied this patchset to v6.0-rc4 & ran into a build error:
/stuff/linux/arch/riscv/kernel/entry.S:347:9: error: operand must be a bare symbol name
la a3, ((1 << (12)) << (2 + 0))
Yes, please try:
- la a3, IRQ_STACK_SIZE + li a3, IRQ_STACK_SIZE
la is for the symbol, not immediate. But why does my toolchain not report the error?
➜ linux git:(generic_entry_v3) make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- EXTRA_CFLAGS+=-g O=../build-riscv/ -kj62 all -kj
➜ linux git:(generic_entry_v3) riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/11.1.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with:/home/guoren/source/riscv-gnu-toolchain/riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g5964b5cd7272 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket
--with-isa-spec=2.2 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (g5964b5cd7272)
Quoted 58 lines
^CC
arch/riscv/kernel/process.o
make[5]: *** [/stuff/linux/scripts/Makefile.build:322:arch/riscv/kernel/entry.o] Error 1 make[5]: *** Waiting for unfinished jobs....Thanks,
Conor.Quoted 51 lines
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- FixupCONFIG_COMPAT=ncompile error
- AddTHREAD_SIZE_ORDERconfig
- Optimizeelf_kexec.cwarning fixup
- Add static toirq_stack_ptrdefinitionV2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warningReported-by kernel test robot <[email protected]>- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv:elf_kexec: Fixup compile warning
riscv:compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: SupportHAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: SupportHAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack sizearch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++ arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-) create mode 100644 arch/riscv/include/asm/entry-common.h create mode 100644 arch/riscv/include/asm/vmap_stack.h
Signature · 2 lines
Best Regards Guo Ren
Hi Conor,
I've found the root cause, you are using llvm:
$ grep "bare sym" llvm -rn |grep RISCV llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1296: return Error(ErrorLoc, "operand must be a bare symbol name"); llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1304: return Error(ErrorLoc, "operand must be a bare symbol name");
That means we could fix up Binutils with a warning at least.
Thx for pointing it out.
Quoted 111 lines · Guo Ren
Quoted 9 lines · On Wed, Sep 7, 2022 at 1:42 AM <[email protected]> wrote:
Quoted 6 lines · On 06/09/2022 04:54, [email protected] wrote:
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from
kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add theHAVE_SOFTIRQ_ON_OWN_STACKfeature for theIRQ_STACKSconfig. You can try it directly with [1].Quoted 4 lines
Hey Guo Ren,
I applied this patchset to v6.0-rc4 & ran into a build error:
/stuff/linux/arch/riscv/kernel/entry.S:347:9: error: operand must be a bare symbol name
la a3, ((1 << (12)) << (2 + 0))Yes, please try:
(quoted diff) +1
-1- la a3, IRQ_STACK_SIZE + li a3, IRQ_STACK_SIZEla is for the symbol, not immediate. But why does my toolchain not report the error?
➜ linux git:(generic_entry_v3) make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- EXTRA_CFLAGS+=-g O=../build-riscv/ -kj62 all -kj
➜ linux git:(generic_entry_v3) riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/11.1.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with:/home/guoren/source/riscv-gnu-toolchain/riscv-gcc/configure--target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g5964b5cd7272 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket
--with-isa-spec=2.2 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (g5964b5cd7272)Quoted 58 lines
^CC
arch/riscv/kernel/process.o
make[5]: *** [/stuff/linux/scripts/Makefile.build:322:arch/riscv/kernel/entry.o] Error 1 make[5]: *** Waiting for unfinished jobs....Thanks,
Conor.Quoted 51 lines
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- FixupCONFIG_COMPAT=ncompile error
- AddTHREAD_SIZE_ORDERconfig
- Optimizeelf_kexec.cwarning fixup
- Add static toirq_stack_ptrdefinitionV2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warningReported-by kernel test robot <[email protected]>- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv:elf_kexec: Fixup compile warning
riscv:compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: SupportHAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: SupportHAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack sizearch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++ arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-) create mode 100644 arch/riscv/include/asm/entry-common.h create mode 100644 arch/riscv/include/asm/vmap_stack.h--
Best Regards
Guo Ren
Signature · 2 lines
Best Regards Guo Ren
Quoted 5 lines · Guo Ren
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
Hi Conor,
I've found the root cause, you are using llvm:
Yup, probably should have specified - sorry. I didn't realise that that was something GCC wouldn't complain about. It was an LLVM=1 build with clang-15.
I usually do builds with clang while testing patches as it seems to be lesser used.
Thanks,
Conor.
Quoted 129 lines
$ grep "bare sym" llvm -rn |grep RISCV llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1296: return Error(ErrorLoc, "operand must be a bare symbol name"); llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1304: return Error(ErrorLoc, "operand must be a bare symbol name");That means we could fix up Binutils with a warning at least.
Thx for pointing it out.
Quoted 108 lines · Guo Ren
Quoted 9 lines · On Wed, Sep 7, 2022 at 1:42 AM <[email protected]> wrote:
Quoted 6 lines · On 06/09/2022 04:54, [email protected] wrote:
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from
kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add theHAVE_SOFTIRQ_ON_OWN_STACKfeature for theIRQ_STACKSconfig. You can try it directly with [1].Quoted 4 lines
Hey Guo Ren,
I applied this patchset to v6.0-rc4 & ran into a build error:
/stuff/linux/arch/riscv/kernel/entry.S:347:9: error: operand must be a bare symbol name
la a3, ((1 << (12)) << (2 + 0))Yes, please try:
(quoted diff) +1
-1- la a3, IRQ_STACK_SIZE + li a3, IRQ_STACK_SIZEla is for the symbol, not immediate. But why does my toolchain not report the error?
➜ linux git:(generic_entry_v3) make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- EXTRA_CFLAGS+=-g O=../build-riscv/ -kj62 all -kj
➜ linux git:(generic_entry_v3) riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/11.1.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with:/home/guoren/source/riscv-gnu-toolchain/riscv-gcc/configure--target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g5964b5cd7272 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket
--with-isa-spec=2.2 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (g5964b5cd7272)Quoted 58 lines
^CC
arch/riscv/kernel/process.o
make[5]: *** [/stuff/linux/scripts/Makefile.build:322:arch/riscv/kernel/entry.o] Error 1 make[5]: *** Waiting for unfinished jobs....Thanks,
Conor.Quoted 51 lines
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- FixupCONFIG_COMPAT=ncompile error
- AddTHREAD_SIZE_ORDERconfig
- Optimizeelf_kexec.cwarning fixup
- Add static toirq_stack_ptrdefinitionV2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warningReported-by kernel test robot <[email protected]>- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv:elf_kexec: Fixup compile warning
riscv:compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: SupportHAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: SupportHAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack sizearch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++ arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-)create mode 100644
arch/riscv/include/asm/entry-common.hcreate mode 100644arch/riscv/include/asm/vmap_stack.hQuoted 3 lines
--
Best Regards
Guo Ren--
Best Regards
Guo Ren
Quoted 9 lines · On Wed, Sep 7, 2022 at 2:23 PM <[email protected]> wrote:
Quoted 5 lines · Guo Ren
EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
Hi Conor,
I've found the root cause, you are using llvm:
Yup, probably should have specified - sorry. I didn't realise that
It's my typo bug. You reminded me of using clang.
Quoted 139 lines
that was something GCC wouldn't complain about. It was an LLVM=1 build with clang-15.
I usually do builds with clang while testing patches as it seems to be lesser used.
Thanks,
Conor.Quoted 129 lines
$ grep "bare sym" llvm -rn |grep RISCV llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1296: return Error(ErrorLoc, "operand must be a bare symbol name"); llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1304: return Error(ErrorLoc, "operand must be a bare symbol name");That means we could fix up Binutils with a warning at least.
Thx for pointing it out.
Quoted 108 lines · Guo Ren
Quoted 9 lines · On Wed, Sep 7, 2022 at 1:42 AM <[email protected]> wrote:
Quoted 6 lines · On 06/09/2022 04:54, [email protected] wrote:
From: Guo Ren <[email protected]>
The patches convert riscv to use the generic entry infrastructure from
kernel/entry/*. Add independent irq stacks (IRQ_STACKS) for percpu to prevent kernel stack overflows. Add theHAVE_SOFTIRQ_ON_OWN_STACKfeature for theIRQ_STACKSconfig. You can try it directly with [1].Quoted 4 lines
Hey Guo Ren,
I applied this patchset to v6.0-rc4 & ran into a build error:
/stuff/linux/arch/riscv/kernel/entry.S:347:9: error: operand must be a bare symbol name
la a3, ((1 << (12)) << (2 + 0))Yes, please try:
(quoted diff) +1
-1- la a3, IRQ_STACK_SIZE + li a3, IRQ_STACK_SIZEla is for the symbol, not immediate. But why does my toolchain not report the error?
➜ linux git:(generic_entry_v3) make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- EXTRA_CFLAGS+=-g O=../build-riscv/ -kj62 all -kj
➜ linux git:(generic_entry_v3) riscv64-unknown-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/11.1.0/lto-wrapper
Target: riscv64-unknown-linux-gnu
Configured with:/home/guoren/source/riscv-gnu-toolchain/riscv-gcc/configure--target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-pkgversion=g5964b5cd7272 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=.././riscv-gcc --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket
--with-isa-spec=2.2 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow'
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.1.0 (g5964b5cd7272)Quoted 58 lines
^CC
arch/riscv/kernel/process.o
make[5]: *** [/stuff/linux/scripts/Makefile.build:322:arch/riscv/kernel/entry.o] Error 1 make[5]: *** Waiting for unfinished jobs....Thanks,
Conor.Quoted 51 lines
[1] https://github.com/guoren83/linux/tree/generic_entry_v3
V3:
- FixupCONFIG_COMPAT=ncompile error
- AddTHREAD_SIZE_ORDERconfig
- Optimizeelf_kexec.cwarning fixup
- Add static toirq_stack_ptrdefinitionV2:
- Fixup compile error by include "riscv: ptrace: Remove duplicate operation"
- Fixup compile warningReported-by kernel test robot <[email protected]>- Add test repo link in cover letter
V1:
Guo Ren (7):
riscv:elf_kexec: Fixup compile warning
riscv:compat_syscall_table: Fixup compile warning
riscv: ptrace: Remove duplicate operation
riscv: convert to generic entry
riscv: SupportHAVE_IRQ_EXIT_ON_IRQ_STACK
riscv: SupportHAVE_SOFTIRQ_ON_OWN_STACK
riscv: Add config of thread stack sizearch/riscv/Kconfig | 19 ++ arch/riscv/include/asm/csr.h | 1 - arch/riscv/include/asm/entry-common.h | 8 + arch/riscv/include/asm/irq.h | 3 + arch/riscv/include/asm/ptrace.h | 10 +- arch/riscv/include/asm/stacktrace.h | 5 + arch/riscv/include/asm/syscall.h | 6 + arch/riscv/include/asm/thread_info.h | 19 +- arch/riscv/include/asm/vmap_stack.h | 28 +++ arch/riscv/kernel/Makefile | 1 + arch/riscv/kernel/elf_kexec.c | 2 +- arch/riscv/kernel/entry.S | 255 +++++--------------------- arch/riscv/kernel/irq.c | 75 ++++++++ arch/riscv/kernel/ptrace.c | 41 ----- arch/riscv/kernel/signal.c | 21 +-- arch/riscv/kernel/sys_riscv.c | 27 +++ arch/riscv/kernel/traps.c | 11 ++ arch/riscv/mm/fault.c | 12 +- 18 files changed, 259 insertions(+), 285 deletions(-)create mode 100644
arch/riscv/include/asm/entry-common.hcreate mode 100644arch/riscv/include/asm/vmap_stack.hQuoted 3 lines
--
Best Regards
Guo Ren--
Best Regards
Guo Ren
Signature · 2 lines
Best Regards Guo Ren