Messages in this thread Patch in this message | | | From | Tiezhu Yang <> | Subject | [RFC PATCH v3 3/3] LoongArch: No need to call RESTORE_ALL_AND_RET for all syscalls | Date | Wed, 15 Jun 2022 18:29:33 +0800 |
| |
In handle_syscall, it is unnecessary to call RESTORE_ALL_AND_RET for all syscalls.
(1) clone and clone3 call RESTORE_STATIC_SOME_SP_AND_RET. (2) rt_sigreturn and 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 | 25 ++++++++++++++++++++++++- 2 files changed, 41 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 a0f7fcc..e27e38b 100644 --- a/arch/loongarch/kernel/entry.S +++ b/arch/loongarch/kernel/entry.S @@ -72,10 +72,33 @@ SYM_FUNC_START(handle_syscall) li.d tp, ~_THREAD_MASK and tp, tp, sp + /* Syscall number held in a7, we can store it in TI_SYSCALL. */ + LONG_S a7, tp, TI_SYSCALL + move a0, sp bl do_syscall - RESTORE_ALL_AND_RET + /* + * Syscall number held in a7 which is stored in TI_SYSCALL. + * clone and clone3 call RESTORE_STATIC_SOME_SP_AND_RET. + * rt_sigreturn and rt_sigsuspend call RESTORE_TEMP_SOME_SP_AND_RET. + * The other syscalls call RESTORE_SOME_SP_AND_RET. + */ + LONG_L t3, tp, TI_SYSCALL + 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
| |