1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * code tagging framework
4   */
5  #ifndef _LINUX_CODETAG_H
6  #define _LINUX_CODETAG_H
7  
8  #include <linux/types.h>
9  
10  struct codetag_iterator;
11  struct codetag_type;
12  struct codetag_module;
13  struct seq_buf;
14  struct module;
15  
16  /*
17   * An instance of this structure is created in a special ELF section at every
18   * code location being tagged.  At runtime, the special section is treated as
19   * an array of these.
20   */
21  struct codetag {
22  	unsigned int flags; /* used in later patches */
23  	unsigned int lineno;
24  	const char *modname;
25  	const char *function;
26  	const char *filename;
27  } __aligned(8);
28  
29  union codetag_ref {
30  	struct codetag *ct;
31  };
32  
33  struct codetag_type_desc {
34  	const char *section;
35  	size_t tag_size;
36  	void (*module_load)(struct codetag_type *cttype,
37  			    struct codetag_module *cmod);
38  	bool (*module_unload)(struct codetag_type *cttype,
39  			      struct codetag_module *cmod);
40  };
41  
42  struct codetag_iterator {
43  	struct codetag_type *cttype;
44  	struct codetag_module *cmod;
45  	unsigned long mod_id;
46  	struct codetag *ct;
47  };
48  
49  #ifdef MODULE
50  #define CT_MODULE_NAME KBUILD_MODNAME
51  #else
52  #define CT_MODULE_NAME NULL
53  #endif
54  
55  #define CODE_TAG_INIT {					\
56  	.modname	= CT_MODULE_NAME,		\
57  	.function	= __func__,			\
58  	.filename	= __FILE__,			\
59  	.lineno		= __LINE__,			\
60  	.flags		= 0,				\
61  }
62  
63  void codetag_lock_module_list(struct codetag_type *cttype, bool lock);
64  bool codetag_trylock_module_list(struct codetag_type *cttype);
65  struct codetag_iterator codetag_get_ct_iter(struct codetag_type *cttype);
66  struct codetag *codetag_next_ct(struct codetag_iterator *iter);
67  
68  void codetag_to_text(struct seq_buf *out, struct codetag *ct);
69  
70  struct codetag_type *
71  codetag_register_type(const struct codetag_type_desc *desc);
72  
73  #if defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES)
74  void codetag_load_module(struct module *mod);
75  bool codetag_unload_module(struct module *mod);
76  #else
codetag_load_module(struct module * mod)77  static inline void codetag_load_module(struct module *mod) {}
codetag_unload_module(struct module * mod)78  static inline bool codetag_unload_module(struct module *mod) { return true; }
79  #endif
80  
81  #endif /* _LINUX_CODETAG_H */
82