arm64: svc: Ensure hardirq tracing is updated before return
We always run userspace with interrupts enabled, but with the recent
conversion of the syscall entry/exit code to C, we don't inform the
hardirq tracing code that interrupts are about to become enabled by
virtue of restoring the EL0 SPSR.
This patch ensures that trace_hardirqs_on() is called on the syscall
return path when we return to the assembly code with interrupts still
disabled.
Fixes: f37099b699
("arm64: convert syscall trace logic to C")
Reported-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
ba70ffa7d2
commit
efd112353b
|
@ -91,8 +91,15 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
|
||||||
if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) {
|
if (!has_syscall_work(flags) && !IS_ENABLED(CONFIG_DEBUG_RSEQ)) {
|
||||||
local_daif_mask();
|
local_daif_mask();
|
||||||
flags = current_thread_info()->flags;
|
flags = current_thread_info()->flags;
|
||||||
if (!has_syscall_work(flags))
|
if (!has_syscall_work(flags)) {
|
||||||
|
/*
|
||||||
|
* We're off to userspace, where interrupts are
|
||||||
|
* always enabled after we restore the flags from
|
||||||
|
* the SPSR.
|
||||||
|
*/
|
||||||
|
trace_hardirqs_on();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
local_daif_restore(DAIF_PROCCTX);
|
local_daif_restore(DAIF_PROCCTX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue