ARC: entry.S: move some code around for cache locality in return path
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
6d1a20b1d2
commit
c7e6d79204
@ -391,3 +391,5 @@ not_level1_interrupt:
|
|||||||
EXCEPTION_EPILOGUE
|
EXCEPTION_EPILOGUE
|
||||||
debug_marker_syscall:
|
debug_marker_syscall:
|
||||||
rtie
|
rtie
|
||||||
|
|
||||||
|
END(ret_from_exception)
|
||||||
|
@ -24,6 +24,55 @@
|
|||||||
*------------------------------------------------------------------
|
*------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
;################### Special Sys Call Wrappers ##########################
|
||||||
|
|
||||||
|
ENTRY(sys_clone_wrapper)
|
||||||
|
SAVE_CALLEE_SAVED_USER
|
||||||
|
bl @sys_clone
|
||||||
|
DISCARD_CALLEE_SAVED_USER
|
||||||
|
|
||||||
|
GET_CURR_THR_INFO_FLAGS r10
|
||||||
|
btst r10, TIF_SYSCALL_TRACE
|
||||||
|
bnz tracesys_exit
|
||||||
|
|
||||||
|
b ret_from_system_call
|
||||||
|
END(sys_clone_wrapper)
|
||||||
|
|
||||||
|
ENTRY(ret_from_fork)
|
||||||
|
; when the forked child comes here from the __switch_to function
|
||||||
|
; r0 has the last task pointer.
|
||||||
|
; put last task in scheduler queue
|
||||||
|
bl @schedule_tail
|
||||||
|
|
||||||
|
ld r9, [sp, PT_status32]
|
||||||
|
brne r9, 0, 1f
|
||||||
|
|
||||||
|
jl.d [r14] ; kernel thread entry point
|
||||||
|
mov r0, r13 ; (see PF_KTHREAD block in copy_thread)
|
||||||
|
|
||||||
|
1:
|
||||||
|
; Return to user space
|
||||||
|
; 1. Any forked task (Reach here via BRne above)
|
||||||
|
; 2. First ever init task (Reach here via return from JL above)
|
||||||
|
; This is the historic "kernel_execve" use-case, to return to init
|
||||||
|
; user mode, in a round about way since that is always done from
|
||||||
|
; a kernel thread which is executed via JL above but always returns
|
||||||
|
; out whenever kernel_execve (now inline do_fork()) is involved
|
||||||
|
b ret_from_exception
|
||||||
|
END(ret_from_fork)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARC_DW2_UNWIND
|
||||||
|
; Workaround for bug 94179 (STAR ):
|
||||||
|
; Despite -fasynchronous-unwind-tables, linker is not making dwarf2 unwinder
|
||||||
|
; section (.debug_frame) as loadable. So we force it here.
|
||||||
|
; This also fixes STAR 9000487933 where the prev-workaround (objcopy --setflag)
|
||||||
|
; would not work after a clean build due to kernel build system dependencies.
|
||||||
|
.section .debug_frame, "wa",@progbits
|
||||||
|
|
||||||
|
; Reset to .text as this file is included in entry-<isa>.S
|
||||||
|
.section .text, "ax",@progbits
|
||||||
|
#endif
|
||||||
|
|
||||||
;################### Non TLB Exception Handling #############################
|
;################### Non TLB Exception Handling #############################
|
||||||
|
|
||||||
; ---------------------------------------------
|
; ---------------------------------------------
|
||||||
@ -338,53 +387,6 @@ resume_kernel_mode:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
b .Lrestore_regs
|
b .Lrestore_regs
|
||||||
END(ret_from_exception)
|
|
||||||
|
|
||||||
ENTRY(ret_from_fork)
|
##### DONT ADD CODE HERE - .Lrestore_regs actually follows in entry-<isa>.S
|
||||||
; when the forked child comes here from the __switch_to function
|
|
||||||
; r0 has the last task pointer.
|
|
||||||
; put last task in scheduler queue
|
|
||||||
bl @schedule_tail
|
|
||||||
|
|
||||||
ld r9, [sp, PT_status32]
|
|
||||||
brne r9, 0, 1f
|
|
||||||
|
|
||||||
jl.d [r14] ; kernel thread entry point
|
|
||||||
mov r0, r13 ; (see PF_KTHREAD block in copy_thread)
|
|
||||||
|
|
||||||
1:
|
|
||||||
; Return to user space
|
|
||||||
; 1. Any forked task (Reach here via BRne above)
|
|
||||||
; 2. First ever init task (Reach here via return from JL above)
|
|
||||||
; This is the historic "kernel_execve" use-case, to return to init
|
|
||||||
; user mode, in a round about way since that is always done from
|
|
||||||
; a kernel thread which is executed via JL above but always returns
|
|
||||||
; out whenever kernel_execve (now inline do_fork()) is involved
|
|
||||||
b ret_from_exception
|
|
||||||
END(ret_from_fork)
|
|
||||||
|
|
||||||
;################### Special Sys Call Wrappers ##########################
|
|
||||||
|
|
||||||
ENTRY(sys_clone_wrapper)
|
|
||||||
SAVE_CALLEE_SAVED_USER
|
|
||||||
bl @sys_clone
|
|
||||||
DISCARD_CALLEE_SAVED_USER
|
|
||||||
|
|
||||||
GET_CURR_THR_INFO_FLAGS r10
|
|
||||||
btst r10, TIF_SYSCALL_TRACE
|
|
||||||
bnz tracesys_exit
|
|
||||||
|
|
||||||
b ret_from_system_call
|
|
||||||
END(sys_clone_wrapper)
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_DW2_UNWIND
|
|
||||||
; Workaround for bug 94179 (STAR ):
|
|
||||||
; Despite -fasynchronous-unwind-tables, linker is not making dwarf2 unwinder
|
|
||||||
; section (.debug_frame) as loadable. So we force it here.
|
|
||||||
; This also fixes STAR 9000487933 where the prev-workaround (objcopy --setflag)
|
|
||||||
; would not work after a clean build due to kernel build system dependencies.
|
|
||||||
.section .debug_frame, "wa",@progbits
|
|
||||||
|
|
||||||
; Reset to .text as this file is included in entry-<isa>.S
|
|
||||||
.section .text, "ax",@progbits
|
|
||||||
#endif
|
|
||||||
|
Loading…
Reference in New Issue
Block a user