diff options
Diffstat (limited to 'arch/arm/include/asm/assembler.h')
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 59 | 
1 files changed, 54 insertions, 5 deletions
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index fcc1b5bf697..57f0584e8d9 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -23,6 +23,7 @@  #include <asm/ptrace.h>  #include <asm/domain.h>  #include <asm/opcodes-virt.h> +#include <asm/asm-offsets.h>  #define IOMEM(x)	(x) @@ -30,8 +31,8 @@   * Endian independent macros for shifting bytes within registers.   */  #ifndef __ARMEB__ -#define pull            lsr -#define push            lsl +#define lspull          lsr +#define lspush          lsl  #define get_byte_0      lsl #0  #define get_byte_1	lsr #8  #define get_byte_2	lsr #16 @@ -41,8 +42,8 @@  #define put_byte_2	lsl #16  #define put_byte_3	lsl #24  #else -#define pull            lsl -#define push            lsr +#define lspull          lsl +#define lspush          lsr  #define get_byte_0	lsr #24  #define get_byte_1	lsr #16  #define get_byte_2	lsr #8 @@ -53,6 +54,13 @@  #define put_byte_3      lsl #0  #endif +/* Select code for any configuration running in BE8 mode */ +#ifdef CONFIG_CPU_ENDIAN_BE8 +#define ARM_BE8(code...) code +#else +#define ARM_BE8(code...) +#endif +  /*   * Data preload for architectures that support it   */ @@ -167,6 +175,47 @@  	restore_irqs_notrace \oldcpsr  	.endm +/* + * Get current thread_info. + */ +	.macro	get_thread_info, rd + ARM(	mov	\rd, sp, lsr #13	) + THUMB(	mov	\rd, sp			) + THUMB(	lsr	\rd, \rd, #13		) +	mov	\rd, \rd, lsl #13 +	.endm + +/* + * Increment/decrement the preempt count. + */ +#ifdef CONFIG_PREEMPT_COUNT +	.macro	inc_preempt_count, ti, tmp +	ldr	\tmp, [\ti, #TI_PREEMPT]	@ get preempt count +	add	\tmp, \tmp, #1			@ increment it +	str	\tmp, [\ti, #TI_PREEMPT] +	.endm + +	.macro	dec_preempt_count, ti, tmp +	ldr	\tmp, [\ti, #TI_PREEMPT]	@ get preempt count +	sub	\tmp, \tmp, #1			@ decrement it +	str	\tmp, [\ti, #TI_PREEMPT] +	.endm + +	.macro	dec_preempt_count_ti, ti, tmp +	get_thread_info \ti +	dec_preempt_count \ti, \tmp +	.endm +#else +	.macro	inc_preempt_count, ti, tmp +	.endm + +	.macro	dec_preempt_count, ti, tmp +	.endm + +	.macro	dec_preempt_count_ti, ti, tmp +	.endm +#endif +  #define USER(x...)				\  9999:	x;					\  	.pushsection __ex_table,"a";		\ @@ -263,7 +312,7 @@   * you cannot return to the original mode.   */  .macro safe_svcmode_maskall reg:req -#if __LINUX_ARM_ARCH__ >= 6 +#if __LINUX_ARM_ARCH__ >= 6 && !defined(CONFIG_CPU_V7M)  	mrs	\reg , cpsr  	eor	\reg, \reg, #HYP_MODE  	tst	\reg, #MODE_MASK  | 
