File Index
Files and directories
Sign in
FILE

codetag.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/codetag.h C
  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
 10struct codetag_iterator;
 11struct codetag_type;
 12struct codetag_module;
 13struct seq_buf;
 14struct 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 */
 27struct 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
 35union codetag_ref {
 36	struct codetag *ct;
 37};
 38
 39struct 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
 55struct 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
 77void codetag_lock_module_list(struct codetag_type *cttype, bool lock);
 78bool codetag_trylock_module_list(struct codetag_type *cttype);
 79struct codetag_iterator codetag_get_ct_iter(struct codetag_type *cttype);
 80struct codetag *codetag_next_ct(struct codetag_iterator *iter);
 81
 82void codetag_to_text(struct seq_buf *out, struct codetag *ct);
 83
 84struct codetag_type *
 85codetag_register_type(const struct codetag_type_desc *desc);
 86
 87#if defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES)
 88
 89bool codetag_needs_module_section(struct module *mod, const char *name,
 90				  unsigned long size);
 91void *codetag_alloc_module_section(struct module *mod, const char *name,
 92				   unsigned long size, unsigned int prepend,
 93				   unsigned long align);
 94void codetag_free_module_sections(struct module *mod);
 95void codetag_module_replaced(struct module *mod, struct module *new_mod);
 96int codetag_load_module(struct module *mod);
 97void codetag_unload_module(struct module *mod);
 98
 99#else /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
100
101static inline bool
102codetag_needs_module_section(struct module *mod, const char *name,
103			     unsigned long size) { return false; }
104static inline void *
105codetag_alloc_module_section(struct module *mod, const char *name,
106			     unsigned long size, unsigned int prepend,
107			     unsigned long align) { return NULL; }
108static inline void codetag_free_module_sections(struct module *mod) {}
109static inline void codetag_module_replaced(struct module *mod, struct module *new_mod) {}
110static inline int codetag_load_module(struct module *mod) { return 0; }
111static inline void codetag_unload_module(struct module *mod) {}
112
113#endif /* defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES) */
114
115#endif /* _LINUX_CODETAG_H */
~/ Read-only file preview.