mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-14 13:06:45 +07:00
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: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
This commit is contained in:
parent
0a5c3c2f47
commit
9779048d71
@ -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)
|
|||||||
__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)
|
|||||||
__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)
|
|||||||
__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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
||||||
|
{
|
||||||
|
if (arch_test_bit(nr, ptr))
|
||||||
|
return 1;
|
||||||
|
return arch_test_and_set_bit(nr, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void arch_clear_bit_unlock(unsigned long nr,
|
||||||
volatile unsigned long *ptr)
|
volatile unsigned long *ptr)
|
||||||
{
|
|
||||||
if (test_bit(nr, ptr))
|
|
||||||
return 1;
|
|
||||||
return test_and_set_bit(nr, ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void clear_bit_unlock(unsigned long nr,
|
|
||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user