linux/include/linux/debugobjects.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_DEBUGOBJECTS_H
   3#define _LINUX_DEBUGOBJECTS_H
   4
   5#include <linux/list.h>
   6#include <linux/spinlock.h>
   7
   8enum debug_obj_state {
   9        ODEBUG_STATE_NONE,
  10        ODEBUG_STATE_INIT,
  11        ODEBUG_STATE_INACTIVE,
  12        ODEBUG_STATE_ACTIVE,
  13        ODEBUG_STATE_DESTROYED,
  14        ODEBUG_STATE_NOTAVAILABLE,
  15        ODEBUG_STATE_MAX,
  16};
  17
  18struct debug_obj_descr;
  19
  20/**
  21 * struct debug_obj - representaion of an tracked object
  22 * @node:       hlist node to link the object into the tracker list
  23 * @state:      tracked object state
  24 * @astate:     current active state
  25 * @object:     pointer to the real object
  26 * @descr:      pointer to an object type specific debug description structure
  27 */
  28struct debug_obj {
  29        struct hlist_node       node;
  30        enum debug_obj_state    state;
  31        unsigned int            astate;
  32        void                    *object;
  33        struct debug_obj_descr  *descr;
  34};
  35
  36/**
  37 * struct debug_obj_descr - object type specific debug description structure
  38 *
  39 * @name:               name of the object typee
  40 * @debug_hint:         function returning address, which have associated
  41 *                      kernel symbol, to allow identify the object
  42 * @is_static_object:   return true if the obj is static, otherwise return false
  43 * @fixup_init:         fixup function, which is called when the init check
  44 *                      fails. All fixup functions must return true if fixup
  45 *                      was successful, otherwise return false
  46 * @fixup_activate:     fixup function, which is called when the activate check
  47 *                      fails
  48 * @fixup_destroy:      fixup function, which is called when the destroy check
  49 *                      fails
  50 * @fixup_free:         fixup function, which is called when the free check
  51 *                      fails
  52 * @fixup_assert_init:  fixup function, which is called when the assert_init
  53 *                      check fails
  54 */
  55struct debug_obj_descr {
  56        const char              *name;
  57        void *(*debug_hint)(void *addr);
  58        bool (*is_static_object)(void *addr);
  59        bool (*fixup_init)(void *addr, enum debug_obj_state state);
  60        bool (*fixup_activate)(void *addr, enum debug_obj_state state);
  61        bool (*fixup_destroy)(void *addr, enum debug_obj_state state);
  62        bool (*fixup_free)(void *addr, enum debug_obj_state state);
  63        bool (*fixup_assert_init)(void *addr, enum debug_obj_state state);
  64};
  65
  66#ifdef CONFIG_DEBUG_OBJECTS
  67extern void debug_object_init      (void *addr, struct debug_obj_descr *descr);
  68extern void
  69debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr);
  70extern int debug_object_activate  (void *addr, struct debug_obj_descr *descr);
  71extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr);
  72extern void debug_object_destroy   (void *addr, struct debug_obj_descr *descr);
  73extern void debug_object_free      (void *addr, struct debug_obj_descr *descr);
  74extern void debug_object_assert_init(void *addr, struct debug_obj_descr *descr);
  75
  76/*
  77 * Active state:
  78 * - Set at 0 upon initialization.
  79 * - Must return to 0 before deactivation.
  80 */
  81extern void
  82debug_object_active_state(void *addr, struct debug_obj_descr *descr,
  83                          unsigned int expect, unsigned int next);
  84
  85extern void debug_objects_early_init(void);
  86extern void debug_objects_mem_init(void);
  87#else
  88static inline void
  89debug_object_init      (void *addr, struct debug_obj_descr *descr) { }
  90static inline void
  91debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) { }
  92static inline int
  93debug_object_activate  (void *addr, struct debug_obj_descr *descr) { return 0; }
  94static inline void
  95debug_object_deactivate(void *addr, struct debug_obj_descr *descr) { }
  96static inline void
  97debug_object_destroy   (void *addr, struct debug_obj_descr *descr) { }
  98static inline void
  99debug_object_free      (void *addr, struct debug_obj_descr *descr) { }
 100static inline void
 101debug_object_assert_init(void *addr, struct debug_obj_descr *descr) { }
 102
 103static inline void debug_objects_early_init(void) { }
 104static inline void debug_objects_mem_init(void) { }
 105#endif
 106
 107#ifdef CONFIG_DEBUG_OBJECTS_FREE
 108extern void debug_check_no_obj_freed(const void *address, unsigned long size);
 109#else
 110static inline void
 111debug_check_no_obj_freed(const void *address, unsigned long size) { }
 112#endif
 113
 114#endif
 115