Commit 961c5efb authored by Max Filippov's avatar Max Filippov

xtensa: use abi_* register names in the kernel exit code

Using plain register names is prone to errors when code is changed and
new calls are added between the register load and use. Change plain
register names to abi_* names in the call-heavy part of the kernel exit
code to clearly indicate what's supposed to be preserved and what's not.
Re-align code while at it.
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent de4415d0
...@@ -462,11 +462,11 @@ KABI_W or a3, a3, a2 ...@@ -462,11 +462,11 @@ KABI_W or a3, a3, a2
* exception handler and call the exception handler. * exception handler and call the exception handler.
*/ */
l32i abi_arg1, a1, PT_EXCCAUSE # pass EXCCAUSE l32i abi_arg1, a1, PT_EXCCAUSE # pass EXCCAUSE
rsr abi_tmp0, excsave1 rsr abi_tmp0, excsave1
addx4 abi_tmp0, abi_arg1, abi_tmp0 addx4 abi_tmp0, abi_arg1, abi_tmp0
l32i abi_tmp0, abi_tmp0, EXC_TABLE_DEFAULT # load handler l32i abi_tmp0, abi_tmp0, EXC_TABLE_DEFAULT # load handler
mov abi_arg0, a1 # pass stack frame mov abi_arg0, a1 # pass stack frame
/* Call the second-level handler */ /* Call the second-level handler */
...@@ -477,23 +477,23 @@ KABI_W or a3, a3, a2 ...@@ -477,23 +477,23 @@ KABI_W or a3, a3, a2
common_exception_return: common_exception_return:
#if XTENSA_FAKE_NMI #if XTENSA_FAKE_NMI
l32i abi_tmp0, a1, PT_EXCCAUSE l32i abi_tmp0, a1, PT_EXCCAUSE
movi abi_tmp1, EXCCAUSE_MAPPED_NMI movi abi_tmp1, EXCCAUSE_MAPPED_NMI
l32i abi_saved1, a1, PT_PS l32i abi_saved1, a1, PT_PS
beq abi_tmp0, abi_tmp1, .Lrestore_state beq abi_tmp0, abi_tmp1, .Lrestore_state
#endif #endif
.Ltif_loop: .Ltif_loop:
irq_save a2, a3 irq_save abi_tmp0, abi_tmp1
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
abi_call trace_hardirqs_off abi_call trace_hardirqs_off
#endif #endif
/* Jump if we are returning from kernel exceptions. */ /* Jump if we are returning from kernel exceptions. */
l32i abi_saved1, a1, PT_PS l32i abi_saved1, a1, PT_PS
GET_THREAD_INFO(a2, a1) GET_THREAD_INFO(abi_tmp0, a1)
l32i a4, a2, TI_FLAGS l32i abi_saved0, abi_tmp0, TI_FLAGS
_bbci.l abi_saved1, PS_UM_BIT, .Lexit_tif_loop_kernel _bbci.l abi_saved1, PS_UM_BIT, .Lexit_tif_loop_kernel
/* Specific to a user exception exit: /* Specific to a user exception exit:
* We need to check some flags for signal handling and rescheduling, * We need to check some flags for signal handling and rescheduling,
...@@ -502,75 +502,77 @@ common_exception_return: ...@@ -502,75 +502,77 @@ common_exception_return:
* Note that we don't disable interrupts here. * Note that we don't disable interrupts here.
*/ */
_bbsi.l a4, TIF_NEED_RESCHED, .Lresched _bbsi.l abi_saved0, TIF_NEED_RESCHED, .Lresched
movi a2, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NOTIFY_SIGNAL movi abi_tmp0, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NOTIFY_SIGNAL
bnone a4, a2, .Lexit_tif_loop_user bnone abi_saved0, abi_tmp0, .Lexit_tif_loop_user
l32i a4, a1, PT_DEPC l32i abi_tmp0, a1, PT_DEPC
bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, .Lrestore_state bgeui abi_tmp0, VALID_DOUBLE_EXCEPTION_ADDRESS, .Lrestore_state
/* Call do_signal() */ /* Call do_signal() */
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
abi_call trace_hardirqs_on abi_call trace_hardirqs_on
#endif #endif
rsil a2, 0 rsil abi_tmp0, 0
mov abi_arg0, a1 mov abi_arg0, a1
abi_call do_notify_resume # int do_notify_resume(struct pt_regs*) abi_call do_notify_resume # int do_notify_resume(struct pt_regs*)
j .Ltif_loop j .Ltif_loop
.Lresched: .Lresched:
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
abi_call trace_hardirqs_on abi_call trace_hardirqs_on
#endif #endif
rsil a2, 0 rsil abi_tmp0, 0
abi_call schedule # void schedule (void) abi_call schedule # void schedule (void)
j .Ltif_loop j .Ltif_loop
.Lexit_tif_loop_kernel: .Lexit_tif_loop_kernel:
#ifdef CONFIG_PREEMPTION #ifdef CONFIG_PREEMPTION
_bbci.l a4, TIF_NEED_RESCHED, .Lrestore_state _bbci.l abi_saved0, TIF_NEED_RESCHED, .Lrestore_state
/* Check current_thread_info->preempt_count */ /* Check current_thread_info->preempt_count */
l32i a4, a2, TI_PRE_COUNT l32i abi_tmp1, abi_tmp0, TI_PRE_COUNT
bnez a4, .Lrestore_state bnez abi_tmp1, .Lrestore_state
abi_call preempt_schedule_irq abi_call preempt_schedule_irq
#endif #endif
j .Lrestore_state j .Lrestore_state
.Lexit_tif_loop_user: .Lexit_tif_loop_user:
#ifdef CONFIG_HAVE_HW_BREAKPOINT #ifdef CONFIG_HAVE_HW_BREAKPOINT
_bbci.l a4, TIF_DB_DISABLED, 1f _bbci.l abi_saved0, TIF_DB_DISABLED, 1f
abi_call restore_dbreak abi_call restore_dbreak
1: 1:
#endif #endif
#ifdef CONFIG_DEBUG_TLB_SANITY #ifdef CONFIG_DEBUG_TLB_SANITY
l32i a4, a1, PT_DEPC l32i abi_tmp0, a1, PT_DEPC
bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, .Lrestore_state bgeui abi_tmp0, VALID_DOUBLE_EXCEPTION_ADDRESS, .Lrestore_state
abi_call check_tlb_sanity abi_call check_tlb_sanity
#endif #endif
.Lrestore_state: .Lrestore_state:
#ifdef CONFIG_TRACE_IRQFLAGS #ifdef CONFIG_TRACE_IRQFLAGS
extui a4, abi_saved1, PS_INTLEVEL_SHIFT, PS_INTLEVEL_WIDTH extui abi_tmp0, abi_saved1, PS_INTLEVEL_SHIFT, PS_INTLEVEL_WIDTH
bgei a4, LOCKLEVEL, 1f bgei abi_tmp0, LOCKLEVEL, 1f
abi_call trace_hardirqs_on abi_call trace_hardirqs_on
1: 1:
#endif #endif
/* Restore optional registers. */ /*
* Restore optional registers.
* abi_arg* are used as temporary registers here.
*/
load_xtregs_opt a1 a2 a4 a5 a6 a7 PT_XTREGS_OPT load_xtregs_opt a1 abi_tmp0 abi_arg0 abi_arg1 abi_arg2 abi_arg3 PT_XTREGS_OPT
/* Restore SCOMPARE1 */ /* Restore SCOMPARE1 */
#if XCHAL_HAVE_S32C1I #if XCHAL_HAVE_S32C1I
l32i a2, a1, PT_SCOMPARE1 l32i abi_tmp0, a1, PT_SCOMPARE1
wsr a2, scompare1 wsr abi_tmp0, scompare1
#endif #endif
wsr abi_saved1, ps /* disable interrupts */ wsr abi_saved1, ps /* disable interrupts */
_bbci.l abi_saved1, PS_UM_BIT, kernel_exception_exit
_bbci.l abi_saved1, PS_UM_BIT, kernel_exception_exit
user_exception_exit: user_exception_exit:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment