[S390] Force link error if xchg/cmpxchg gets called with unsupported size.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
Heiko Carstens 2007-10-12 16:11:41 +02:00 коммит произвёл Martin Schwidefsky
Родитель c622498e5c
Коммит 210d3a90ce
1 изменённых файлов: 13 добавлений и 11 удалений

Просмотреть файл

@ -130,6 +130,8 @@ extern void pfault_fini(void);
__ret; \ __ret; \
}) })
extern void __xchg_called_with_bad_pointer(void);
static inline unsigned long __xchg(unsigned long x, void * ptr, int size) static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
{ {
unsigned long addr, old; unsigned long addr, old;
@ -150,8 +152,7 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
: "=&d" (old), "=m" (*(int *) addr) : "=&d" (old), "=m" (*(int *) addr)
: "d" (x << shift), "d" (~(255 << shift)), "a" (addr), : "d" (x << shift), "d" (~(255 << shift)), "a" (addr),
"m" (*(int *) addr) : "memory", "cc", "0"); "m" (*(int *) addr) : "memory", "cc", "0");
x = old >> shift; return old >> shift;
break;
case 2: case 2:
addr = (unsigned long) ptr; addr = (unsigned long) ptr;
shift = (2 ^ (addr & 2)) << 3; shift = (2 ^ (addr & 2)) << 3;
@ -166,8 +167,7 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
: "=&d" (old), "=m" (*(int *) addr) : "=&d" (old), "=m" (*(int *) addr)
: "d" (x << shift), "d" (~(65535 << shift)), "a" (addr), : "d" (x << shift), "d" (~(65535 << shift)), "a" (addr),
"m" (*(int *) addr) : "memory", "cc", "0"); "m" (*(int *) addr) : "memory", "cc", "0");
x = old >> shift; return old >> shift;
break;
case 4: case 4:
asm volatile( asm volatile(
" l %0,0(%3)\n" " l %0,0(%3)\n"
@ -176,8 +176,7 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
: "=&d" (old), "=m" (*(int *) ptr) : "=&d" (old), "=m" (*(int *) ptr)
: "d" (x), "a" (ptr), "m" (*(int *) ptr) : "d" (x), "a" (ptr), "m" (*(int *) ptr)
: "memory", "cc"); : "memory", "cc");
x = old; return old;
break;
#ifdef __s390x__ #ifdef __s390x__
case 8: case 8:
asm volatile( asm volatile(
@ -187,11 +186,11 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
: "=&d" (old), "=m" (*(long *) ptr) : "=&d" (old), "=m" (*(long *) ptr)
: "d" (x), "a" (ptr), "m" (*(long *) ptr) : "d" (x), "a" (ptr), "m" (*(long *) ptr)
: "memory", "cc"); : "memory", "cc");
x = old; return old;
break;
#endif /* __s390x__ */ #endif /* __s390x__ */
} }
return x; __xchg_called_with_bad_pointer();
return x;
} }
/* /*
@ -206,6 +205,8 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
(unsigned long)(n),sizeof(*(ptr)))) (unsigned long)(n),sizeof(*(ptr))))
extern void __cmpxchg_called_with_bad_pointer(void);
static inline unsigned long static inline unsigned long
__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
{ {
@ -270,7 +271,8 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
return prev; return prev;
#endif /* __s390x__ */ #endif /* __s390x__ */
} }
return old; __cmpxchg_called_with_bad_pointer();
return old;
} }
/* /*