diff options
Diffstat (limited to 'arch/arm/include')
| -rw-r--r-- | arch/arm/include/asm/assembler.h | 12 | ||||
| -rw-r--r-- | arch/arm/include/asm/atomic.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/cacheflush.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/elf.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/futex.h | 16 | ||||
| -rw-r--r-- | arch/arm/include/asm/smp_twd.h | 17 | ||||
| -rw-r--r-- | arch/arm/include/asm/tlbflush.h | 29 | ||||
| -rw-r--r-- | arch/arm/include/asm/uaccess.h | 40 | 
8 files changed, 86 insertions, 36 deletions
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 00f46d9ce29..6e8f05c8a1c 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -149,10 +149,10 @@  #define USER(x...)				\  9999:	x;					\ -	.section __ex_table,"a";		\ +	.pushsection __ex_table,"a";		\  	.align	3;				\  	.long	9999b,9001f;			\ -	.previous +	.popsection  /*   * SMP data memory barrier @@ -193,10 +193,10 @@  	.error	"Unsupported inc macro argument"  	.endif -	.section __ex_table,"a" +	.pushsection __ex_table,"a"  	.align	3  	.long	9999b, \abort -	.previous +	.popsection  	.endm  	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort @@ -234,10 +234,10 @@  	.error	"Unsupported inc macro argument"  	.endif -	.section __ex_table,"a" +	.pushsection __ex_table,"a"  	.align	3  	.long	9999b, \abort -	.previous +	.popsection  	.endr  	.endm diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h index e8ddec2cb15..a0162fa9456 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@ -24,7 +24,7 @@   * strex/ldrex monitor on some implementations. The reason we can use it for   * atomic_set() is the clrex or dummy strex done on every exception return.   */ -#define atomic_read(v)	((v)->counter) +#define atomic_read(v)	(*(volatile int *)&(v)->counter)  #define atomic_set(v,i)	(((v)->counter) = (i))  #if __LINUX_ARM_ARCH__ >= 6 diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 0d08d4170b6..4656a24058d 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h @@ -371,6 +371,10 @@ static inline void __flush_icache_all(void)  #ifdef CONFIG_ARM_ERRATA_411920  	extern void v6_icache_inval_all(void);  	v6_icache_inval_all(); +#elif defined(CONFIG_SMP) && __LINUX_ARM_ARCH__ >= 7 +	asm("mcr	p15, 0, %0, c7, c1, 0	@ invalidate I-cache inner shareable\n" +	    : +	    : "r" (0));  #else  	asm("mcr	p15, 0, %0, c7, c5, 0	@ invalidate I-cache\n"  	    : diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index bff056489cc..51662feb9f1 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h @@ -9,6 +9,8 @@  #include <asm/ptrace.h>  #include <asm/user.h> +struct task_struct; +  typedef unsigned long elf_greg_t;  typedef unsigned long elf_freg_t[3]; diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h index bfcc15929a7..540a044153a 100644 --- a/arch/arm/include/asm/futex.h +++ b/arch/arm/include/asm/futex.h @@ -21,14 +21,14 @@  	"2:	strt	%0, [%2]\n"				\  	"	mov	%0, #0\n"				\  	"3:\n"							\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 4f, 2b, 4f\n"			\ -	"	.previous\n"					\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"4:	mov	%0, %4\n"				\  	"	b	3b\n"					\ -	"	.previous"					\ +	"	.popsection"					\  	: "=&r" (ret), "=&r" (oldval)				\  	: "r" (uaddr), "r" (oparg), "Ir" (-EFAULT)		\  	: "cc", "memory") @@ -102,14 +102,14 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)  	"	it	eq	@ explicit IT needed for the 2b label\n"  	"2:	streqt	%2, [%3]\n"  	"3:\n" -	"	.section __ex_table,\"a\"\n" +	"	.pushsection __ex_table,\"a\"\n"  	"	.align	3\n"  	"	.long	1b, 4f, 2b, 4f\n" -	"	.previous\n" -	"	.section .fixup,\"ax\"\n" +	"	.popsection\n" +	"	.pushsection .fixup,\"ax\"\n"  	"4:	mov	%0, %4\n"  	"	b	3b\n" -	"	.previous" +	"	.popsection"  	: "=&r" (val)  	: "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT)  	: "cc", "memory"); diff --git a/arch/arm/include/asm/smp_twd.h b/arch/arm/include/asm/smp_twd.h index 7be0978b262..634f357be6b 100644 --- a/arch/arm/include/asm/smp_twd.h +++ b/arch/arm/include/asm/smp_twd.h @@ -1,6 +1,23 @@  #ifndef __ASMARM_SMP_TWD_H  #define __ASMARM_SMP_TWD_H +#define TWD_TIMER_LOAD			0x00 +#define TWD_TIMER_COUNTER		0x04 +#define TWD_TIMER_CONTROL		0x08 +#define TWD_TIMER_INTSTAT		0x0C + +#define TWD_WDOG_LOAD			0x20 +#define TWD_WDOG_COUNTER		0x24 +#define TWD_WDOG_CONTROL		0x28 +#define TWD_WDOG_INTSTAT		0x2C +#define TWD_WDOG_RESETSTAT		0x30 +#define TWD_WDOG_DISABLE		0x34 + +#define TWD_TIMER_CONTROL_ENABLE	(1 << 0) +#define TWD_TIMER_CONTROL_ONESHOT	(0 << 1) +#define TWD_TIMER_CONTROL_PERIODIC	(1 << 1) +#define TWD_TIMER_CONTROL_IT_ENABLE	(1 << 2) +  struct clock_event_device;  extern void __iomem *twd_base; diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index e085e2c545e..bd863d8608c 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h @@ -46,6 +46,9 @@  #define TLB_V7_UIS_FULL (1 << 20)  #define TLB_V7_UIS_ASID (1 << 21) +/* Inner Shareable BTB operation (ARMv7 MP extensions) */ +#define TLB_V7_IS_BTB	(1 << 22) +  #define TLB_L2CLEAN_FR	(1 << 29)		/* Feroceon */  #define TLB_DCLEAN	(1 << 30)  #define TLB_WB		(1 << 31) @@ -183,7 +186,7 @@  #endif  #ifdef CONFIG_SMP -#define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_BTB | \ +#define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_V7_IS_BTB | \  			 TLB_V7_UIS_FULL | TLB_V7_UIS_PAGE | TLB_V7_UIS_ASID)  #else  #define v7wbi_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_BTB | \ @@ -339,6 +342,12 @@ static inline void local_flush_tlb_all(void)  		dsb();  		isb();  	} +	if (tlb_flag(TLB_V7_IS_BTB)) { +		/* flush the branch target cache */ +		asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); +		dsb(); +		isb(); +	}  }  static inline void local_flush_tlb_mm(struct mm_struct *mm) @@ -376,6 +385,12 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)  		asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc");  		dsb();  	} +	if (tlb_flag(TLB_V7_IS_BTB)) { +		/* flush the branch target cache */ +		asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); +		dsb(); +		isb(); +	}  }  static inline void @@ -416,6 +431,12 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)  		asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero) : "cc");  		dsb();  	} +	if (tlb_flag(TLB_V7_IS_BTB)) { +		/* flush the branch target cache */ +		asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); +		dsb(); +		isb(); +	}  }  static inline void local_flush_tlb_kernel_page(unsigned long kaddr) @@ -454,6 +475,12 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)  		dsb();  		isb();  	} +	if (tlb_flag(TLB_V7_IS_BTB)) { +		/* flush the branch target cache */ +		asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero) : "cc"); +		dsb(); +		isb(); +	}  }  /* diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 1d6bd40a432..33e4a48fe10 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -229,16 +229,16 @@ do {									\  	__asm__ __volatile__(					\  	"1:	ldrbt	%1,[%2]\n"				\  	"2:\n"							\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\  	"3:	mov	%0, %3\n"				\  	"	mov	%1, #0\n"				\  	"	b	2b\n"					\ -	"	.previous\n"					\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 3b\n"				\ -	"	.previous"					\ +	"	.popsection"					\  	: "+r" (err), "=&r" (x)					\  	: "r" (addr), "i" (-EFAULT)				\  	: "cc") @@ -265,16 +265,16 @@ do {									\  	__asm__ __volatile__(					\  	"1:	ldrt	%1,[%2]\n"				\  	"2:\n"							\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\  	"3:	mov	%0, %3\n"				\  	"	mov	%1, #0\n"				\  	"	b	2b\n"					\ -	"	.previous\n"					\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 3b\n"				\ -	"	.previous"					\ +	"	.popsection"					\  	: "+r" (err), "=&r" (x)					\  	: "r" (addr), "i" (-EFAULT)				\  	: "cc") @@ -310,15 +310,15 @@ do {									\  	__asm__ __volatile__(					\  	"1:	strbt	%1,[%2]\n"				\  	"2:\n"							\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\  	"3:	mov	%0, %3\n"				\  	"	b	2b\n"					\ -	"	.previous\n"					\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 3b\n"				\ -	"	.previous"					\ +	"	.popsection"					\  	: "+r" (err)						\  	: "r" (x), "r" (__pu_addr), "i" (-EFAULT)		\  	: "cc") @@ -343,15 +343,15 @@ do {									\  	__asm__ __volatile__(					\  	"1:	strt	%1,[%2]\n"				\  	"2:\n"							\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\  	"3:	mov	%0, %3\n"				\  	"	b	2b\n"					\ -	"	.previous\n"					\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 3b\n"				\ -	"	.previous"					\ +	"	.popsection"					\  	: "+r" (err)						\  	: "r" (x), "r" (__pu_addr), "i" (-EFAULT)		\  	: "cc") @@ -371,16 +371,16 @@ do {									\   THUMB(	"1:	strt	" __reg_oper1 ", [%1]\n"	)	\   THUMB(	"2:	strt	" __reg_oper0 ", [%1, #4]\n"	)	\  	"3:\n"							\ -	"	.section .fixup,\"ax\"\n"			\ +	"	.pushsection .fixup,\"ax\"\n"			\  	"	.align	2\n"					\  	"4:	mov	%0, %3\n"				\  	"	b	3b\n"					\ -	"	.previous\n"					\ -	"	.section __ex_table,\"a\"\n"			\ +	"	.popsection\n"					\ +	"	.pushsection __ex_table,\"a\"\n"		\  	"	.align	3\n"					\  	"	.long	1b, 4b\n"				\  	"	.long	2b, 4b\n"				\ -	"	.previous"					\ +	"	.popsection"					\  	: "+r" (err), "+r" (__pu_addr)				\  	: "r" (x), "i" (-EFAULT)				\  	: "cc")  |