diff options
Diffstat (limited to 'include/linux/compiler.h')
| -rw-r--r-- | include/linux/compiler.h | 77 | 
1 files changed, 63 insertions, 14 deletions
| diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 42506e4d1f53..1921545c6351 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -99,22 +99,13 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,   * unique, to convince GCC not to merge duplicate inline asm statements.   */  #define annotate_reachable() ({						\ -	asm volatile("%c0:\n\t"						\ -		     ".pushsection .discard.reachable\n\t"		\ -		     ".long %c0b - .\n\t"				\ -		     ".popsection\n\t" : : "i" (__COUNTER__));		\ +	asm volatile("ANNOTATE_REACHABLE counter=%c0"			\ +		     : : "i" (__COUNTER__));				\  })  #define annotate_unreachable() ({					\ -	asm volatile("%c0:\n\t"						\ -		     ".pushsection .discard.unreachable\n\t"		\ -		     ".long %c0b - .\n\t"				\ -		     ".popsection\n\t" : : "i" (__COUNTER__));		\ +	asm volatile("ANNOTATE_UNREACHABLE counter=%c0"			\ +		     : : "i" (__COUNTER__));				\  }) -#define ASM_UNREACHABLE							\ -	"999:\n\t"							\ -	".pushsection .discard.unreachable\n\t"				\ -	".long 999b - .\n\t"						\ -	".popsection\n\t"  #else  #define annotate_reachable()  #define annotate_unreachable() @@ -280,6 +271,64 @@ unsigned long read_word_at_a_time(const void *addr)  #endif /* __KERNEL__ */ +/* + * Force the compiler to emit 'sym' as a symbol, so that we can reference + * it from inline assembler. Necessary in case 'sym' could be inlined + * otherwise, or eliminated entirely due to lack of references that are + * visible to the compiler. + */ +#define __ADDRESSABLE(sym) \ +	static void * __attribute__((section(".discard.addressable"), used)) \ +		__PASTE(__addressable_##sym, __LINE__) = (void *)&sym; + +/** + * offset_to_ptr - convert a relative memory offset to an absolute pointer + * @off:	the address of the 32-bit offset value + */ +static inline void *offset_to_ptr(const int *off) +{ +	return (void *)((unsigned long)off + *off); +} + +#else /* __ASSEMBLY__ */ + +#ifdef __KERNEL__ +#ifndef LINKER_SCRIPT + +#ifdef CONFIG_STACK_VALIDATION +.macro ANNOTATE_UNREACHABLE counter:req +\counter: +	.pushsection .discard.unreachable +	.long \counter\()b -. +	.popsection +.endm + +.macro ANNOTATE_REACHABLE counter:req +\counter: +	.pushsection .discard.reachable +	.long \counter\()b -. +	.popsection +.endm + +.macro ASM_UNREACHABLE +999: +	.pushsection .discard.unreachable +	.long 999b - . +	.popsection +.endm +#else /* CONFIG_STACK_VALIDATION */ +.macro ANNOTATE_UNREACHABLE counter:req +.endm + +.macro ANNOTATE_REACHABLE counter:req +.endm + +.macro ASM_UNREACHABLE +.endm +#endif /* CONFIG_STACK_VALIDATION */ + +#endif /* LINKER_SCRIPT */ +#endif /* __KERNEL__ */  #endif /* __ASSEMBLY__ */  #ifndef __optimize @@ -313,7 +362,7 @@ unsigned long read_word_at_a_time(const void *addr)  #ifdef __OPTIMIZE__  # define __compiletime_assert(condition, msg, prefix, suffix)		\  	do {								\ -		bool __cond = !(condition);				\ +		int __cond = !(condition);				\  		extern void prefix ## suffix(void) __compiletime_error(msg); \  		if (__cond)						\  			prefix ## suffix();				\ |