diff options
Diffstat (limited to 'arch/arm/include/asm/assembler.h')
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 64 | 
1 files changed, 55 insertions, 9 deletions
| diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 4abe57279c66..b2bc8e11471d 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -108,33 +108,37 @@  	.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 @@ -173,7 +177,7 @@  	.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 |