| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_DEBUGOBJECTS_H | 
 | 2 | #define _LINUX_DEBUGOBJECTS_H | 
 | 3 |  | 
 | 4 | #include <linux/list.h> | 
 | 5 | #include <linux/spinlock.h> | 
 | 6 |  | 
 | 7 | enum debug_obj_state { | 
 | 8 | 	ODEBUG_STATE_NONE, | 
 | 9 | 	ODEBUG_STATE_INIT, | 
 | 10 | 	ODEBUG_STATE_INACTIVE, | 
 | 11 | 	ODEBUG_STATE_ACTIVE, | 
 | 12 | 	ODEBUG_STATE_DESTROYED, | 
 | 13 | 	ODEBUG_STATE_NOTAVAILABLE, | 
 | 14 | 	ODEBUG_STATE_MAX, | 
 | 15 | }; | 
 | 16 |  | 
 | 17 | struct debug_obj_descr; | 
 | 18 |  | 
 | 19 | /** | 
 | 20 |  * struct debug_obj - representaion of an tracked object | 
 | 21 |  * @node:	hlist node to link the object into the tracker list | 
 | 22 |  * @state:	tracked object state | 
| Mathieu Desnoyers | a5d8e46 | 2010-04-17 08:48:38 -0400 | [diff] [blame] | 23 |  * @astate:	current active state | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 24 |  * @object:	pointer to the real object | 
 | 25 |  * @descr:	pointer to an object type specific debug description structure | 
 | 26 |  */ | 
 | 27 | struct debug_obj { | 
 | 28 | 	struct hlist_node	node; | 
 | 29 | 	enum debug_obj_state	state; | 
| Mathieu Desnoyers | a5d8e46 | 2010-04-17 08:48:38 -0400 | [diff] [blame] | 30 | 	unsigned int		astate; | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 31 | 	void			*object; | 
 | 32 | 	struct debug_obj_descr	*descr; | 
 | 33 | }; | 
 | 34 |  | 
 | 35 | /** | 
 | 36 |  * struct debug_obj_descr - object type specific debug description structure | 
| Stanislaw Gruszka | 9977728 | 2011-03-07 09:58:33 +0100 | [diff] [blame] | 37 |  * | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 38 |  * @name:		name of the object typee | 
| Stanislaw Gruszka | 9977728 | 2011-03-07 09:58:33 +0100 | [diff] [blame] | 39 |  * @debug_hint:		function returning address, which have associated | 
 | 40 |  *			kernel symbol, to allow identify the object | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 41 |  * @fixup_init:		fixup function, which is called when the init check | 
 | 42 |  *			fails | 
 | 43 |  * @fixup_activate:	fixup function, which is called when the activate check | 
 | 44 |  *			fails | 
 | 45 |  * @fixup_destroy:	fixup function, which is called when the destroy check | 
 | 46 |  *			fails | 
 | 47 |  * @fixup_free:		fixup function, which is called when the free check | 
 | 48 |  *			fails | 
| Christine Chan | b84d435 | 2011-11-07 19:48:27 -0800 | [diff] [blame] | 49 |  * @fixup_assert_init:  fixup function, which is called when the assert_init | 
 | 50 |  *			check fails | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 51 |  */ | 
 | 52 | struct debug_obj_descr { | 
 | 53 | 	const char		*name; | 
| Stanislaw Gruszka | 9977728 | 2011-03-07 09:58:33 +0100 | [diff] [blame] | 54 | 	void *(*debug_hint)	(void *addr); | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 55 | 	int (*fixup_init)	(void *addr, enum debug_obj_state state); | 
 | 56 | 	int (*fixup_activate)	(void *addr, enum debug_obj_state state); | 
 | 57 | 	int (*fixup_destroy)	(void *addr, enum debug_obj_state state); | 
 | 58 | 	int (*fixup_free)	(void *addr, enum debug_obj_state state); | 
| Christine Chan | b84d435 | 2011-11-07 19:48:27 -0800 | [diff] [blame] | 59 | 	int (*fixup_assert_init)(void *addr, enum debug_obj_state state); | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 60 | }; | 
 | 61 |  | 
 | 62 | #ifdef CONFIG_DEBUG_OBJECTS | 
 | 63 | extern void debug_object_init      (void *addr, struct debug_obj_descr *descr); | 
 | 64 | extern void | 
 | 65 | debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr); | 
| Paul E. McKenney | b778ae2 | 2013-04-23 12:51:11 -0700 | [diff] [blame] | 66 | extern int debug_object_activate  (void *addr, struct debug_obj_descr *descr); | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 67 | extern void debug_object_deactivate(void *addr, struct debug_obj_descr *descr); | 
 | 68 | extern void debug_object_destroy   (void *addr, struct debug_obj_descr *descr); | 
 | 69 | extern void debug_object_free      (void *addr, struct debug_obj_descr *descr); | 
| Christine Chan | b84d435 | 2011-11-07 19:48:27 -0800 | [diff] [blame] | 70 | extern void debug_object_assert_init(void *addr, struct debug_obj_descr *descr); | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 71 |  | 
| Mathieu Desnoyers | a5d8e46 | 2010-04-17 08:48:38 -0400 | [diff] [blame] | 72 | /* | 
 | 73 |  * Active state: | 
 | 74 |  * - Set at 0 upon initialization. | 
 | 75 |  * - Must return to 0 before deactivation. | 
 | 76 |  */ | 
 | 77 | extern void | 
 | 78 | debug_object_active_state(void *addr, struct debug_obj_descr *descr, | 
 | 79 | 			  unsigned int expect, unsigned int next); | 
 | 80 |  | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 81 | extern void debug_objects_early_init(void); | 
 | 82 | extern void debug_objects_mem_init(void); | 
 | 83 | #else | 
 | 84 | static inline void | 
 | 85 | debug_object_init      (void *addr, struct debug_obj_descr *descr) { } | 
 | 86 | static inline void | 
 | 87 | debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr) { } | 
| Paul E. McKenney | b778ae2 | 2013-04-23 12:51:11 -0700 | [diff] [blame] | 88 | static inline int | 
 | 89 | debug_object_activate  (void *addr, struct debug_obj_descr *descr) { return 0; } | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 90 | static inline void | 
 | 91 | debug_object_deactivate(void *addr, struct debug_obj_descr *descr) { } | 
 | 92 | static inline void | 
 | 93 | debug_object_destroy   (void *addr, struct debug_obj_descr *descr) { } | 
 | 94 | static inline void | 
 | 95 | debug_object_free      (void *addr, struct debug_obj_descr *descr) { } | 
| Christine Chan | b84d435 | 2011-11-07 19:48:27 -0800 | [diff] [blame] | 96 | static inline void | 
 | 97 | debug_object_assert_init(void *addr, struct debug_obj_descr *descr) { } | 
| Thomas Gleixner | 3ac7fe5 | 2008-04-30 00:55:01 -0700 | [diff] [blame] | 98 |  | 
 | 99 | static inline void debug_objects_early_init(void) { } | 
 | 100 | static inline void debug_objects_mem_init(void) { } | 
 | 101 | #endif | 
 | 102 |  | 
 | 103 | #ifdef CONFIG_DEBUG_OBJECTS_FREE | 
 | 104 | extern void debug_check_no_obj_freed(const void *address, unsigned long size); | 
 | 105 | #else | 
 | 106 | static inline void | 
 | 107 | debug_check_no_obj_freed(const void *address, unsigned long size) { } | 
 | 108 | #endif | 
 | 109 |  | 
 | 110 | #endif |