From fb14efd51834ca7645f949e76aa48fb40e7c6621 Mon Sep 17 00:00:00 2001 From: Binbin Zhou Date: Wed, 7 May 2025 12:27:10 +0800 Subject: [PATCH 1/3] LoongArch: Handle fp, lsx, lasx and lbt assembly symbols Like the other relevant symbols, export them and put the function declarations in header files rather than source files. Signed-off-by: Tiezhu Yang Signed-off-by: Kanglong Wang --- arch/loongarch/include/asm/fpu.h | 12 ++++++------ arch/loongarch/include/asm/lbt.h | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h index 45514f314664d..521d82b346484 100644 --- a/arch/loongarch/include/asm/fpu.h +++ b/arch/loongarch/include/asm/fpu.h @@ -29,22 +29,22 @@ void kernel_fpu_end(void); asmlinkage void _init_fpu(unsigned int); asmlinkage void _save_fp(struct loongarch_fpu *); asmlinkage void _restore_fp(struct loongarch_fpu *); -asmlinkage int _save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr); -asmlinkage int _restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr); +extern int _save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr); +extern int _restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr); asmlinkage void _save_lsx(struct loongarch_fpu *fpu); asmlinkage void _restore_lsx(struct loongarch_fpu *fpu); asmlinkage void _init_lsx_upper(void); asmlinkage void _restore_lsx_upper(struct loongarch_fpu *fpu); -asmlinkage int _save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); -asmlinkage int _restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); +extern int _save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); +extern int _restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); asmlinkage void _save_lasx(struct loongarch_fpu *fpu); asmlinkage void _restore_lasx(struct loongarch_fpu *fpu); asmlinkage void _init_lasx_upper(void); asmlinkage void _restore_lasx_upper(struct loongarch_fpu *fpu); -asmlinkage int _save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); -asmlinkage int _restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); +extern int _save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); +extern int _restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr); static inline void enable_lsx(void); static inline void disable_lsx(void); diff --git a/arch/loongarch/include/asm/lbt.h b/arch/loongarch/include/asm/lbt.h index 38566574e5621..b544eef96e357 100644 --- a/arch/loongarch/include/asm/lbt.h +++ b/arch/loongarch/include/asm/lbt.h @@ -15,10 +15,10 @@ asmlinkage void _init_lbt(void); asmlinkage void _save_lbt(struct loongarch_lbt *); asmlinkage void _restore_lbt(struct loongarch_lbt *); -asmlinkage int _save_lbt_context(void __user *regs, void __user *eflags); -asmlinkage int _restore_lbt_context(void __user *regs, void __user *eflags); -asmlinkage int _save_ftop_context(void __user *ftop); -asmlinkage int _restore_ftop_context(void __user *ftop); +extern int _save_lbt_context(void __user *regs, void __user *eflags); +extern int _restore_lbt_context(void __user *regs, void __user *eflags); +extern int _save_ftop_context(void __user *ftop); +extern int _restore_ftop_context(void __user *ftop); static inline int is_lbt_enabled(void) { From e3db33c35308e9736b00f610fa8315c69151eaf6 Mon Sep 17 00:00:00 2001 From: Binbin Zhou Date: Wed, 7 May 2025 12:27:39 +0800 Subject: [PATCH 2/3] LoongArch: Make some signal and ptrace functions non-static So that they can be probed in the kernel modules to do something. Signed-off-by: Tiezhu Yang Signed-off-by: Binbin Zhou Signed-off-by: Kanglong Wang --- arch/loongarch/kernel/ptrace.c | 37 ++++++++++++++++++++++++---------- arch/loongarch/kernel/signal.c | 7 +++++-- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/arch/loongarch/kernel/ptrace.c b/arch/loongarch/kernel/ptrace.c index 8edd0954e55ab..463217eafdccf 100644 --- a/arch/loongarch/kernel/ptrace.c +++ b/arch/loongarch/kernel/ptrace.c @@ -72,9 +72,13 @@ void ptrace_disable(struct task_struct *child) /* regset get/set implementations */ -static int gpr_get(struct task_struct *target, - const struct user_regset *regset, - struct membuf to) +int gpr_get(struct task_struct *target, + const struct user_regset *regset, + struct membuf to); + +int gpr_get(struct task_struct *target, + const struct user_regset *regset, + struct membuf to) { int r; struct pt_regs *regs = task_pt_regs(target); @@ -87,10 +91,15 @@ static int gpr_get(struct task_struct *target, return r; } -static int gpr_set(struct task_struct *target, - const struct user_regset *regset, - unsigned int pos, unsigned int count, - const void *kbuf, const void __user *ubuf) +int gpr_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf); + +int gpr_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf) { int err; int a0_start = sizeof(u64) * GPR_NUM; @@ -950,8 +959,11 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) return &user_loongarch64_view; } -static inline int read_user(struct task_struct *target, unsigned long addr, - unsigned long __user *data) +int read_user(struct task_struct *target, unsigned long addr, + unsigned long __user *data); + +int read_user(struct task_struct *target, unsigned long addr, + unsigned long __user *data) { unsigned long tmp = 0; @@ -975,8 +987,11 @@ static inline int read_user(struct task_struct *target, unsigned long addr, return put_user(tmp, data); } -static inline int write_user(struct task_struct *target, unsigned long addr, - unsigned long data) +int write_user(struct task_struct *target, unsigned long addr, + unsigned long data); + +int write_user(struct task_struct *target, unsigned long addr, + unsigned long data) { switch (addr) { case 0 ... 31: diff --git a/arch/loongarch/kernel/signal.c b/arch/loongarch/kernel/signal.c index d4151d2fb82ee..7be926bdeb28a 100644 --- a/arch/loongarch/kernel/signal.c +++ b/arch/loongarch/kernel/signal.c @@ -932,8 +932,11 @@ SYSCALL_DEFINE0(rt_sigreturn) return 0; } -static int setup_rt_frame(void *sig_return, struct ksignal *ksig, - struct pt_regs *regs, sigset_t *set) +int setup_rt_frame(void *sig_return, struct ksignal *ksig, + struct pt_regs *regs, sigset_t *set); + +int setup_rt_frame(void *sig_return, struct ksignal *ksig, + struct pt_regs *regs, sigset_t *set) { int err = 0; struct extctx_layout extctx; From 5cad5409353553e31d972920179171ccfea90d03 Mon Sep 17 00:00:00 2001 From: Binbin Zhou Date: Wed, 7 May 2025 12:28:10 +0800 Subject: [PATCH 3/3] LoongArch: Export some signal functions So that they can be called in the kernel modules to do something. Signed-off-by: Tiezhu Yang Signed-off-by: Kanglong Wang --- arch/loongarch/kernel/Makefile | 1 + arch/loongarch/kernel/extern.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 arch/loongarch/kernel/extern.c diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile index 53ad38c9c98f5..acd57d0c9b052 100644 --- a/arch/loongarch/kernel/Makefile +++ b/arch/loongarch/kernel/Makefile @@ -7,6 +7,7 @@ OBJECT_FILES_NON_STANDARD_head.o := y always-$(KBUILD_BUILTIN) := vmlinux.lds +obj-y += extern.o obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ traps.o irq.o idle.o process.o dma.o mem.o reset.o switch.o \ elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \ diff --git a/arch/loongarch/kernel/extern.c b/arch/loongarch/kernel/extern.c new file mode 100644 index 0000000000000..11a94c331037e --- /dev/null +++ b/arch/loongarch/kernel/extern.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +void loongarch_set_current_blocked(sigset_t *newset); +int loongarch_copy_siginfo_to_user(siginfo_t __user *to, const kernel_siginfo_t *from); +int loongarch___save_altstack(stack_t __user *uss, unsigned long sp); +int loongarch_restore_altstack(const stack_t __user *uss); + +void loongarch_set_current_blocked(sigset_t *newset) +{ + return set_current_blocked(newset); +} +EXPORT_SYMBOL_GPL(loongarch_set_current_blocked); + +int loongarch_copy_siginfo_to_user(siginfo_t __user *to, const kernel_siginfo_t *from) +{ + return copy_siginfo_to_user(to, from); +} +EXPORT_SYMBOL_GPL(loongarch_copy_siginfo_to_user); + +int loongarch___save_altstack(stack_t __user *uss, unsigned long sp) +{ + return __save_altstack(uss, sp); +} +EXPORT_SYMBOL_GPL(loongarch___save_altstack); + +int loongarch_restore_altstack(const stack_t __user *uss) +{ + return restore_altstack(uss); +} +EXPORT_SYMBOL_GPL(loongarch_restore_altstack);