On Mon, 17 Feb 2025, Dmitry V. Levin wrote:
diff --git a/arch/mips/include/asm/syscall.h b/arch/mips/include/asm/syscall.h index ea050b23d428..b956b015641c 100644 --- a/arch/mips/include/asm/syscall.h +++ b/arch/mips/include/asm/syscall.h @@ -41,6 +41,20 @@ static inline long syscall_get_nr(struct task_struct *task, return task_thread_info(task)->syscall; } +static inline void syscall_set_nr(struct task_struct *task, + struct pt_regs *regs, + int nr) +{ + /* + * New syscall number has to be assigned to regs[2] because + * syscall_trace_entry() loads it from there unconditionally.
That label is called `trace_a_syscall' in arch/mips/kernel/scall64-o32.S instead. To bring some order and avoid an inaccuracy here should the odd one be matched to the other three?
+ * + * Consequently, if the syscall was indirect and nr != __NR_syscall, + * then after this assignment the syscall will cease to be indirect. + */ + task_thread_info(task)->syscall = regs->regs[2] = nr; +} + static inline void mips_syscall_update_nr(struct task_struct *task, struct pt_regs *regs) {
Otherwise: Reviewed-by: Maciej W. Rozycki <macro@xxxxxxxxxxx> for this part, thank you! Maciej