Messages in this thread Patch in this message | | | From | Tiezhu Yang <> | Subject | [RFC PATCH v2 2/2] LoongArch: No need to call RESTORE_ALL_AND_RET for all syscalls | Date | Wed, 15 Jun 2022 14:37:59 +0800 |
| |
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 + 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
| |