tools: Copy linux/{hash,poison}.h and check for drift
We were also using this directly from the kernel sources, the two last cases, fix it. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-7o14xvacqcjc5llc7gvjjyl8@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
3aa0042769
Коммит
ae3c14a028
|
@ -1,5 +1,104 @@
|
||||||
#include "../../../include/linux/hash.h"
|
#ifndef _LINUX_HASH_H
|
||||||
|
#define _LINUX_HASH_H
|
||||||
|
/* Fast hashing routine for ints, longs and pointers.
|
||||||
|
(C) 2002 Nadia Yvette Chambers, IBM */
|
||||||
|
|
||||||
#ifndef _TOOLS_LINUX_HASH_H
|
#include <asm/types.h>
|
||||||
#define _TOOLS_LINUX_HASH_H
|
#include <linux/compiler.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The "GOLDEN_RATIO_PRIME" is used in ifs/btrfs/brtfs_inode.h and
|
||||||
|
* fs/inode.c. It's not actually prime any more (the previous primes
|
||||||
|
* were actively bad for hashing), but the name remains.
|
||||||
|
*/
|
||||||
|
#if BITS_PER_LONG == 32
|
||||||
|
#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_32
|
||||||
|
#define hash_long(val, bits) hash_32(val, bits)
|
||||||
|
#elif BITS_PER_LONG == 64
|
||||||
|
#define hash_long(val, bits) hash_64(val, bits)
|
||||||
|
#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_64
|
||||||
|
#else
|
||||||
|
#error Wordsize not 32 or 64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This hash multiplies the input by a large odd number and takes the
|
||||||
|
* high bits. Since multiplication propagates changes to the most
|
||||||
|
* significant end only, it is essential that the high bits of the
|
||||||
|
* product be used for the hash value.
|
||||||
|
*
|
||||||
|
* Chuck Lever verified the effectiveness of this technique:
|
||||||
|
* http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
|
||||||
|
*
|
||||||
|
* Although a random odd number will do, it turns out that the golden
|
||||||
|
* ratio phi = (sqrt(5)-1)/2, or its negative, has particularly nice
|
||||||
|
* properties. (See Knuth vol 3, section 6.4, exercise 9.)
|
||||||
|
*
|
||||||
|
* These are the negative, (1 - phi) = phi**2 = (3 - sqrt(5))/2,
|
||||||
|
* which is very slightly easier to multiply by and makes no
|
||||||
|
* difference to the hash distribution.
|
||||||
|
*/
|
||||||
|
#define GOLDEN_RATIO_32 0x61C88647
|
||||||
|
#define GOLDEN_RATIO_64 0x61C8864680B583EBull
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAVE_ARCH_HASH
|
||||||
|
/* This header may use the GOLDEN_RATIO_xx constants */
|
||||||
|
#include <asm/hash.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The _generic versions exist only so lib/test_hash.c can compare
|
||||||
|
* the arch-optimized versions with the generic.
|
||||||
|
*
|
||||||
|
* Note that if you change these, any <asm/hash.h> that aren't updated
|
||||||
|
* to match need to have their HAVE_ARCH_* define values updated so the
|
||||||
|
* self-test will not false-positive.
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_ARCH__HASH_32
|
||||||
|
#define __hash_32 __hash_32_generic
|
||||||
|
#endif
|
||||||
|
static inline u32 __hash_32_generic(u32 val)
|
||||||
|
{
|
||||||
|
return val * GOLDEN_RATIO_32;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_ARCH_HASH_32
|
||||||
|
#define hash_32 hash_32_generic
|
||||||
|
#endif
|
||||||
|
static inline u32 hash_32_generic(u32 val, unsigned int bits)
|
||||||
|
{
|
||||||
|
/* High bits are more random, so use them. */
|
||||||
|
return __hash_32(val) >> (32 - bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_ARCH_HASH_64
|
||||||
|
#define hash_64 hash_64_generic
|
||||||
|
#endif
|
||||||
|
static __always_inline u32 hash_64_generic(u64 val, unsigned int bits)
|
||||||
|
{
|
||||||
|
#if BITS_PER_LONG == 64
|
||||||
|
/* 64x64-bit multiply is efficient on all 64-bit processors */
|
||||||
|
return val * GOLDEN_RATIO_64 >> (64 - bits);
|
||||||
|
#else
|
||||||
|
/* Hash 64 bits using only 32x32-bit multiply. */
|
||||||
|
return hash_32((u32)val ^ __hash_32(val >> 32), bits);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u32 hash_ptr(const void *ptr, unsigned int bits)
|
||||||
|
{
|
||||||
|
return hash_long((unsigned long)ptr, bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This really should be called fold32_ptr; it does no hashing to speak of. */
|
||||||
|
static inline u32 hash32_ptr(const void *ptr)
|
||||||
|
{
|
||||||
|
unsigned long val = (unsigned long)ptr;
|
||||||
|
|
||||||
|
#if BITS_PER_LONG == 64
|
||||||
|
val ^= (val >> 32);
|
||||||
|
#endif
|
||||||
|
return (u32)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _LINUX_HASH_H */
|
||||||
|
|
|
@ -1 +1,90 @@
|
||||||
#include "../../../include/linux/poison.h"
|
#ifndef _LINUX_POISON_H
|
||||||
|
#define _LINUX_POISON_H
|
||||||
|
|
||||||
|
/********** include/linux/list.h **********/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Architectures might want to move the poison pointer offset
|
||||||
|
* into some well-recognized area such as 0xdead000000000000,
|
||||||
|
* that is also not mappable by user-space exploits:
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ILLEGAL_POINTER_VALUE
|
||||||
|
# define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL)
|
||||||
|
#else
|
||||||
|
# define POISON_POINTER_DELTA 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are non-NULL pointers that will result in page faults
|
||||||
|
* under normal circumstances, used to verify that nobody uses
|
||||||
|
* non-initialized list entries.
|
||||||
|
*/
|
||||||
|
#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA)
|
||||||
|
#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA)
|
||||||
|
|
||||||
|
/********** include/linux/timer.h **********/
|
||||||
|
/*
|
||||||
|
* Magic number "tsta" to indicate a static timer initializer
|
||||||
|
* for the object debugging code.
|
||||||
|
*/
|
||||||
|
#define TIMER_ENTRY_STATIC ((void *) 0x300 + POISON_POINTER_DELTA)
|
||||||
|
|
||||||
|
/********** mm/debug-pagealloc.c **********/
|
||||||
|
#ifdef CONFIG_PAGE_POISONING_ZERO
|
||||||
|
#define PAGE_POISON 0x00
|
||||||
|
#else
|
||||||
|
#define PAGE_POISON 0xaa
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/********** mm/page_alloc.c ************/
|
||||||
|
|
||||||
|
#define TAIL_MAPPING ((void *) 0x400 + POISON_POINTER_DELTA)
|
||||||
|
|
||||||
|
/********** mm/slab.c **********/
|
||||||
|
/*
|
||||||
|
* Magic nums for obj red zoning.
|
||||||
|
* Placed in the first word before and the first word after an obj.
|
||||||
|
*/
|
||||||
|
#define RED_INACTIVE 0x09F911029D74E35BULL /* when obj is inactive */
|
||||||
|
#define RED_ACTIVE 0xD84156C5635688C0ULL /* when obj is active */
|
||||||
|
|
||||||
|
#define SLUB_RED_INACTIVE 0xbb
|
||||||
|
#define SLUB_RED_ACTIVE 0xcc
|
||||||
|
|
||||||
|
/* ...and for poisoning */
|
||||||
|
#define POISON_INUSE 0x5a /* for use-uninitialised poisoning */
|
||||||
|
#define POISON_FREE 0x6b /* for use-after-free poisoning */
|
||||||
|
#define POISON_END 0xa5 /* end-byte of poisoning */
|
||||||
|
|
||||||
|
/********** arch/$ARCH/mm/init.c **********/
|
||||||
|
#define POISON_FREE_INITMEM 0xcc
|
||||||
|
|
||||||
|
/********** arch/ia64/hp/common/sba_iommu.c **********/
|
||||||
|
/*
|
||||||
|
* arch/ia64/hp/common/sba_iommu.c uses a 16-byte poison string with a
|
||||||
|
* value of "SBAIOMMU POISON\0" for spill-over poisoning.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/********** fs/jbd/journal.c **********/
|
||||||
|
#define JBD_POISON_FREE 0x5b
|
||||||
|
#define JBD2_POISON_FREE 0x5c
|
||||||
|
|
||||||
|
/********** drivers/base/dmapool.c **********/
|
||||||
|
#define POOL_POISON_FREED 0xa7 /* !inuse */
|
||||||
|
#define POOL_POISON_ALLOCATED 0xa9 /* !initted */
|
||||||
|
|
||||||
|
/********** drivers/atm/ **********/
|
||||||
|
#define ATM_POISON_FREE 0x12
|
||||||
|
#define ATM_POISON 0xdeadbeef
|
||||||
|
|
||||||
|
/********** kernel/mutexes **********/
|
||||||
|
#define MUTEX_DEBUG_INIT 0x11
|
||||||
|
#define MUTEX_DEBUG_FREE 0x22
|
||||||
|
|
||||||
|
/********** lib/flex_array.c **********/
|
||||||
|
#define FLEX_ARRAY_FREE 0x6c /* for use-after-free poisoning */
|
||||||
|
|
||||||
|
/********** security/ **********/
|
||||||
|
#define KEY_DESTROY 0xbd
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -77,6 +77,4 @@ tools/include/linux/stringify.h
|
||||||
tools/include/linux/types.h
|
tools/include/linux/types.h
|
||||||
tools/include/linux/err.h
|
tools/include/linux/err.h
|
||||||
tools/include/linux/bitmap.h
|
tools/include/linux/bitmap.h
|
||||||
include/linux/hash.h
|
|
||||||
tools/arch/*/include/uapi/asm/perf_regs.h
|
tools/arch/*/include/uapi/asm/perf_regs.h
|
||||||
include/linux/poison.h
|
|
||||||
|
|
|
@ -351,6 +351,9 @@ $(PERF_IN): prepare FORCE
|
||||||
@(test -f ../../include/uapi/linux/perf_event.h && ( \
|
@(test -f ../../include/uapi/linux/perf_event.h && ( \
|
||||||
(diff -B ../include/uapi/linux/perf_event.h ../../include/uapi/linux/perf_event.h >/dev/null) \
|
(diff -B ../include/uapi/linux/perf_event.h ../../include/uapi/linux/perf_event.h >/dev/null) \
|
||||||
|| echo "Warning: tools/include/uapi/linux/perf_event.h differs from kernel" >&2 )) || true
|
|| echo "Warning: tools/include/uapi/linux/perf_event.h differs from kernel" >&2 )) || true
|
||||||
|
@(test -f ../../include/linux/hash.h && ( \
|
||||||
|
(diff -B ../include/linux/hash.h ../../include/linux/hash.h >/dev/null) \
|
||||||
|
|| echo "Warning: tools/include/linux/hash.h differs from kernel" >&2 )) || true
|
||||||
@(test -f ../../include/uapi/linux/hw_breakpoint.h && ( \
|
@(test -f ../../include/uapi/linux/hw_breakpoint.h && ( \
|
||||||
(diff -B ../include/uapi/linux/hw_breakpoint.h ../../include/uapi/linux/hw_breakpoint.h >/dev/null) \
|
(diff -B ../include/uapi/linux/hw_breakpoint.h ../../include/uapi/linux/hw_breakpoint.h >/dev/null) \
|
||||||
|| echo "Warning: tools/include/uapi/linux/hw_breakpoint.h differs from kernel" >&2 )) || true
|
|| echo "Warning: tools/include/uapi/linux/hw_breakpoint.h differs from kernel" >&2 )) || true
|
||||||
|
|
Загрузка…
Ссылка в новой задаче