|
@@ -221,6 +221,8 @@ alternative_else_nop_endif
|
|
|
|
|
|
.macro kernel_exit, el
|
|
|
.if \el != 0
|
|
|
+ disable_daif
|
|
|
+
|
|
|
/* Restore the task's original addr_limit. */
|
|
|
ldr x20, [sp, #S_ORIG_ADDR_LIMIT]
|
|
|
str x20, [tsk, #TSK_TI_ADDR_LIMIT]
|
|
@@ -517,8 +519,6 @@ el1_da:
|
|
|
mov x2, sp // struct pt_regs
|
|
|
bl do_mem_abort
|
|
|
|
|
|
- // disable interrupts before pulling preserved data off the stack
|
|
|
- disable_irq
|
|
|
kernel_exit 1
|
|
|
el1_sp_pc:
|
|
|
/*
|
|
@@ -793,7 +793,7 @@ ENDPROC(el0_irq)
|
|
|
* and this includes saving x0 back into the kernel stack.
|
|
|
*/
|
|
|
ret_fast_syscall:
|
|
|
- disable_irq // disable interrupts
|
|
|
+ disable_daif
|
|
|
str x0, [sp, #S_X0] // returned x0
|
|
|
ldr x1, [tsk, #TSK_TI_FLAGS] // re-check for syscall tracing
|
|
|
and x2, x1, #_TIF_SYSCALL_WORK
|
|
@@ -803,7 +803,7 @@ ret_fast_syscall:
|
|
|
enable_step_tsk x1, x2
|
|
|
kernel_exit 0
|
|
|
ret_fast_syscall_trace:
|
|
|
- enable_irq // enable interrupts
|
|
|
+ enable_daif
|
|
|
b __sys_trace_return_skipped // we already saved x0
|
|
|
|
|
|
/*
|
|
@@ -821,7 +821,7 @@ work_pending:
|
|
|
* "slow" syscall return path.
|
|
|
*/
|
|
|
ret_to_user:
|
|
|
- disable_irq // disable interrupts
|
|
|
+ disable_daif
|
|
|
ldr x1, [tsk, #TSK_TI_FLAGS]
|
|
|
and x2, x1, #_TIF_WORK_MASK
|
|
|
cbnz x2, work_pending
|