Merge branch 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Sep 2017 13:10:44 +0000 (06:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Sep 2017 13:10:44 +0000 (06:10 -0700)
Pull ARM updates from Russell King:
 "Low priority fixes and updates for ARM:

   - add some missing includes

   - efficiency improvements in system call entry code when tracing is
     enabled

   - ensure ARMv6+ is always built as EABI

   - export save_stack_trace_tsk()

   - fix fatal signal handling during mm fault

   - build translation table base address register from scratch

   - appropriately align the .data section to a word boundary where we
     rely on that data being word aligned"

* 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm:
  ARM: 8691/1: Export save_stack_trace_tsk()
  ARM: 8692/1: mm: abort uaccess retries upon fatal signal
  ARM: 8690/1: lpae: build TTB control register value from scratch in v7_ttb_setup
  ARM: align .data section
  ARM: always enable AEABI for ARMv6+
  ARM: avoid saving and restoring registers unnecessarily
  ARM: move PC value into r9
  ARM: obtain thread info structure later
  ARM: use aliases for registers in entry-common
  ARM: 8689/1: scu: add missing errno include
  ARM: 8688/1: pm: add missing types include

1  2 
arch/arm/Kconfig
arch/arm/include/debug/omap2plus.S
arch/arm/kernel/entry-common.S

diff --combined arch/arm/Kconfig
index f1b3f1d575d47b0b6a19daeaab685daf143f2f44,1cd85410a89a79385c06419e8559ac24ce1de4a7..7888c9803eb00b3ad1d166923182d5d1f4294bda
@@@ -50,7 -50,7 +50,7 @@@ config AR
        select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
        select HAVE_ARCH_TRACEHOOK
        select HAVE_ARM_SMCCC if CPU_V7
 -      select HAVE_CBPF_JIT
 +      select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32
        select HAVE_CC_STACKPROTECTOR
        select HAVE_CONTEXT_TRACKING
        select HAVE_C_RECORDMCOUNT
@@@ -380,7 -380,7 +380,7 @@@ config ARCH_EP93X
        bool "EP93xx-based"
        select ARCH_HAS_HOLES_MEMORYMODEL
        select ARM_AMBA
 -      select ARM_PATCH_PHYS_VIRT
 +      imply ARM_PATCH_PHYS_VIRT
        select ARM_VIC
        select AUTO_ZRELADDR
        select CLKDEV_LOOKUP
@@@ -1531,7 -1531,6 +1531,6 @@@ config THUMB2_KERNE
        bool "Compile the kernel in Thumb-2 mode" if !CPU_THUMBONLY
        depends on (CPU_V7 || CPU_V7M) && !CPU_V6 && !CPU_V6K
        default y if CPU_THUMBONLY
-       select AEABI
        select ARM_ASM_UNIFIED
        select ARM_UNWIND
        help
@@@ -1594,7 -1593,8 +1593,8 @@@ config ARM_PATCH_IDI
          code to do integer division.
  
  config AEABI
-       bool "Use the ARM EABI to compile the kernel"
+       bool "Use the ARM EABI to compile the kernel" if !CPU_V7 && !CPU_V7M && !CPU_V6 && !CPU_V6K
+       default CPU_V7 || CPU_V7M || CPU_V6 || CPU_V6K
        help
          This option allows for the kernel to be compiled using the latest
          ARM ABI (aka EABI).  This is only useful if you are using a user
index 8be08d907a16990a3516d32d085188fcc962822b,78e7e58a58f6fdfd10c6ed0b6e1376f0aad2c097..192a7583999ce7c5ebc26f012342e831d7d657fb
  
  #include <linux/serial_reg.h>
  
 -/* OMAP2 serial ports */
 -#define OMAP2_UART1_BASE      0x4806a000
 -#define OMAP2_UART2_BASE      0x4806c000
 -#define OMAP2_UART3_BASE      0x4806e000
 -
 -/* OMAP3 serial ports */
 -#define OMAP3_UART1_BASE      OMAP2_UART1_BASE
 -#define OMAP3_UART2_BASE      OMAP2_UART2_BASE
 -#define OMAP3_UART3_BASE      0x49020000
 -#define OMAP3_UART4_BASE      0x49042000      /* Only on 36xx */
 -#define OMAP3_UART4_AM35XX_BASE       0x4809E000      /* Only on AM35xx */
 -
 -/* OMAP4 serial ports */
 -#define OMAP4_UART1_BASE      OMAP2_UART1_BASE
 -#define OMAP4_UART2_BASE      OMAP2_UART2_BASE
 -#define OMAP4_UART3_BASE      0x48020000
 -#define OMAP4_UART4_BASE      0x4806e000
 -
 -/* TI81XX serial ports */
 -#define TI81XX_UART1_BASE     0x48020000
 -#define TI81XX_UART2_BASE     0x48022000
 -#define TI81XX_UART3_BASE     0x48024000
 -
 -/* AM3505/3517 UART4 */
 -#define AM35XX_UART4_BASE     0x4809E000      /* Only on AM3505/3517 */
 -
 -/* AM33XX serial port */
 -#define AM33XX_UART1_BASE     0x44E09000
 -
 -/* OMAP5 serial ports */
 -#define OMAP5_UART1_BASE      OMAP2_UART1_BASE
 -#define OMAP5_UART2_BASE      OMAP2_UART2_BASE
 -#define OMAP5_UART3_BASE      OMAP4_UART3_BASE
 -#define OMAP5_UART4_BASE      OMAP4_UART4_BASE
 -#define OMAP5_UART5_BASE      0x48066000
 -#define OMAP5_UART6_BASE      0x48068000
 -
  /* External port on Zoom2/3 */
  #define ZOOM_UART_BASE                0x10000000
  #define ZOOM_UART_VIRT                0xfa400000
@@@ -22,6 -59,7 +22,7 @@@
  #define UART_OFFSET(addr)     ((addr) & 0x00ffffff)
  
                .pushsection .data
+               .align  2
  omap_uart_phys:       .word   0
  omap_uart_virt:       .word   0
  omap_uart_lsr:        .word   0
                bne     100f                    @ already configured
  
                /* Configure the UART offset from the phys/virt base */
 -#ifdef CONFIG_DEBUG_OMAP2UART1
 -              mov     \rp, #UART_OFFSET(OMAP2_UART1_BASE)     @ omap2/3/4
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP2UART2
 -              mov     \rp, #UART_OFFSET(OMAP2_UART2_BASE)     @ omap2/3/4
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP2UART3
 -              mov     \rp, #UART_OFFSET(OMAP2_UART3_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP3UART3
 -              mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
 -              add     \rp, \rp, #0x00fb0000
 -              add     \rp, \rp, #0x00006000           @ OMAP3_UART3_BASE
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP4UART3
 -              mov     \rp, #UART_OFFSET(OMAP4_UART3_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP3UART4
 -              mov     \rp, #UART_OFFSET(OMAP3_UART1_BASE)
 -              add     \rp, \rp, #0x00fb0000
 -              add     \rp, \rp, #0x00028000           @ OMAP3_UART4_BASE
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_OMAP4UART4
 -              mov     \rp, #UART_OFFSET(OMAP4_UART4_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_TI81XXUART1
 -              mov     \rp, #UART_OFFSET(TI81XX_UART1_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_TI81XXUART2
 -              mov     \rp, #UART_OFFSET(TI81XX_UART2_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_TI81XXUART3
 -              mov     \rp, #UART_OFFSET(TI81XX_UART3_BASE)
 -              b       98f
 -#endif
 -#ifdef CONFIG_DEBUG_AM33XXUART1
 -              ldr     \rp, =AM33XX_UART1_BASE
 -              and     \rp, \rp, #0x00ffffff
 -              b       97f
 -#endif
  #ifdef CONFIG_DEBUG_ZOOM_UART
                ldr     \rp, =ZOOM_UART_BASE
                str     \rp, [\tmp, #0]         @ omap_uart_phys
  #endif
                b       10b
  
 -              /* AM33XX: Store both phys and virt address for the uart */
 -97:           add     \rp, \rp, #0x44000000   @ phys base
 -              str     \rp, [\tmp, #0]         @ omap_uart_phys
 -              sub     \rp, \rp, #0x44000000   @ phys base
 -              add     \rp, \rp, #0xf9000000   @ virt base
 -              str     \rp, [\tmp, #4]         @ omap_uart_virt
 -              mov     \rp, #(UART_LSR << OMAP_PORT_SHIFT)
 -              str     \rp, [\tmp, #8]         @ omap_uart_lsr
 -
 -              b       10b
 -
 -              /* Store both phys and virt address for the uart */
 -98:           add     \rp, \rp, #0x48000000   @ phys base
 -              str     \rp, [\tmp, #0]         @ omap_uart_phys
 -              sub     \rp, \rp, #0x48000000   @ phys base
 -              add     \rp, \rp, #0xfa000000   @ virt base
 -              str     \rp, [\tmp, #4]         @ omap_uart_virt
 -              mov     \rp, #(UART_LSR << OMAP_PORT_SHIFT)
 -              str     \rp, [\tmp, #8]         @ omap_uart_lsr
 -
 -              b       10b
 -
                .align
  99:           .word   .
                .word   omap_uart_phys
index e33c32d561934c36b84d294d85ff27fa05aa0ec2,0b60adf4a5d9b4185d651b985c73f50a48ae8850..ca3614dc6938e1595f71a095f53456eb26701bec
  
  #include "entry-header.S"
  
+ saved_psr     .req    r8
+ #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING)
+ saved_pc      .req    r9
+ #define TRACE(x...) x
+ #else
+ saved_pc      .req    lr
+ #define TRACE(x...)
+ #endif
  
        .align  5
  #if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING))
@@@ -41,9 -49,7 +49,9 @@@ ret_fast_syscall
   UNWIND(.cantunwind   )
        disable_irq_notrace                     @ disable interrupts
        ldr     r1, [tsk, #TI_FLAGS]            @ re-check for syscall tracing
 -      tst     r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
 +      tst     r1, #_TIF_SYSCALL_WORK
 +      bne     fast_work_pending
 +      tst     r1, #_TIF_WORK_MASK
        bne     fast_work_pending
  
        /* perform architecture specific actions before user return */
@@@ -69,15 -75,12 +77,15 @@@ ret_fast_syscall
        str     r0, [sp, #S_R0 + S_OFF]!        @ save returned r0
        disable_irq_notrace                     @ disable interrupts
        ldr     r1, [tsk, #TI_FLAGS]            @ re-check for syscall tracing
 -      tst     r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
 +      tst     r1, #_TIF_SYSCALL_WORK
 +      bne     fast_work_pending
 +      tst     r1, #_TIF_WORK_MASK
        beq     no_work_pending
   UNWIND(.fnend                )
  ENDPROC(ret_fast_syscall)
  
        /* Slower path - fall through to work_pending */
 +fast_work_pending:
  #endif
  
        tst     r1, #_TIF_SYSCALL_WORK
@@@ -146,16 -149,17 +154,17 @@@ ENTRY(vector_swi
   ARM( stmdb   r8, {sp, lr}^           )       @ Calling sp, lr
   THUMB(       mov     r8, sp                  )
   THUMB(       store_user_sp_lr r8, r10, S_SP  )       @ calling sp, lr
-       mrs     r8, spsr                        @ called from non-FIQ mode, so ok.
-       str     lr, [sp, #S_PC]                 @ Save calling PC
-       str     r8, [sp, #S_PSR]                @ Save CPSR
+       mrs     saved_psr, spsr                 @ called from non-FIQ mode, so ok.
+  TRACE(       mov     saved_pc, lr            )
+       str     saved_pc, [sp, #S_PC]           @ Save calling PC
+       str     saved_psr, [sp, #S_PSR]         @ Save CPSR
        str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
  #endif
        zero_fp
        alignment_trap r10, ip, __cr_alignment
-       enable_irq
-       ct_user_exit
-       get_thread_info tsk
+       asm_trace_hardirqs_on save=0
+       enable_irq_notrace
+       ct_user_exit save=0
  
        /*
         * Get the system call number.
         * value to determine if it is an EABI or an old ABI call.
         */
  #ifdef CONFIG_ARM_THUMB
-       tst     r8, #PSR_T_BIT
+       tst     saved_psr, #PSR_T_BIT
        movne   r10, #0                         @ no thumb OABI emulation
-  USER(        ldreq   r10, [lr, #-4]          )       @ get SWI instruction
+  USER(        ldreq   r10, [saved_pc, #-4]    )       @ get SWI instruction
  #else
-  USER(        ldr     r10, [lr, #-4]          )       @ get SWI instruction
+  USER(        ldr     r10, [saved_pc, #-4]    )       @ get SWI instruction
  #endif
   ARM_BE8(rev  r10, r10)                       @ little endian instruction
  
         */
  #elif defined(CONFIG_ARM_THUMB)
        /* Legacy ABI only, possibly thumb mode. */
-       tst     r8, #PSR_T_BIT                  @ this is SPSR from save_user_regs
+       tst     saved_psr, #PSR_T_BIT           @ this is SPSR from save_user_regs
        addne   scno, r7, #__NR_SYSCALL_BASE    @ put OS number in
-  USER(        ldreq   scno, [lr, #-4]         )
+  USER(        ldreq   scno, [saved_pc, #-4]   )
  
  #else
        /* Legacy ABI only. */
-  USER(        ldr     scno, [lr, #-4]         )       @ get SWI instruction
+  USER(        ldr     scno, [saved_pc, #-4]   )       @ get SWI instruction
  #endif
  
+       /* saved_psr and saved_pc are now dead */
        uaccess_disable tbl
  
        adr     tbl, sys_call_table             @ load syscall table pointer
        bic     scno, scno, #0xff000000         @ mask off SWI op-code
        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
         * current task.
         */
  9001:
-       sub     lr, lr, #4
+       sub     lr, saved_pc, #4
        str     lr, [sp, #S_PC]
+       get_thread_info tsk
        b       ret_fast_syscall
  #endif
  ENDPROC(vector_swi)