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