Messages in this thread | | | From | hev <> | Date | Wed, 15 Jun 2022 14:57:17 +0800 | Subject | Re: [RFC PATCH v2 2/2] LoongArch: No need to call RESTORE_ALL_AND_RET for all syscalls |
| |
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.
> + 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
| |