Blame view

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