xref: /linux/include/linux/codetag.h (revision 67c2696cf76aa276376fdd845c7d1b3e16b97af2)
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 #define CODETAG_SECTION_START_PREFIX	"__start_"
17 #define CODETAG_SECTION_STOP_PREFIX	"__stop_"
18 
19 /* codetag flags */
20 #define CODETAG_FLAG_INACCURATE	(1 << 0)
21 
22 /*
23  * An instance of this structure is created in a special ELF section at every
24  * code location being tagged.  At runtime, the special section is treated as
25  * an array of these.
26  */
27 struct codetag {
28 	unsigned int flags;
29 	unsigned int lineno;
30 	const char *modname;
31 	const char *function;
32 	const char *filename;
33 } __aligned(8);
34 
35 union codetag_ref {
36 	struct codetag *ct;
37 };
38 
39 struct codetag_type_desc {
40 	const char *section;
41 	size_t tag_size;
42 	int (*module_load)(struct module *mod,
43 			   struct codetag *start, struct codetag *end);
44 	void (*module_unload)(struct module *mod,
45 			      struct codetag *start, struct codetag *end);
46 #ifdef CONFIG_MODULES
47 	void (*module_replaced)(struct module *mod, struct module *new_mod);
48 	bool (*needs_section_mem)(struct module *mod, unsigned long size);
49 	void *(*alloc_section_mem)(struct module *mod, unsigned long size,
50 				   unsigned int prepend, unsigned long align);
51 	void (*free_section_mem)(struct module *mod, bool used);
52 #endif
53 };
54 
55 struct codetag_iterator {
56 	struct codetag_type *cttype;
57 	struct codetag_module *cmod;
58 	unsigned long mod_id;
59 	struct codetag *ct;
60 	unsigned long mod_seq;
61 };
62 
63 #ifdef MODULE
64 #define CT_MODULE_NAME KBUILD_MODNAME
65 #else
66 #define CT_MODULE_NAME NULL
67 #endif
68 
69 #define CODE_TAG_INIT {					\
70 	.modname	= CT_MODULE_NAME,		\
71 	.function	= __func__,			\
72 	.filename	= __FILE__,			\
73 	.lineno		= __LINE__,			\
74 	.flags		= 0,				\
75 }
76 
77 void codetag_lock_module_list(struct codetag_type *cttype);
78 bool codetag_trylock_module_list(struct codetag_type *cttype);
79 void codetag_unlock_module_list(struct codetag_type *cttype);
80 struct codetag_iterator codetag_get_ct_iter(struct codetag_type *cttype);
81 struct codetag *codetag_next_ct(struct codetag_iterator *iter);
82 
83 void codetag_to_text(struct seq_buf *out, struct codetag *ct);
84 
85 struct codetag_type *
86 codetag_register_type(const struct codetag_type_desc *desc);
87 
88 #if defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES)
89 
90 bool codetag_needs_module_section(struct module *mod, const char *name,
91 				  unsigned long size);
92 void *codetag_alloc_module_section(struct module *mod, const char *name,
93 				   unsigned long size, unsigned int prepend,
94 				   unsigned long align);
95 void codetag_free_module_sections(struct module *mod);
96 void codetag_module_replaced(struct module *mod, struct module *new_mod);
97 int codetag_load_module(struct module *mod);
98 void codetag_unload_module(struct module *mod);
99 
100 #else /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
101 
102 static inline bool
103 codetag_needs_module_section(struct module *mod, const char *name,
104 			     unsigned long size) { return false; }
105 static inline void *
106 codetag_alloc_module_section(struct module *mod, const char *name,
107 			     unsigned long size, unsigned int prepend,
108 			     unsigned long align) { return NULL; }
109 static inline void codetag_free_module_sections(struct module *mod) {}
110 static inline void codetag_module_replaced(struct module *mod, struct module *new_mod) {}
111 static inline int codetag_load_module(struct module *mod) { return 0; }
112 static inline void codetag_unload_module(struct module *mod) {}
113 
114 #endif /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
115 
116 #endif /* _LINUX_CODETAG_H */
117