Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
[linux-2.6-block.git] / arch / arm / include / asm / assembler.h
index 4abe57279c66f0ecf2c96c116ae7ce839e646b4c..b2bc8e11471d3ee3e4fcd5f207406222ffa04bf1 100644 (file)
        .endm
 #endif
 
-       .macro asm_trace_hardirqs_off
+       .macro asm_trace_hardirqs_off, save=1
 #if defined(CONFIG_TRACE_IRQFLAGS)
+       .if \save
        stmdb   sp!, {r0-r3, ip, lr}
+       .endif
        bl      trace_hardirqs_off
+       .if \save
        ldmia   sp!, {r0-r3, ip, lr}
+       .endif
 #endif
        .endm
 
-       .macro asm_trace_hardirqs_on_cond, cond
+       .macro asm_trace_hardirqs_on, cond=al, save=1
 #if defined(CONFIG_TRACE_IRQFLAGS)
        /*
         * actually the registers should be pushed and pop'd conditionally, but
         * after bl the flags are certainly clobbered
         */
+       .if \save
        stmdb   sp!, {r0-r3, ip, lr}
+       .endif
        bl\cond trace_hardirqs_on
+       .if \save
        ldmia   sp!, {r0-r3, ip, lr}
+       .endif
 #endif
        .endm
 
-       .macro asm_trace_hardirqs_on
-       asm_trace_hardirqs_on_cond al
-       .endm
-
-       .macro disable_irq
+       .macro disable_irq, save=1
        disable_irq_notrace
-       asm_trace_hardirqs_off
+       asm_trace_hardirqs_off \save
        .endm
 
        .macro enable_irq
 
        .macro restore_irqs, oldcpsr
        tst     \oldcpsr, #PSR_I_BIT
-       asm_trace_hardirqs_on_cond eq
+       asm_trace_hardirqs_on cond=eq
        restore_irqs_notrace \oldcpsr
        .endm
 
@@ -445,6 +449,48 @@ THUMB(     orr     \reg , \reg , #PSR_T_BIT        )
 #endif
        .endm
 
+       .macro  uaccess_disable, tmp, isb=1
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
+       /*
+        * Whenever we re-enter userspace, the domains should always be
+        * set appropriately.
+        */
+       mov     \tmp, #DACR_UACCESS_DISABLE
+       mcr     p15, 0, \tmp, c3, c0, 0         @ Set domain register
+       .if     \isb
+       instr_sync
+       .endif
+#endif
+       .endm
+
+       .macro  uaccess_enable, tmp, isb=1
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
+       /*
+        * Whenever we re-enter userspace, the domains should always be
+        * set appropriately.
+        */
+       mov     \tmp, #DACR_UACCESS_ENABLE
+       mcr     p15, 0, \tmp, c3, c0, 0
+       .if     \isb
+       instr_sync
+       .endif
+#endif
+       .endm
+
+       .macro  uaccess_save, tmp
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
+       mrc     p15, 0, \tmp, c3, c0, 0
+       str     \tmp, [sp, #S_FRAME_SIZE]
+#endif
+       .endm
+
+       .macro  uaccess_restore
+#ifdef CONFIG_CPU_SW_DOMAIN_PAN
+       ldr     r0, [sp, #S_FRAME_SIZE]
+       mcr     p15, 0, r0, c3, c0, 0
+#endif
+       .endm
+
        .irp    c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
        .macro  ret\c, reg
 #if __LINUX_ARM_ARCH__ < 6