From: Paul Burton Date: Sat, 10 Jun 2017 00:26:35 +0000 (-0700) Subject: MIPS: cmpxchg: Use __compiletime_error() for bad cmpxchg() pointers X-Git-Tag: v4.13-rc1~7^2~48 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=77299db802d4a7ae43f7ca246adbff0420bc9f5a;p=karo-tx-linux.git MIPS: cmpxchg: Use __compiletime_error() for bad cmpxchg() pointers Our cmpxchg() implementation relies upon generating a call to a function which doesn't really exist (__cmpxchg_called_with_bad_pointer) to create a link failure in cases where cmpxchg() is called with a pointer to a value of an unsupported size. The __compiletime_error macro can be used to decorate a function such that a call to it generates a compile-time, rather than a link-time, error. This patch uses __compiletime_error to cause bad cmpxchg() calls to error out at compile time rather than link time, allowing errors to occur more quickly & making it easier to spot where the problem comes from. Signed-off-by: Paul Burton Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/16350/ Signed-off-by: Ralf Baechle --- diff --git a/arch/mips/include/asm/cmpxchg.h b/arch/mips/include/asm/cmpxchg.h index a19359649b60..ee0214e00ab1 100644 --- a/arch/mips/include/asm/cmpxchg.h +++ b/arch/mips/include/asm/cmpxchg.h @@ -137,10 +137,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz }) /* - * This function doesn't exist, so you'll get a linker error - * if something tries to do an invalid cmpxchg(). + * This function doesn't exist, so if it is called you'll either: + * + * - Get an error at compile-time due to __compiletime_error, if supported by + * your compiler. + * + * or: + * + * - Get an error at link-time due to the call to the missing function. */ -extern void __cmpxchg_called_with_bad_pointer(void); +extern void __cmpxchg_called_with_bad_pointer(void) + __compiletime_error("Bad argument size for cmpxchg"); #define __cmpxchg(ptr, old, new, pre_barrier, post_barrier) \ ({ \