arm64: svc: Ensure hardirq tracing is updated before return
authorWill Deacon <will.deacon@arm.com>
Mon, 30 Jul 2018 16:43:39 +0000 (17:43 +0100)
committerWill Deacon <will.deacon@arm.com>
Mon, 30 Jul 2018 16:43:39 +0000 (17:43 +0100)
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: f37099b6992a ("arm64: convert syscall trace logic to C")
Reported-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/syscall.c

index be00c85..032d223 100644 (file)
@@ -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)) {
                local_daif_mask();
                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;
+               }
                local_daif_restore(DAIF_PROCCTX);
        }