Commit d15dc68c authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle

MIPS: cmpxchg: Error out on unsupported xchg() calls

xchg() has up until now simply returned the x parameter in cases where
it is called with a pointer to a value of an unsupported size. This will
often cause the calling code to hit a failure path, presuming that the
value of x differs from the content of the memory pointed at by ptr, but
we can do better by producing a compile-time or link-time error such
that unsupported calls to xchg() are detectable earlier than runtime.

This patch does this in the same was as is already done for cmpxchg(),
using a call to a missing function annotated with __compiletime_error().
Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/16351/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 77299db8
...@@ -24,6 +24,21 @@ ...@@ -24,6 +24,21 @@
# define __scbeqz "beqz" # define __scbeqz "beqz"
#endif #endif
/*
* These functions doesn't exist, so if they are 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)
__compiletime_error("Bad argument size for cmpxchg");
extern unsigned long __xchg_called_with_bad_pointer(void)
__compiletime_error("Bad argument size for xchg");
#define __xchg_asm(ld, st, m, val) \ #define __xchg_asm(ld, st, m, val) \
({ \ ({ \
__typeof(*(m)) __ret; \ __typeof(*(m)) __ret; \
...@@ -89,9 +104,9 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz ...@@ -89,9 +104,9 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
return __xchg_u32(ptr, x); return __xchg_u32(ptr, x);
case 8: case 8:
return __xchg_u64(ptr, x); return __xchg_u64(ptr, x);
default:
return __xchg_called_with_bad_pointer();
} }
return x;
} }
#define xchg(ptr, x) \ #define xchg(ptr, x) \
...@@ -136,19 +151,6 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz ...@@ -136,19 +151,6 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
__ret; \ __ret; \
}) })
/*
* 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)
__compiletime_error("Bad argument size for cmpxchg");
#define __cmpxchg(ptr, old, new, pre_barrier, post_barrier) \ #define __cmpxchg(ptr, old, new, pre_barrier, post_barrier) \
({ \ ({ \
__typeof__(ptr) __ptr = (ptr); \ __typeof__(ptr) __ptr = (ptr); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment