svn commit: r261393 - in head/sys/arm: arm include

Adrian Chadd adrian.chadd at gmail.com
Sun Feb 2 03:30:35 UTC 2014


Wow! Great find!

Adrian
On Feb 1, 2014 6:48 PM, "Ian Lepore" <ian at freebsd.org> wrote:

> Author: ian
> Date: Sun Feb  2 00:48:15 2014
> New Revision: 261393
> URL: http://svnweb.freebsd.org/changeset/base/261393
>
> Log:
>   Update all arm code that manipulates the PSR registers to use modern
> syntax.
>
>   It turns out the version of gas we're using interprets the old '_all'
> mask
>   as 'fc' instead of 'fsxc'.  That is, "all" doesn't really mean "all".
>
>   This was the cause of the "wrong-endian register restore" bug that's
>   been causing problems with some cortex-a9 chips.  The 'endian' bit in the
>   spsr register would never get changed (it falls into the 'x' mask group)
>   and the first return-from-exception would fail if the chip had powered on
>   with garbage in the spsr register that included the big-endian bit.  It's
>   unknown why this affected only certain cortex-a9 chips.
>
> Modified:
>   head/sys/arm/arm/cpufunc_asm_arm8.S
>   head/sys/arm/arm/cpufunc_asm_sa1.S
>   head/sys/arm/arm/cpufunc_asm_sa11x0.S
>   head/sys/arm/arm/cpufunc_asm_xscale.S
>   head/sys/arm/arm/cpufunc_asm_xscale_c3.S
>   head/sys/arm/arm/exception.S
>   head/sys/arm/arm/fiq_subr.S
>   head/sys/arm/arm/locore.S
>   head/sys/arm/arm/setcpsr.S
>   head/sys/arm/arm/setstack.s
>   head/sys/arm/include/asmacros.h
>   head/sys/arm/include/atomic.h
>
> Modified: head/sys/arm/arm/cpufunc_asm_arm8.S
>
> ==============================================================================
> --- head/sys/arm/arm/cpufunc_asm_arm8.S Sun Feb  2 00:34:32 2014
>  (r261392)
> +++ head/sys/arm/arm/cpufunc_asm_arm8.S Sun Feb  2 00:48:15 2014
>  (r261393)
> @@ -67,9 +67,9 @@ END(arm8_clock_config)
>   * addresses that are about to change.
>   */
>  ENTRY(arm8_setttb)
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r1, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r1
> +       msr     cpsr_fsxc, r1
>
>         stmfd   sp!, {r0-r3, lr}
>         bl      _C_LABEL(arm8_cache_cleanID)
> @@ -88,7 +88,7 @@ ENTRY(arm8_setttb)
>         /* Make sure that pipeline is emptied */
>         mov     r0, r0
>         mov     r0, r0
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>
>         RET
>  END(arm8_setttb)
> @@ -182,9 +182,9 @@ ENTRY(arm8_cache_purgeID)
>
>         mov     r0, #0x00000000
>
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r2, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r2
> +       msr     cpsr_fsxc, r2
>
>  1:     mov     r2, r0
>         mcr     p15, 0, r2, c7, c11, 1
> @@ -238,7 +238,7 @@ ENTRY(arm8_cache_purgeID)
>         adds    r0, r0, #0x04000000
>         bne     1b
>
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>         RET
>  END(arm8_cache_purgeID)
>
> @@ -255,12 +255,12 @@ ENTRY(arm8_cache_purgeID_E)
>          * mcr p15, 0, rd, c7, c11, 1
>          * mcr p15, 0, rd, c7, c7, 1
>          */
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r2, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r2
> +       msr     cpsr_fsxc, r2
>         mcr     p15, 0, r0, c7, c11, 1  /* clean I+D single entry */
>         mcr     p15, 0, r0, c7, c7, 1   /* flush I+D single entry */
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>         RET
>  END(arm8_cache_purgeID_E)
>
>
> Modified: head/sys/arm/arm/cpufunc_asm_sa1.S
>
> ==============================================================================
> --- head/sys/arm/arm/cpufunc_asm_sa1.S  Sun Feb  2 00:34:32 2014
>  (r261392)
> +++ head/sys/arm/arm/cpufunc_asm_sa1.S  Sun Feb  2 00:48:15 2014
>  (r261393)
> @@ -52,9 +52,9 @@ ENTRY(getttb)
>         mrc     p15, 0, r0, c2, c0, 0
>  ENTRY(sa1_setttb)
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r1, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r1
> +       msr     cpsr_fsxc, r1
>  #else
>         ldr     r3, .Lblock_userspace_access
>         ldr     r2, [r3]
> @@ -80,7 +80,7 @@ ENTRY(sa1_setttb)
>         mov     r0, r0
>         mov     r0, r0
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>  #else
>         str     r2, [r3]
>  #endif
> @@ -154,12 +154,12 @@ _C_LABEL(sa1_cache_clean_size):
>
>  #ifdef CACHE_CLEAN_BLOCK_INTR
>  #define        SA1_CACHE_CLEAN_BLOCK
>       \
> -       mrs     r3, cpsr_all                                    ;       \
> +       mrs     r3, cpsr                                        ;       \
>         orr     r0, r3, #(I32_bit | F32_bit)                    ;       \
> -       msr     cpsr_all, r0
> +       msr     cpsr_fsxc, r0
>
>  #define        SA1_CACHE_CLEAN_UNBLOCK
>       \
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>  #else
>  #define        SA1_CACHE_CLEAN_BLOCK
>       \
>         ldr     r3, .Lblock_userspace_access                    ;       \
>
> Modified: head/sys/arm/arm/cpufunc_asm_sa11x0.S
>
> ==============================================================================
> --- head/sys/arm/arm/cpufunc_asm_sa11x0.S       Sun Feb  2 00:34:32 2014
>      (r261392)
> +++ head/sys/arm/arm/cpufunc_asm_sa11x0.S       Sun Feb  2 00:48:15 2014
>      (r261393)
> @@ -80,9 +80,9 @@ ENTRY(sa11x0_cpu_sleep)
>          * re-enable clock switching before servicing interrupts.
>          */
>
> -       mrs     r3, cpsr_all                                            /*
> 6 */
> +       mrs     r3, cpsr                                                /*
> 6 */
>         orr     r2, r3, #(I32_bit|F32_bit)                              /*
> 7 */
> -       msr     cpsr_all, r2                                            /*
> 8 */
> +       msr     cpsr_fsxc, r2                                           /*
> 8 */
>
>         /* We're now 32-byte aligned */
>
> @@ -93,7 +93,7 @@ ENTRY(sa11x0_cpu_sleep)
>         mcr     p15, 0, r0, c15, c1, 2  /* re-enable clock switching */
>
>         /* Restore interrupts (which will cause them to be serviced). */
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>         RET
>  END(sa11x0_cpu_sleep)
>
>
> Modified: head/sys/arm/arm/cpufunc_asm_xscale.S
>
> ==============================================================================
> --- head/sys/arm/arm/cpufunc_asm_xscale.S       Sun Feb  2 00:34:32 2014
>      (r261392)
> +++ head/sys/arm/arm/cpufunc_asm_xscale.S       Sun Feb  2 00:48:15 2014
>      (r261393)
> @@ -134,9 +134,9 @@ END(xscale_control)
>   */
>  ENTRY(xscale_setttb)
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r1, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r1
> +       msr     cpsr_fsxc, r1
>  #else
>         ldr     r3, .Lblock_userspace_access
>         ldr     r2, [r3]
> @@ -164,7 +164,7 @@ ENTRY(xscale_setttb)
>         CPWAIT(r0)
>
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>  #else
>         str     r2, [r3]
>  #endif
> @@ -266,12 +266,12 @@ _C_LABEL(xscale_minidata_clean_size):
>
>  #ifdef CACHE_CLEAN_BLOCK_INTR
>  #define        XSCALE_CACHE_CLEAN_BLOCK
>      \
> -       mrs     r3, cpsr_all                                    ;       \
> +       mrs     r3, cpsr                                        ;       \
>         orr     r0, r3, #(I32_bit | F32_bit)                    ;       \
> -       msr     cpsr_all, r0
> +       msr     cpsr_fsxc, r0
>
>  #define        XSCALE_CACHE_CLEAN_UNBLOCK
>      \
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>  #else
>  #define        XSCALE_CACHE_CLEAN_BLOCK
>      \
>         ldr     r3, .Lblock_userspace_access                    ;       \
>
> Modified: head/sys/arm/arm/cpufunc_asm_xscale_c3.S
>
> ==============================================================================
> --- head/sys/arm/arm/cpufunc_asm_xscale_c3.S    Sun Feb  2 00:34:32 2014
>      (r261392)
> +++ head/sys/arm/arm/cpufunc_asm_xscale_c3.S    Sun Feb  2 00:48:15 2014
>      (r261393)
> @@ -121,12 +121,12 @@ __FBSDID("$FreeBSD$");
>  #ifdef CACHE_CLEAN_BLOCK_INTR
>  #define        XSCALE_CACHE_CLEAN_BLOCK
>      \
>         stmfd   sp!, {r4}                                       ;       \
> -       mrs     r4, cpsr_all                                    ;       \
> +       mrs     r4, cpsr                                        ;       \
>         orr     r0, r4, #(I32_bit | F32_bit)                    ;       \
> -       msr     cpsr_all, r0
> +       msr     cpsr_fsxc, r0
>
>  #define        XSCALE_CACHE_CLEAN_UNBLOCK
>      \
> -       msr     cpsr_all, r4                                    ;       \
> +       msr     cpsr_fsxc, r4                                   ;       \
>         ldmfd   sp!, {r4}
>  #else
>  #define        XSCALE_CACHE_CLEAN_BLOCK
>      \
> @@ -348,9 +348,9 @@ END(xscalec3_l2cache_flush_rng)
>   */
>  ENTRY(xscalec3_setttb)
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         orr     r1, r3, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r1
> +       msr     cpsr_fsxc, r1
>  #else
>         ldr     r3, .Lblock_userspace_access
>         ldr     r2, [r3]
> @@ -378,7 +378,7 @@ ENTRY(xscalec3_setttb)
>         CPWAIT(r0)
>
>  #ifdef CACHE_CLEAN_BLOCK_INTR
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>  #else
>         str     r2, [r3]
>  #endif
>
> Modified: head/sys/arm/arm/exception.S
>
> ==============================================================================
> --- head/sys/arm/arm/exception.S        Sun Feb  2 00:34:32 2014
>  (r261392)
> +++ head/sys/arm/arm/exception.S        Sun Feb  2 00:48:15 2014
>  (r261393)
> @@ -173,8 +173,8 @@ END(data_abort_entry)
>   *     it like a Data Abort.
>   */
>  ASENTRY_NP(address_exception_entry)
> -       mrs     r1, cpsr_all
> -       mrs     r2, spsr_all
> +       mrs     r1, cpsr
> +       mrs     r2, spsr
>         mov     r3, lr
>         adr     r0, Laddress_exception_msg
>         bl      _C_LABEL(printf)        /* XXX CLOBBERS LR!! */
>
> Modified: head/sys/arm/arm/fiq_subr.S
>
> ==============================================================================
> --- head/sys/arm/arm/fiq_subr.S Sun Feb  2 00:34:32 2014        (r261392)
> +++ head/sys/arm/arm/fiq_subr.S Sun Feb  2 00:48:15 2014        (r261393)
> @@ -52,14 +52,14 @@ __FBSDID("$FreeBSD$");
>  #endif
>
>  #define        SWITCH_TO_FIQ_MODE
>      \
> -       mrs     r2, cpsr_all                                    ;       \
> +       mrs     r2, cpsr                                        ;       \
>         mov     r3, r2                                          ;       \
>         bic     r2, r2, #(PSR_MODE)                             ;       \
>         orr     r2, r2, #(PSR_FIQ32_MODE)                       ;       \
> -       msr     cpsr_all, r2
> +       msr     cpsr_fsxc, r2
>
>  #define        BACK_TO_SVC_MODE
>      \
> -       msr     cpsr_all, r3
> +       msr     cpsr_fsxc, r3
>
>  /*
>   * fiq_getregs:
>
> Modified: head/sys/arm/arm/locore.S
>
> ==============================================================================
> --- head/sys/arm/arm/locore.S   Sun Feb  2 00:34:32 2014        (r261392)
> +++ head/sys/arm/arm/locore.S   Sun Feb  2 00:48:15 2014        (r261393)
> @@ -333,10 +333,10 @@ ASENTRY_NP(mptramp)
>
>         AP_DEBUG(#1)
>
> -       mrs     r3, cpsr_all
> +       mrs     r3, cpsr
>         bic     r3, r3, #(PSR_MODE)
>         orr     r3, r3, #(PSR_SVC32_MODE)
> -        msr    cpsr_all, r3
> +        msr    cpsr_fsxc, r3
>
>         mrc     p15, 0, r0, c0, c0, 5
>         and     r0, #0x0f               /* Get CPU ID */
> @@ -446,7 +446,7 @@ ENTRY_NP(cpu_halt)
>         bic     r2, r2, #(PSR_MODE)
>         orr     r2, r2, #(PSR_SVC32_MODE)
>         orr     r2, r2, #(I32_bit | F32_bit)
> -       msr     cpsr_all, r2
> +       msr     cpsr_fsxc, r2
>
>         ldr     r4, .Lcpu_reset_address
>         ldr     r4, [r4]
>
> Modified: head/sys/arm/arm/setcpsr.S
>
> ==============================================================================
> --- head/sys/arm/arm/setcpsr.S  Sun Feb  2 00:34:32 2014        (r261392)
> +++ head/sys/arm/arm/setcpsr.S  Sun Feb  2 00:48:15 2014        (r261393)
> @@ -61,7 +61,7 @@ ENTRY_NP(SetCPSR)
>          mrs     r3, cpsr               /* Set the CPSR */
>         bic     r2, r3, r0
>          eor     r2, r2, r1
> -        msr     cpsr_all, r2
> +        msr     cpsr_fsxc, r2
>
>          mov    r0, r3                  /* Return the old CPSR */
>
>
> Modified: head/sys/arm/arm/setstack.s
>
> ==============================================================================
> --- head/sys/arm/arm/setstack.s Sun Feb  2 00:34:32 2014        (r261392)
> +++ head/sys/arm/arm/setstack.s Sun Feb  2 00:48:15 2014        (r261393)
> @@ -61,14 +61,14 @@ __FBSDID("$FreeBSD$");
>   */
>
>  ENTRY(set_stackptr)
> -        mrs    r3, cpsr_all            /* Switch to the appropriate mode
> */
> +        mrs    r3, cpsr                /* Switch to the appropriate mode
> */
>         bic     r2, r3, #(PSR_MODE)
>         orr     r2, r2, r0
> -        msr    cpsr_all, r2
> +        msr    cpsr_fsxc, r2
>
>         mov     sp, r1                  /* Set the stack pointer */
>
> -        msr    cpsr_all, r3            /* Restore the old mode */
> +        msr    cpsr_fsxc, r3           /* Restore the old mode */
>
>         mov     pc, lr                  /* Exit */
>
> @@ -80,14 +80,14 @@ ENTRY(set_stackptr)
>   */
>
>  ENTRY(get_stackptr)
> -        mrs    r3, cpsr_all            /* Switch to the appropriate mode
> */
> +        mrs    r3, cpsr                /* Switch to the appropriate mode
> */
>         bic     r2, r3, #(PSR_MODE)
>         orr     r2, r2, r0
> -        msr    cpsr_all, r2
> +        msr    cpsr_fsxc, r2
>
>         mov     r0, sp                  /* Set the stack pointer */
>
> -        msr    cpsr_all, r3            /* Restore the old mode */
> +        msr    cpsr_fsxc, r3           /* Restore the old mode */
>
>         mov     pc, lr                  /* Exit */
>
>
> Modified: head/sys/arm/include/asmacros.h
>
> ==============================================================================
> --- head/sys/arm/include/asmacros.h     Sun Feb  2 00:34:32 2014
>  (r261392)
> +++ head/sys/arm/include/asmacros.h     Sun Feb  2 00:48:15 2014
>  (r261393)
> @@ -70,7 +70,7 @@
>         add     r0, sp, #(4*13);        /* Adjust the stack pointer */
> \
>         stmia   r0, {r13-r14}^;         /* Push the user mode registers */
> \
>          mov     r0, r0;                 /* NOP for previous instruction
> */ \
> -       mrs     r0, spsr_all;           /* Put the SPSR on the stack */
>  \
> +       mrs     r0, spsr;               /* Put the SPSR on the stack */
>  \
>         str     r0, [sp, #-4]!;
>  \
>         ldr     r0, =ARM_RAS_START;
>  \
>         mov     r1, #0;
>  \
> @@ -86,7 +86,7 @@
>         add     r0, sp, #(4*13);        /* Adjust the stack pointer */
> \
>         stmia   r0, {r13-r14}^;         /* Push the user mode registers */
> \
>          mov     r0, r0;                 /* NOP for previous instruction
> */ \
> -       mrs     r0, spsr_all;           /* Put the SPSR on the stack */
>  \
> +       mrs     r0, spsr;               /* Put the SPSR on the stack */
>  \
>         str     r0, [sp, #-4]!;
>  #endif
>
> @@ -98,7 +98,7 @@
>  #ifdef ARM_TP_ADDRESS
>  #define PULLFRAME
> \
>          ldr     r0, [sp], #0x0004;      /* Get the SPSR from stack */
> \
> -        msr     spsr_all, r0;
> \
> +        msr     spsr_fsxc, r0;
>  \
>          ldmia   sp, {r0-r14}^;         /* Restore registers (usr mode) */
> \
>          mov     r0, r0;                 /* NOP for previous instruction
> */ \
>         add     sp, sp, #(4*17);        /* Adjust the stack pointer */
> \
> @@ -107,7 +107,7 @@
>  #else
>  #define PULLFRAME
> \
>          ldr     r0, [sp], #0x0004;      /* Get the SPSR from stack */
> \
> -        msr     spsr_all, r0;
> \
> +        msr     spsr_fsxc, r0;
>  \
>         clrex;
> \
>          ldmia   sp, {r0-r14}^;         /* Restore registers (usr mode) */
> \
>          mov     r0, r0;                 /* NOP for previous instruction
> */ \
> @@ -142,7 +142,7 @@
>         str     r0, [sp, #-4]!;         /* Push return address */
>  \
>         str     lr, [sp, #-4]!;         /* Push SVC lr */
>  \
>         str     r2, [sp, #-4]!;         /* Push SVC sp */
>  \
> -       msr     spsr_all, r3;           /* Restore correct spsr */
> \
> +       msr     spsr_fsxc, r3;          /* Restore correct spsr */
> \
>         ldmdb   r1, {r0-r3};            /* Restore 4 regs from xxx mode */
> \
>         sub     sp, sp, #(4*15);        /* Adjust the stack pointer */
> \
>         stmia   sp, {r0-r12};           /* Push the user mode registers */
> \
> @@ -161,7 +161,7 @@
>         ldrne   r1, [r0, #16];          /* adjust the saved PC so that  */
> \
>         cmpne   r4, r1;                 /* execution later resumes at   */
> \
>         strhi   r3, [r0, #16];          /* the RAS_START location.      */
> \
> -       mrs     r0, spsr_all;
>  \
> +       mrs     r0, spsr;                                              \
>         str     r0, [sp, #-4]!
>  #else
>  #define PUSHFRAMEINSVC
>  \
> @@ -179,14 +179,14 @@
>         str     r0, [sp, #-4]!;         /* Push return address */
>  \
>         str     lr, [sp, #-4]!;         /* Push SVC lr */
>  \
>         str     r2, [sp, #-4]!;         /* Push SVC sp */
>  \
> -       msr     spsr_all, r3;           /* Restore correct spsr */
> \
> +       msr     spsr_fsxc, r3;          /* Restore correct spsr */
> \
>         ldmdb   r1, {r0-r3};            /* Restore 4 regs from xxx mode */
> \
>         sub     sp, sp, #(4*15);        /* Adjust the stack pointer */
> \
>         stmia   sp, {r0-r12};           /* Push the user mode registers */
> \
>         add     r0, sp, #(4*13);        /* Adjust the stack pointer */
> \
>         stmia   r0, {r13-r14}^;         /* Push the user mode registers */
> \
>          mov     r0, r0;                 /* NOP for previous instruction
> */ \
> -       mrs     r0, spsr_all;           /* Put the SPSR on the stack */
>  \
> +       mrs     r0, spsr;               /* Put the SPSR on the stack */
>  \
>         str     r0, [sp, #-4]!
>  #endif
>
> @@ -200,7 +200,7 @@
>  #ifdef ARM_TP_ADDRESS
>  #define PULLFRAMEFROMSVCANDEXIT
>         \
>          ldr     r0, [sp], #0x0004;     /* Get the SPSR from stack */
>  \
> -        msr     spsr_all, r0;          /* restore SPSR */
> \
> +        msr     spsr_fsxc, r0;         /* restore SPSR */
> \
>          ldmia   sp, {r0-r14}^;         /* Restore registers (usr mode) */
> \
>          mov     r0, r0;                        /* NOP for previous
> instruction */ \
>         add     sp, sp, #(4*15);        /* Adjust the stack pointer */
> \
> @@ -208,7 +208,7 @@
>  #else
>  #define PULLFRAMEFROMSVCANDEXIT
>         \
>          ldr     r0, [sp], #0x0004;     /* Get the SPSR from stack */
>  \
> -        msr     spsr_all, r0;          /* restore SPSR */
> \
> +        msr     spsr_fsxc, r0;         /* restore SPSR */
> \
>         clrex;
> \
>          ldmia   sp, {r0-r14}^;         /* Restore registers (usr mode) */
> \
>          mov     r0, r0;                        /* NOP for previous
> instruction */ \
>
> Modified: head/sys/arm/include/atomic.h
>
> ==============================================================================
> --- head/sys/arm/include/atomic.h       Sun Feb  2 00:34:32 2014
>  (r261392)
> +++ head/sys/arm/include/atomic.h       Sun Feb  2 00:48:15 2014
>  (r261393)
> @@ -450,13 +450,13 @@ atomic_store_rel_long(volatile u_long *p
>                 __asm __volatile(                       \
>                         "mrs  %0, cpsr;"                \
>                         "orr  %1, %0, %2;"              \
> -                       "msr  cpsr_all, %1;"            \
> +                       "msr  cpsr_fsxc, %1;"           \
>                         : "=r" (cpsr_save), "=r" (tmp)  \
>                         : "I" (I32_bit | F32_bit)               \
>                         : "cc" );               \
>                 (expr);                         \
>                  __asm __volatile(              \
> -                       "msr  cpsr_all, %0"     \
> +                       "msr  cpsr_fsxc, %0"    \
>                         : /* no output */       \
>                         : "r" (cpsr_save)       \
>                         : "cc" );               \
>


More information about the svn-src-head mailing list