Commit 9779048d authored by Vasily Gorbik's avatar Vasily Gorbik Committed by Heiko Carstens

s390/kasan: add bitops instrumentation

Add KASAN instrumentation of architecture-specific asm implementation
of bitops. It also covers s390 specific *_inv functions.
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
parent 0a5c3c2f
...@@ -56,7 +56,7 @@ __bitops_byte(unsigned long nr, volatile unsigned long *ptr) ...@@ -56,7 +56,7 @@ __bitops_byte(unsigned long nr, volatile unsigned long *ptr)
return ((unsigned char *)ptr) + ((nr ^ (BITS_PER_LONG - 8)) >> 3); return ((unsigned char *)ptr) + ((nr ^ (BITS_PER_LONG - 8)) >> 3);
} }
static inline void set_bit(unsigned long nr, volatile unsigned long *ptr) static inline void arch_set_bit(unsigned long nr, volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long mask; unsigned long mask;
...@@ -77,7 +77,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -77,7 +77,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *ptr)
__atomic64_or(mask, (long *)addr); __atomic64_or(mask, (long *)addr);
} }
static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr) static inline void arch_clear_bit(unsigned long nr, volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long mask; unsigned long mask;
...@@ -98,7 +98,8 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -98,7 +98,8 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr)
__atomic64_and(mask, (long *)addr); __atomic64_and(mask, (long *)addr);
} }
static inline void change_bit(unsigned long nr, volatile unsigned long *ptr) static inline void arch_change_bit(unsigned long nr,
volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long mask; unsigned long mask;
...@@ -119,8 +120,8 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -119,8 +120,8 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *ptr)
__atomic64_xor(mask, (long *)addr); __atomic64_xor(mask, (long *)addr);
} }
static inline bool static inline bool arch_test_and_set_bit(unsigned long nr,
test_and_set_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long old, mask; unsigned long old, mask;
...@@ -130,8 +131,8 @@ test_and_set_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -130,8 +131,8 @@ test_and_set_bit(unsigned long nr, volatile unsigned long *ptr)
return (old & mask) != 0; return (old & mask) != 0;
} }
static inline bool static inline bool arch_test_and_clear_bit(unsigned long nr,
test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long old, mask; unsigned long old, mask;
...@@ -141,8 +142,8 @@ test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -141,8 +142,8 @@ test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr)
return (old & ~mask) != 0; return (old & ~mask) != 0;
} }
static inline bool static inline bool arch_test_and_change_bit(unsigned long nr,
test_and_change_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned long *addr = __bitops_word(nr, ptr); unsigned long *addr = __bitops_word(nr, ptr);
unsigned long old, mask; unsigned long old, mask;
...@@ -152,30 +153,31 @@ test_and_change_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -152,30 +153,31 @@ test_and_change_bit(unsigned long nr, volatile unsigned long *ptr)
return (old & mask) != 0; return (old & mask) != 0;
} }
static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr) static inline void arch___set_bit(unsigned long nr, volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
*addr |= 1 << (nr & 7); *addr |= 1 << (nr & 7);
} }
static inline void static inline void arch___clear_bit(unsigned long nr,
__clear_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
*addr &= ~(1 << (nr & 7)); *addr &= ~(1 << (nr & 7));
} }
static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr) static inline void arch___change_bit(unsigned long nr,
volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
*addr ^= 1 << (nr & 7); *addr ^= 1 << (nr & 7);
} }
static inline bool static inline bool arch___test_and_set_bit(unsigned long nr,
__test_and_set_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
unsigned char ch; unsigned char ch;
...@@ -185,8 +187,8 @@ __test_and_set_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -185,8 +187,8 @@ __test_and_set_bit(unsigned long nr, volatile unsigned long *ptr)
return (ch >> (nr & 7)) & 1; return (ch >> (nr & 7)) & 1;
} }
static inline bool static inline bool arch___test_and_clear_bit(unsigned long nr,
__test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
unsigned char ch; unsigned char ch;
...@@ -196,8 +198,8 @@ __test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -196,8 +198,8 @@ __test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr)
return (ch >> (nr & 7)) & 1; return (ch >> (nr & 7)) & 1;
} }
static inline bool static inline bool arch___test_and_change_bit(unsigned long nr,
__test_and_change_bit(unsigned long nr, volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
unsigned char *addr = __bitops_byte(nr, ptr); unsigned char *addr = __bitops_byte(nr, ptr);
unsigned char ch; unsigned char ch;
...@@ -207,7 +209,8 @@ __test_and_change_bit(unsigned long nr, volatile unsigned long *ptr) ...@@ -207,7 +209,8 @@ __test_and_change_bit(unsigned long nr, volatile unsigned long *ptr)
return (ch >> (nr & 7)) & 1; return (ch >> (nr & 7)) & 1;
} }
static inline bool test_bit(unsigned long nr, const volatile unsigned long *ptr) static inline bool arch_test_bit(unsigned long nr,
const volatile unsigned long *ptr)
{ {
const volatile unsigned char *addr; const volatile unsigned char *addr;
...@@ -216,28 +219,30 @@ static inline bool test_bit(unsigned long nr, const volatile unsigned long *ptr) ...@@ -216,28 +219,30 @@ static inline bool test_bit(unsigned long nr, const volatile unsigned long *ptr)
return (*addr >> (nr & 7)) & 1; return (*addr >> (nr & 7)) & 1;
} }
static inline bool test_and_set_bit_lock(unsigned long nr, static inline bool arch_test_and_set_bit_lock(unsigned long nr,
volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
if (test_bit(nr, ptr)) if (arch_test_bit(nr, ptr))
return 1; return 1;
return test_and_set_bit(nr, ptr); return arch_test_and_set_bit(nr, ptr);
} }
static inline void clear_bit_unlock(unsigned long nr, static inline void arch_clear_bit_unlock(unsigned long nr,
volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
smp_mb__before_atomic(); smp_mb__before_atomic();
clear_bit(nr, ptr); arch_clear_bit(nr, ptr);
} }
static inline void __clear_bit_unlock(unsigned long nr, static inline void arch___clear_bit_unlock(unsigned long nr,
volatile unsigned long *ptr) volatile unsigned long *ptr)
{ {
smp_mb(); smp_mb();
__clear_bit(nr, ptr); arch___clear_bit(nr, ptr);
} }
#include <asm-generic/bitops-instrumented.h>
/* /*
* Functions which use MSB0 bit numbering. * Functions which use MSB0 bit numbering.
* The bits are numbered: * The bits are numbered:
......
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