1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/codetag.h>
4 #include <linux/kallsyms.h>
5 #include <linux/module.h>
6 #include <linux/seq_buf.h>
7 #include <linux/slab.h>
8 #include <linux/vmalloc.h>
11 struct list_head link
;
14 struct rw_semaphore mod_lock
; /* protects mod_idr */
15 struct codetag_type_desc desc
;
18 struct codetag_range
{
19 struct codetag
*start
;
23 struct codetag_module
{
25 struct codetag_range range
;
28 static DEFINE_MUTEX(codetag_lock
);
29 static LIST_HEAD(codetag_types
);
31 void codetag_lock_module_list(struct codetag_type
*cttype
, bool lock
)
34 down_read(&cttype
->mod_lock
);
36 up_read(&cttype
->mod_lock
);
39 bool codetag_trylock_module_list(struct codetag_type
*cttype
)
41 return down_read_trylock(&cttype
->mod_lock
) != 0;
44 struct codetag_iterator
codetag_get_ct_iter(struct codetag_type
*cttype
)
46 struct codetag_iterator iter
= {
56 static inline struct codetag
*get_first_module_ct(struct codetag_module
*cmod
)
58 return cmod
->range
.start
< cmod
->range
.stop
? cmod
->range
.start
: NULL
;
62 struct codetag
*get_next_module_ct(struct codetag_iterator
*iter
)
64 struct codetag
*res
= (struct codetag
*)
65 ((char *)iter
->ct
+ iter
->cttype
->desc
.tag_size
);
67 return res
< iter
->cmod
->range
.stop
? res
: NULL
;
70 struct codetag
*codetag_next_ct(struct codetag_iterator
*iter
)
72 struct codetag_type
*cttype
= iter
->cttype
;
73 struct codetag_module
*cmod
;
76 lockdep_assert_held(&cttype
->mod_lock
);
78 if (unlikely(idr_is_empty(&cttype
->mod_idr
)))
83 cmod
= idr_find(&cttype
->mod_idr
, iter
->mod_id
);
85 /* If module was removed move to the next one */
87 cmod
= idr_get_next_ul(&cttype
->mod_idr
,
90 /* Exit if no more modules */
94 if (cmod
!= iter
->cmod
) {
96 ct
= get_first_module_ct(cmod
);
98 ct
= get_next_module_ct(iter
);
110 void codetag_to_text(struct seq_buf
*out
, struct codetag
*ct
)
113 seq_buf_printf(out
, "%s:%u [%s] func:%s",
114 ct
->filename
, ct
->lineno
,
115 ct
->modname
, ct
->function
);
117 seq_buf_printf(out
, "%s:%u func:%s",
118 ct
->filename
, ct
->lineno
, ct
->function
);
121 static inline size_t range_size(const struct codetag_type
*cttype
,
122 const struct codetag_range
*range
)
124 return ((char *)range
->stop
- (char *)range
->start
) /
125 cttype
->desc
.tag_size
;
128 static void *get_symbol(struct module
*mod
, const char *prefix
, const char *name
)
130 DECLARE_SEQ_BUF(sb
, KSYM_NAME_LEN
);
134 seq_buf_printf(&sb
, "%s%s", prefix
, name
);
135 if (seq_buf_has_overflowed(&sb
))
138 buf
= seq_buf_str(&sb
);
141 (void *)find_kallsyms_symbol_value(mod
, buf
) :
142 (void *)kallsyms_lookup_name(buf
);
148 static struct codetag_range
get_section_range(struct module
*mod
,
151 return (struct codetag_range
) {
152 get_symbol(mod
, "__start_", section
),
153 get_symbol(mod
, "__stop_", section
),
157 static const char *get_mod_name(__maybe_unused
struct module
*mod
)
159 #ifdef CONFIG_MODULES
166 static int codetag_module_init(struct codetag_type
*cttype
, struct module
*mod
)
168 struct codetag_range range
;
169 struct codetag_module
*cmod
;
172 range
= get_section_range(mod
, cttype
->desc
.section
);
173 if (!range
.start
|| !range
.stop
) {
174 pr_warn("Failed to load code tags of type %s from the module %s\n",
175 cttype
->desc
.section
, get_mod_name(mod
));
179 /* Ignore empty ranges */
180 if (range
.start
== range
.stop
)
183 BUG_ON(range
.start
> range
.stop
);
185 cmod
= kmalloc(sizeof(*cmod
), GFP_KERNEL
);
192 down_write(&cttype
->mod_lock
);
193 err
= idr_alloc(&cttype
->mod_idr
, cmod
, 0, 0, GFP_KERNEL
);
195 cttype
->count
+= range_size(cttype
, &range
);
196 if (cttype
->desc
.module_load
)
197 cttype
->desc
.module_load(cttype
, cmod
);
199 up_write(&cttype
->mod_lock
);
209 #ifdef CONFIG_MODULES
210 void codetag_load_module(struct module
*mod
)
212 struct codetag_type
*cttype
;
217 mutex_lock(&codetag_lock
);
218 list_for_each_entry(cttype
, &codetag_types
, link
)
219 codetag_module_init(cttype
, mod
);
220 mutex_unlock(&codetag_lock
);
223 bool codetag_unload_module(struct module
*mod
)
225 struct codetag_type
*cttype
;
226 bool unload_ok
= true;
231 /* await any module's kfree_rcu() operations to complete */
232 kvfree_rcu_barrier();
234 mutex_lock(&codetag_lock
);
235 list_for_each_entry(cttype
, &codetag_types
, link
) {
236 struct codetag_module
*found
= NULL
;
237 struct codetag_module
*cmod
;
238 unsigned long mod_id
, tmp
;
240 down_write(&cttype
->mod_lock
);
241 idr_for_each_entry_ul(&cttype
->mod_idr
, cmod
, tmp
, mod_id
) {
242 if (cmod
->mod
&& cmod
->mod
== mod
) {
248 if (cttype
->desc
.module_unload
)
249 if (!cttype
->desc
.module_unload(cttype
, cmod
))
252 cttype
->count
-= range_size(cttype
, &cmod
->range
);
253 idr_remove(&cttype
->mod_idr
, mod_id
);
256 up_write(&cttype
->mod_lock
);
258 mutex_unlock(&codetag_lock
);
262 #endif /* CONFIG_MODULES */
264 struct codetag_type
*
265 codetag_register_type(const struct codetag_type_desc
*desc
)
267 struct codetag_type
*cttype
;
270 BUG_ON(desc
->tag_size
<= 0);
272 cttype
= kzalloc(sizeof(*cttype
), GFP_KERNEL
);
273 if (unlikely(!cttype
))
274 return ERR_PTR(-ENOMEM
);
276 cttype
->desc
= *desc
;
277 idr_init(&cttype
->mod_idr
);
278 init_rwsem(&cttype
->mod_lock
);
280 err
= codetag_module_init(cttype
, NULL
);
286 mutex_lock(&codetag_lock
);
287 list_add_tail(&cttype
->link
, &codetag_types
);
288 mutex_unlock(&codetag_lock
);