ARM(  stmib   sp, {r1 - r12}  )
  THUMB(        stmia   sp, {r0 - r12}  )
 
+ ATRAP(        mrc     p15, 0, r7, c1, c0, 0)
+ ATRAP(        ldr     r8, .LCcralign)
+
        ldmia   r0, {r3 - r5}
        add     r0, sp, #S_PC           @ here for interlock avoidance
        mov     r6, #-1                 @  ""  ""     ""        ""
        str     r3, [sp]                @ save the "real" r0 copied
                                        @ from the exception stack
 
+ ATRAP(        ldr     r8, [r8, #0])
+
        @
        @ We are now ready to fill in the remaining blanks on the stack:
        @
  ARM(  stmdb   r0, {sp, lr}^                   )
  THUMB(        store_user_sp_lr r0, r1, S_SP - S_PC    )
 
-       @
        @ Enable the alignment trap while in kernel mode
-       @
-       alignment_trap r0, .LCcralign
+ ATRAP(        teq     r8, r7)
+ ATRAP( mcrne  p15, 0, r8, c1, c0, 0)
 
        @
        @ Clear FP to mark the first stack frame
 
        str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
 #endif
        zero_fp
-       alignment_trap ip, __cr_alignment
+       alignment_trap r10, ip, __cr_alignment
        enable_irq
        ct_user_exit
        get_thread_info tsk
 
 #endif
        .endm
 
-       .macro  alignment_trap, rtemp, label
 #ifdef CONFIG_ALIGNMENT_TRAP
-       ldr     \rtemp, \label
-       ldr     \rtemp, [\rtemp]
-       mcr     p15, 0, \rtemp, c1, c0
+#define ATRAP(x...) x
+#else
+#define ATRAP(x...)
+#endif
+
+       .macro  alignment_trap, rtmp1, rtmp2, label
+#ifdef CONFIG_ALIGNMENT_TRAP
+       mrc     p15, 0, \rtmp2, c1, c0, 0
+       ldr     \rtmp1, \label
+       ldr     \rtmp1, [\rtmp1]
+       teq     \rtmp1, \rtmp2
+       mcrne   p15, 0, \rtmp1, c1, c0, 0
 #endif
        .endm