|
@@ -12,6 +12,7 @@
|
|
|
#ifndef _ASM_SYSTEM_H
|
|
|
#define _ASM_SYSTEM_H
|
|
|
|
|
|
+#include <linux/kernel.h>
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/irqflags.h>
|
|
|
|
|
@@ -193,10 +194,6 @@ extern __u64 __xchg_u64_unsupported_on_32bit_kernels(volatile __u64 * m, __u64 v
|
|
|
#define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels
|
|
|
#endif
|
|
|
|
|
|
-/* This function doesn't exist, so you'll get a linker error
|
|
|
- if something tries to do an invalid xchg(). */
|
|
|
-extern void __xchg_called_with_bad_pointer(void);
|
|
|
-
|
|
|
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
|
|
|
{
|
|
|
switch (size) {
|
|
@@ -205,11 +202,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
|
|
|
case 8:
|
|
|
return __xchg_u64(ptr, x);
|
|
|
}
|
|
|
- __xchg_called_with_bad_pointer();
|
|
|
+
|
|
|
return x;
|
|
|
}
|
|
|
|
|
|
-#define xchg(ptr, x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
|
|
|
+#define xchg(ptr, x) \
|
|
|
+({ \
|
|
|
+ BUILD_BUG_ON(sizeof(*(ptr)) & ~0xc); \
|
|
|
+ \
|
|
|
+ ((__typeof__(*(ptr))) \
|
|
|
+ __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))); \
|
|
|
+})
|
|
|
|
|
|
extern void set_handler(unsigned long offset, void *addr, unsigned long len);
|
|
|
extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len);
|