diff options
| author | Catalin Marinas <catalin.marinas@arm.com> | 2009-07-24 15:32:57 +0400 | 
|---|---|---|
| committer | Catalin Marinas <catalin.marinas@arm.com> | 2009-07-24 15:32:57 +0400 | 
| commit | 8b592783a2e8b7721a99730bd549aab5208f36af (patch) | |
| tree | 468636a17d31f6a29287240c63234e739eabf666 /arch/arm/include/asm/assembler.h | |
| parent | 347c8b70b1d5256e445e54e736f88d21877616cf (diff) | |
| download | linux-8b592783a2e8b7721a99730bd549aab5208f36af.tar.xz | |
Thumb-2: Implement the unified arch/arm/lib functions
This patch adds the ARM/Thumb-2 unified support for the arch/arm/lib/*
files.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm/include/asm/assembler.h')
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 73 | 
1 files changed, 73 insertions, 0 deletions
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 1acd1da36d00..2b60c7d05770 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -138,3 +138,76 @@  	msr	cpsr_c, #\mode  	.endm  #endif + +/* + * STRT/LDRT access macros with ARM and Thumb-2 variants + */ +#ifdef CONFIG_THUMB2_KERNEL + +	.macro	usraccoff, instr, reg, ptr, inc, off, cond, abort +9999: +	.if	\inc == 1 +	\instr\cond\()bt \reg, [\ptr, #\off] +	.elseif	\inc == 4 +	\instr\cond\()t \reg, [\ptr, #\off] +	.else +	.error	"Unsupported inc macro argument" +	.endif + +	.section __ex_table,"a" +	.align	3 +	.long	9999b, \abort +	.previous +	.endm + +	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort +	@ explicit IT instruction needed because of the label +	@ introduced by the USER macro +	.ifnc	\cond,al +	.if	\rept == 1 +	itt	\cond +	.elseif	\rept == 2 +	ittt	\cond +	.else +	.error	"Unsupported rept macro argument" +	.endif +	.endif + +	@ Slightly optimised to avoid incrementing the pointer twice +	usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort +	.if	\rept == 2 +	usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort +	.endif + +	add\cond \ptr, #\rept * \inc +	.endm + +#else	/* !CONFIG_THUMB2_KERNEL */ + +	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort +	.rept	\rept +9999: +	.if	\inc == 1 +	\instr\cond\()bt \reg, [\ptr], #\inc +	.elseif	\inc == 4 +	\instr\cond\()t \reg, [\ptr], #\inc +	.else +	.error	"Unsupported inc macro argument" +	.endif + +	.section __ex_table,"a" +	.align	3 +	.long	9999b, \abort +	.previous +	.endr +	.endm + +#endif	/* CONFIG_THUMB2_KERNEL */ + +	.macro	strusr, reg, ptr, inc, cond=al, rept=1, abort=9001f +	usracc	str, \reg, \ptr, \inc, \cond, \rept, \abort +	.endm + +	.macro	ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f +	usracc	ldr, \reg, \ptr, \inc, \cond, \rept, \abort +	.endm  | 
