ARM: avoid saving and restoring registers unnecessarily
authorRussell King <rmk+kernel@armlinux.org.uk>
Fri, 24 Mar 2017 16:23:25 +0000 (16:23 +0000)
committerRussell King <rmk+kernel@armlinux.org.uk>
Wed, 2 Aug 2017 13:15:04 +0000 (14:15 +0100)
Avoid repeatedly saving and restoring registers around the calls to
trace_hardirqs_on() and context_tracking_user_exit().  With the
previous changes, we no longer need to preserve "lr" across these
calls, and if we re-load r0-r3 later, we can avoid preserving these
regsiters too.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
arch/arm/kernel/entry-common.S

index 1b3fc79d0e8b2d35aaf77f20ae59b32457822a63..0b60adf4a5d9b4185d651b985c73f50a48ae8850 100644 (file)
@@ -157,8 +157,9 @@ ENTRY(vector_swi)
 #endif
        zero_fp
        alignment_trap r10, ip, __cr_alignment
-       enable_irq
-       ct_user_exit
+       asm_trace_hardirqs_on save=0
+       enable_irq_notrace
+       ct_user_exit save=0
 
        /*
         * Get the system call number.
@@ -216,6 +217,11 @@ ENTRY(vector_swi)
        eor     scno, scno, #__NR_SYSCALL_BASE  @ check OS number
 #endif
        get_thread_info tsk
+       /*
+        * Reload the registers that may have been corrupted on entry to
+        * the syscall assembly (by tracing or context tracking.)
+        */
+ TRACE(        ldmia   sp, {r0 - r3}           )
 
 local_restart:
        ldr     r10, [tsk, #TI_FLAGS]           @ check for syscall tracing