linux/include/linux/kmemcheck.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef LINUX_KMEMCHECK_H
   3#define LINUX_KMEMCHECK_H
   4
   5#include <linux/mm_types.h>
   6#include <linux/types.h>
   7
   8#ifdef CONFIG_KMEMCHECK
   9extern int kmemcheck_enabled;
  10
  11/* The slab-related functions. */
  12void kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node);
  13void kmemcheck_free_shadow(struct page *page, int order);
  14void kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
  15                          size_t size);
  16void kmemcheck_slab_free(struct kmem_cache *s, void *object, size_t size);
  17
  18void kmemcheck_pagealloc_alloc(struct page *p, unsigned int order,
  19                               gfp_t gfpflags);
  20
  21void kmemcheck_show_pages(struct page *p, unsigned int n);
  22void kmemcheck_hide_pages(struct page *p, unsigned int n);
  23
  24bool kmemcheck_page_is_tracked(struct page *p);
  25
  26void kmemcheck_mark_unallocated(void *address, unsigned int n);
  27void kmemcheck_mark_uninitialized(void *address, unsigned int n);
  28void kmemcheck_mark_initialized(void *address, unsigned int n);
  29void kmemcheck_mark_freed(void *address, unsigned int n);
  30
  31void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n);
  32void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n);
  33void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n);
  34
  35int kmemcheck_show_addr(unsigned long address);
  36int kmemcheck_hide_addr(unsigned long address);
  37
  38bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size);
  39
  40/*
  41 * Bitfield annotations
  42 *
  43 * How to use: If you have a struct using bitfields, for example
  44 *
  45 *     struct a {
  46 *             int x:8, y:8;
  47 *     };
  48 *
  49 * then this should be rewritten as
  50 *
  51 *     struct a {
  52 *             kmemcheck_bitfield_begin(flags);
  53 *             int x:8, y:8;
  54 *             kmemcheck_bitfield_end(flags);
  55 *     };
  56 *
  57 * Now the "flags_begin" and "flags_end" members may be used to refer to the
  58 * beginning and end, respectively, of the bitfield (and things like
  59 * &x.flags_begin is allowed). As soon as the struct is allocated, the bit-
  60 * fields should be annotated:
  61 *
  62 *     struct a *a = kmalloc(sizeof(struct a), GFP_KERNEL);
  63 *     kmemcheck_annotate_bitfield(a, flags);
  64 */
  65#define kmemcheck_bitfield_begin(name)  \
  66        int name##_begin[0];
  67
  68#define kmemcheck_bitfield_end(name)    \
  69        int name##_end[0];
  70
  71#define kmemcheck_annotate_bitfield(ptr, name)                          \
  72        do {                                                            \
  73                int _n;                                                 \
  74                                                                        \
  75                if (!ptr)                                               \
  76                        break;                                          \
  77                                                                        \
  78                _n = (long) &((ptr)->name##_end)                        \
  79                        - (long) &((ptr)->name##_begin);                \
  80                BUILD_BUG_ON(_n < 0);                                   \
  81                                                                        \
  82                kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
  83        } while (0)
  84
  85#define kmemcheck_annotate_variable(var)                                \
  86        do {                                                            \
  87                kmemcheck_mark_initialized(&(var), sizeof(var));        \
  88        } while (0)                                                     \
  89
  90#else
  91#define kmemcheck_enabled 0
  92
  93static inline void
  94kmemcheck_alloc_shadow(struct page *page, int order, gfp_t flags, int node)
  95{
  96}
  97
  98static inline void
  99kmemcheck_free_shadow(struct page *page, int order)
 100{
 101}
 102
 103static inline void
 104kmemcheck_slab_alloc(struct kmem_cache *s, gfp_t gfpflags, void *object,
 105                     size_t size)
 106{
 107}
 108
 109static inline void kmemcheck_slab_free(struct kmem_cache *s, void *object,
 110                                       size_t size)
 111{
 112}
 113
 114static inline void kmemcheck_pagealloc_alloc(struct page *p,
 115        unsigned int order, gfp_t gfpflags)
 116{
 117}
 118
 119static inline bool kmemcheck_page_is_tracked(struct page *p)
 120{
 121        return false;
 122}
 123
 124static inline void kmemcheck_mark_unallocated(void *address, unsigned int n)
 125{
 126}
 127
 128static inline void kmemcheck_mark_uninitialized(void *address, unsigned int n)
 129{
 130}
 131
 132static inline void kmemcheck_mark_initialized(void *address, unsigned int n)
 133{
 134}
 135
 136static inline void kmemcheck_mark_freed(void *address, unsigned int n)
 137{
 138}
 139
 140static inline void kmemcheck_mark_unallocated_pages(struct page *p,
 141                                                    unsigned int n)
 142{
 143}
 144
 145static inline void kmemcheck_mark_uninitialized_pages(struct page *p,
 146                                                      unsigned int n)
 147{
 148}
 149
 150static inline void kmemcheck_mark_initialized_pages(struct page *p,
 151                                                    unsigned int n)
 152{
 153}
 154
 155static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size)
 156{
 157        return true;
 158}
 159
 160#define kmemcheck_bitfield_begin(name)
 161#define kmemcheck_bitfield_end(name)
 162#define kmemcheck_annotate_bitfield(ptr, name)  \
 163        do {                                    \
 164        } while (0)
 165
 166#define kmemcheck_annotate_variable(var)        \
 167        do {                                    \
 168        } while (0)
 169
 170#endif /* CONFIG_KMEMCHECK */
 171
 172#endif /* LINUX_KMEMCHECK_H */
 173