forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.2 KiB
171 lines
4.2 KiB
#ifndef LINUX_KMEMCHECK_H |
|
#define LINUX_KMEMCHECK_H |
|
|
|
#include <linux/mm_types.h> |
|
#include <linux/types.h> |
|
|
|
#ifdef CONFIG_KMEMCHECK |
|
extern int kmemcheck_enabled; |
|
|
|
/* The slab-related functions. */ |
|
void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node); |
|
void kmemcheck_free_shadow(struct page *page, int order); |
|
void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, |
|
size_t size); |
|
void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size); |
|
|
|
void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order, |
|
gfp_t gfpflags); |
|
|
|
void kmemcheck_show_pages(struct page *p, unsigned int n); |
|
void kmemcheck_hide_pages(struct page *p, unsigned int n); |
|
|
|
bool kmemcheck_page_is_tracked(struct page *p); |
|
|
|
void kmemcheck_mark_unallocated(void *address, unsigned int n); |
|
void kmemcheck_mark_uninitialized(void *address, unsigned int n); |
|
void kmemcheck_mark_initialized(void *address, unsigned int n); |
|
void kmemcheck_mark_freed(void *address, unsigned int n); |
|
|
|
void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n); |
|
void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n); |
|
void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n); |
|
|
|
int kmemcheck_show_addr(unsigned long address); |
|
int kmemcheck_hide_addr(unsigned long address); |
|
|
|
bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size); |
|
|
|
/* |
|
* Bitfield annotations |
|
* |
|
* How to use: If you have a struct using bitfields, for example |
|
* |
|
* struct a { |
|
* int x:8, y:8; |
|
* }; |
|
* |
|
* then this should be rewritten as |
|
* |
|
* struct a { |
|
* kmemcheck_bitfield_begin(flags); |
|
* int x:8, y:8; |
|
* kmemcheck_bitfield_end(flags); |
|
* }; |
|
* |
|
* Now the "flags_begin" and "flags_end" members may be used to refer to the |
|
* beginning and end, respectively, of the bitfield (and things like |
|
* &x.flags_begin is allowed). As soon as the struct is allocated, the bit- |
|
* fields should be annotated: |
|
* |
|
* struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL); |
|
* kmemcheck_annotate_bitfield(a, flags); |
|
*/ |
|
#define kmemcheck_bitfield_begin(name) \ |
|
int name##_begin[0]; |
|
|
|
#define kmemcheck_bitfield_end(name) \ |
|
int name##_end[0]; |
|
|
|
#define kmemcheck_annotate_bitfield(ptr, name) \ |
|
do { \ |
|
int _n; \ |
|
\ |
|
if (!ptr) \ |
|
break; \ |
|
\ |
|
_n = (long) &((ptr)->name##_end) \ |
|
- (long) &((ptr)->name##_begin); \ |
|
BUILD_BUG_ON(_n < 0); \ |
|
\ |
|
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \ |
|
} while (0) |
|
|
|
#define kmemcheck_annotate_variable(var) \ |
|
do { \ |
|
kmemcheck_mark_initialized(&(var), sizeof(var)); \ |
|
} while (0) \ |
|
|
|
#else |
|
#define kmemcheck_enabled 0 |
|
|
|
static inline void |
|
kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node) |
|
{ |
|
} |
|
|
|
static inline void |
|
kmemcheck_free_shadow(struct page *page, int order) |
|
{ |
|
} |
|
|
|
static inline void |
|
kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object, |
|
size_t size) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object, |
|
size_t size) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_pagealloc_alloc(struct page *p, |
|
unsigned int order, gfp_t gfpflags) |
|
{ |
|
} |
|
|
|
static inline bool kmemcheck_page_is_tracked(struct page *p) |
|
{ |
|
return false; |
|
} |
|
|
|
static inline void kmemcheck_mark_unallocated(void *address, unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_initialized(void *address, unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_freed(void *address, unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_unallocated_pages(struct page *p, |
|
unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_uninitialized_pages(struct page *p, |
|
unsigned int n) |
|
{ |
|
} |
|
|
|
static inline void kmemcheck_mark_initialized_pages(struct page *p, |
|
unsigned int n) |
|
{ |
|
} |
|
|
|
static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size) |
|
{ |
|
return true; |
|
} |
|
|
|
#define kmemcheck_bitfield_begin(name) |
|
#define kmemcheck_bitfield_end(name) |
|
#define kmemcheck_annotate_bitfield(ptr, name) \ |
|
do { \ |
|
} while (0) |
|
|
|
#define kmemcheck_annotate_variable(var) \ |
|
do { \ |
|
} while (0) |
|
|
|
#endif /* CONFIG_KMEMCHECK */ |
|
|
|
#endif /* LINUX_KMEMCHECK_H */
|
|
|