1*3ac7fe5aSThomas Gleixner #ifndef _LINUX_DEBUGOBJECTS_H 2*3ac7fe5aSThomas Gleixner #define _LINUX_DEBUGOBJECTS_H 3*3ac7fe5aSThomas Gleixner 4*3ac7fe5aSThomas Gleixner #include <linux/list.h> 5*3ac7fe5aSThomas Gleixner #include <linux/spinlock.h> 6*3ac7fe5aSThomas Gleixner 7*3ac7fe5aSThomas Gleixner enum debug_obj_state { 8*3ac7fe5aSThomas Gleixner ODEBUG_STATE_NONE, 9*3ac7fe5aSThomas Gleixner ODEBUG_STATE_INIT, 10*3ac7fe5aSThomas Gleixner ODEBUG_STATE_INACTIVE, 11*3ac7fe5aSThomas Gleixner ODEBUG_STATE_ACTIVE, 12*3ac7fe5aSThomas Gleixner ODEBUG_STATE_DESTROYED, 13*3ac7fe5aSThomas Gleixner ODEBUG_STATE_NOTAVAILABLE, 14*3ac7fe5aSThomas Gleixner ODEBUG_STATE_MAX, 15*3ac7fe5aSThomas Gleixner }; 16*3ac7fe5aSThomas Gleixner 17*3ac7fe5aSThomas Gleixner struct debug_obj_descr; 18*3ac7fe5aSThomas Gleixner 19*3ac7fe5aSThomas Gleixner /** 20*3ac7fe5aSThomas Gleixner * struct debug_obj - representaion of an tracked object 21*3ac7fe5aSThomas Gleixner * @node: hlist node to link the object into the tracker list 22*3ac7fe5aSThomas Gleixner * @state: tracked object state 23*3ac7fe5aSThomas Gleixner * @object: pointer to the real object 24*3ac7fe5aSThomas Gleixner * @descr: pointer to an object type specific debug description structure 25*3ac7fe5aSThomas Gleixner */ 26*3ac7fe5aSThomas Gleixner struct debug_obj { 27*3ac7fe5aSThomas Gleixner struct hlist_node node; 28*3ac7fe5aSThomas Gleixner enum debug_obj_state state; 29*3ac7fe5aSThomas Gleixner void *object; 30*3ac7fe5aSThomas Gleixner struct debug_obj_descr *descr; 31*3ac7fe5aSThomas Gleixner }; 32*3ac7fe5aSThomas Gleixner 33*3ac7fe5aSThomas Gleixner /** 34*3ac7fe5aSThomas Gleixner * struct debug_obj_descr - object type specific debug description structure 35*3ac7fe5aSThomas Gleixner * @name: name of the object typee 36*3ac7fe5aSThomas Gleixner * @fixup_init: fixup function, which is called when the init check 37*3ac7fe5aSThomas Gleixner * fails 38*3ac7fe5aSThomas Gleixner * @fixup_activate: fixup function, which is called when the activate check 39*3ac7fe5aSThomas Gleixner * fails 40*3ac7fe5aSThomas Gleixner * @fixup_destroy: fixup function, which is called when the destroy check 41*3ac7fe5aSThomas Gleixner * fails 42*3ac7fe5aSThomas Gleixner * @fixup_free: fixup function, which is called when the free check 43*3ac7fe5aSThomas Gleixner * fails 44*3ac7fe5aSThomas Gleixner */ 45*3ac7fe5aSThomas Gleixner struct debug_obj_descr { 46*3ac7fe5aSThomas Gleixner const char *name; 47*3ac7fe5aSThomas Gleixner 48*3ac7fe5aSThomas Gleixner int (*fixup_init) (void *addr, enum debug_obj_state state); 49*3ac7fe5aSThomas Gleixner int (*fixup_activate) (void *addr, enum debug_obj_state state); 50*3ac7fe5aSThomas Gleixner int (*fixup_destroy) (void *addr, enum debug_obj_state state); 51*3ac7fe5aSThomas Gleixner int (*fixup_free) (void *addr, enum debug_obj_state state); 52*3ac7fe5aSThomas Gleixner }; 53*3ac7fe5aSThomas Gleixner 54*3ac7fe5aSThomas Gleixner #ifdef CONFIG_DEBUG_OBJECTS 55*3ac7fe5aSThomas Gleixner extern void debug_object_init (void *addr, struct debug_obj_descr *descr); 56*3ac7fe5aSThomas Gleixner extern void 57*3ac7fe5aSThomas Gleixner debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr); 58*3ac7fe5aSThomas Gleixner extern void debug_object_activate (void *addr, struct debug_obj_descr *descr); 59*3ac7fe5aSThomas Gleixner extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr); 60*3ac7fe5aSThomas Gleixner extern void debug_object_destroy (void *addr, struct debug_obj_descr *descr); 61*3ac7fe5aSThomas Gleixner extern void debug_object_free (void *addr, struct debug_obj_descr *descr); 62*3ac7fe5aSThomas Gleixner 63*3ac7fe5aSThomas Gleixner extern void debug_objects_early_init(void); 64*3ac7fe5aSThomas Gleixner extern void debug_objects_mem_init(void); 65*3ac7fe5aSThomas Gleixner #else 66*3ac7fe5aSThomas Gleixner static inline void 67*3ac7fe5aSThomas Gleixner debug_object_init (void *addr, struct debug_obj_descr *descr) { } 68*3ac7fe5aSThomas Gleixner static inline void 69*3ac7fe5aSThomas Gleixner debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) { } 70*3ac7fe5aSThomas Gleixner static inline void 71*3ac7fe5aSThomas Gleixner debug_object_activate (void *addr, struct debug_obj_descr *descr) { } 72*3ac7fe5aSThomas Gleixner static inline void 73*3ac7fe5aSThomas Gleixner debug_object_deactivate(void *addr, struct debug_obj_descr *descr) { } 74*3ac7fe5aSThomas Gleixner static inline void 75*3ac7fe5aSThomas Gleixner debug_object_destroy (void *addr, struct debug_obj_descr *descr) { } 76*3ac7fe5aSThomas Gleixner static inline void 77*3ac7fe5aSThomas Gleixner debug_object_free (void *addr, struct debug_obj_descr *descr) { } 78*3ac7fe5aSThomas Gleixner 79*3ac7fe5aSThomas Gleixner static inline void debug_objects_early_init(void) { } 80*3ac7fe5aSThomas Gleixner static inline void debug_objects_mem_init(void) { } 81*3ac7fe5aSThomas Gleixner #endif 82*3ac7fe5aSThomas Gleixner 83*3ac7fe5aSThomas Gleixner #ifdef CONFIG_DEBUG_OBJECTS_FREE 84*3ac7fe5aSThomas Gleixner extern void debug_check_no_obj_freed(const void *address, unsigned long size); 85*3ac7fe5aSThomas Gleixner #else 86*3ac7fe5aSThomas Gleixner static inline void 87*3ac7fe5aSThomas Gleixner debug_check_no_obj_freed(const void *address, unsigned long size) { } 88*3ac7fe5aSThomas Gleixner #endif 89*3ac7fe5aSThomas Gleixner 90*3ac7fe5aSThomas Gleixner #endif 91