Messages in this thread | | | Subject | Re: [RFC PATCH v2 2/2] LoongArch: No need to call RESTORE_ALL_AND_RET for all syscalls | From | Tiezhu Yang <> | Date | Wed, 15 Jun 2022 16:19:33 +0800 |
| |
On 06/15/2022 02:57 PM, hev wrote: > Hello, > > On Wed, Jun 15, 2022 at 2:38 PM Tiezhu Yang <yangtiezhu@loongson.cn> wrote: >> >> In handle_syscall, it is unnecessary to call RESTORE_ALL_AND_RET >> for all syscalls. >> >> (1) If syscall number is __NR_clone and __NR_clone3, >> call RESTORE_STATIC_SOME_SP_AND_RET. >> (2) If syscall number is __NR_rt_sigreturn and __NR_rt_sigsuspend, >> call RESTORE_TEMP_SOME_SP_AND_RET. >> (3) The other syscalls call RESTORE_SOME_SP_AND_RET. >> >> With this patch, it can reduce many load instructions. >> >> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> >> --- >> arch/loongarch/include/asm/stackframe.h | 17 +++++++++++++++++ >> arch/loongarch/kernel/entry.S | 24 +++++++++++++++++++++++- >> 2 files changed, 40 insertions(+), 1 deletion(-) >> >> diff --git a/arch/loongarch/include/asm/stackframe.h b/arch/loongarch/include/asm/stackframe.h >> index 4ca9530..52649a5f 100644 >> --- a/arch/loongarch/include/asm/stackframe.h >> +++ b/arch/loongarch/include/asm/stackframe.h >> @@ -216,4 +216,21 @@ >> RESTORE_SP_AND_RET \docfi >> .endm >> >> + .macro RESTORE_SOME_SP_AND_RET docfi=0 >> + RESTORE_SOME \docfi >> + RESTORE_SP_AND_RET \docfi >> + .endm >> + >> + .macro RESTORE_STATIC_SOME_SP_AND_RET docfi=0 >> + RESTORE_STATIC \docfi >> + RESTORE_SOME \docfi >> + RESTORE_SP_AND_RET \docfi >> + .endm >> + >> + .macro RESTORE_TEMP_SOME_SP_AND_RET docfi=0 >> + RESTORE_TEMP \docfi >> + RESTORE_SOME \docfi >> + RESTORE_SP_AND_RET \docfi >> + .endm >> + >> #endif /* _ASM_STACKFRAME_H */ >> diff --git a/arch/loongarch/kernel/entry.S b/arch/loongarch/kernel/entry.S >> index 53ce2cb..58fe507 100644 >> --- a/arch/loongarch/kernel/entry.S >> +++ b/arch/loongarch/kernel/entry.S >> @@ -79,7 +79,29 @@ SYM_FUNC_START(handle_syscall) >> move a0, sp >> bl do_syscall >> >> - RESTORE_ALL_AND_RET >> + /* >> + * Syscall number held in a7 which is stored in PT_R11. >> + * If syscall number is __NR_clone and __NR_clone3, >> + * call RESTORE_STATIC_SOME_SP_AND_RET. >> + * If syscall number is __NR_rt_sigreturn and __NR_rt_sigsuspend, >> + * call RESTORE_TEMP_SOME_SP_AND_RET. >> + * The other syscalls call RESTORE_SOME_SP_AND_RET. >> + */ >> + cfi_ld t3, PT_R11 > > I think PT_R11 may be overwritten by the signal handler and the > syscall number is now lost. >
Thank you. Let me use TI_SYSCALL. I will send RFC v3 patch later.
arch/loongarch/include/asm/thread_info.h struct thread_info { struct task_struct *task; /* main task structure */ unsigned long flags; /* low level flags */ unsigned long tp_value; /* thread pointer */ __u32 cpu; /* current CPU */ int preempt_count; /* 0 => preemptible, <0 => BUG */ struct pt_regs *regs; unsigned long syscall; /* syscall number */ unsigned long syscall_work; /* SYSCALL_WORK_ flags */ };
>> + li.w t4, __NR_clone >> + beq t3, t4, 3f >> + li.w t4, __NR_clone3 >> + beq t3, t4, 3f >> + li.w t4, __NR_rt_sigreturn >> + beq t3, t4, 4f >> + li.w t4, __NR_rt_sigsuspend >> + beq t3, t4, 4f >> + >> + RESTORE_SOME_SP_AND_RET >> +3: >> + RESTORE_STATIC_SOME_SP_AND_RET >> +4: >> + RESTORE_TEMP_SOME_SP_AND_RET >> SYM_FUNC_END(handle_syscall) >> >> SYM_CODE_START(ret_from_fork) >> -- >> 2.1.0 >> > > Best regards, > hev >
| |