mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
kernel/module: add __dyndbg_classes section
Add __dyndbg_classes section, using __dyndbg as a model. Use it: vmlinux.lds.h: KEEP the new section, which also silences orphan section warning on loadable modules. Add (__start_/__stop_)__dyndbg_classes linker symbols for the c externs (below). kernel/module/main.c: - fill new fields in find_module_sections(), using section_objs() - extend callchain prototypes to pass classes, length load_module(): pass new info to dynamic_debug_setup() dynamic_debug_setup(): new params, pass through to ddebug_add_module() dynamic_debug.c: - add externs to the linker symbols. ddebug_add_module(): - It currently builds a debug_table, and *will* find and attach classes. dynamic_debug_init(): - add class fields to the _ddebug_info cursor var: di. Signed-off-by: Jim Cromie <jim.cromie@gmail.com> Link: https://lore.kernel.org/r/20220904214134.408619-16-jim.cromie@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
aad0214f30
commit
66f4006b6a
@ -345,6 +345,9 @@
|
|||||||
*(__tracepoints) \
|
*(__tracepoints) \
|
||||||
/* implement dynamic printk debug */ \
|
/* implement dynamic printk debug */ \
|
||||||
. = ALIGN(8); \
|
. = ALIGN(8); \
|
||||||
|
__start___dyndbg_classes = .; \
|
||||||
|
KEEP(*(__dyndbg_classes)) \
|
||||||
|
__stop___dyndbg_classes = .; \
|
||||||
__start___dyndbg = .; \
|
__start___dyndbg = .; \
|
||||||
KEEP(*(__dyndbg)) \
|
KEEP(*(__dyndbg)) \
|
||||||
__stop___dyndbg = .; \
|
__stop___dyndbg = .; \
|
||||||
|
@ -114,7 +114,9 @@ struct ddebug_class_map {
|
|||||||
/* encapsulate linker provided built-in (or module) dyndbg data */
|
/* encapsulate linker provided built-in (or module) dyndbg data */
|
||||||
struct _ddebug_info {
|
struct _ddebug_info {
|
||||||
struct _ddebug *descs;
|
struct _ddebug *descs;
|
||||||
|
struct ddebug_class_map *classes;
|
||||||
unsigned int num_descs;
|
unsigned int num_descs;
|
||||||
|
unsigned int num_classes;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_DYNAMIC_DEBUG_CORE)
|
#if defined(CONFIG_DYNAMIC_DEBUG_CORE)
|
||||||
|
@ -2113,6 +2113,8 @@ static int find_module_sections(struct module *mod, struct load_info *info)
|
|||||||
|
|
||||||
info->dyndbg.descs = section_objs(info, "__dyndbg",
|
info->dyndbg.descs = section_objs(info, "__dyndbg",
|
||||||
sizeof(*info->dyndbg.descs), &info->dyndbg.num_descs);
|
sizeof(*info->dyndbg.descs), &info->dyndbg.num_descs);
|
||||||
|
info->dyndbg.classes = section_objs(info, "__dyndbg_classes",
|
||||||
|
sizeof(*info->dyndbg.classes), &info->dyndbg.num_classes);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,8 @@
|
|||||||
|
|
||||||
extern struct _ddebug __start___dyndbg[];
|
extern struct _ddebug __start___dyndbg[];
|
||||||
extern struct _ddebug __stop___dyndbg[];
|
extern struct _ddebug __stop___dyndbg[];
|
||||||
|
extern struct ddebug_class_map __start___dyndbg_classes[];
|
||||||
|
extern struct ddebug_class_map __stop___dyndbg_classes[];
|
||||||
|
|
||||||
struct ddebug_table {
|
struct ddebug_table {
|
||||||
struct list_head link;
|
struct list_head link;
|
||||||
@ -1079,7 +1081,9 @@ static int __init dynamic_debug_init(void)
|
|||||||
|
|
||||||
struct _ddebug_info di = {
|
struct _ddebug_info di = {
|
||||||
.descs = __start___dyndbg,
|
.descs = __start___dyndbg,
|
||||||
|
.classes = __start___dyndbg_classes,
|
||||||
.num_descs = __stop___dyndbg - __start___dyndbg,
|
.num_descs = __stop___dyndbg - __start___dyndbg,
|
||||||
|
.num_classes = __stop___dyndbg_classes - __start___dyndbg_classes,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (&__start___dyndbg == &__stop___dyndbg) {
|
if (&__start___dyndbg == &__stop___dyndbg) {
|
||||||
@ -1122,6 +1126,9 @@ static int __init dynamic_debug_init(void)
|
|||||||
i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
|
i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
|
||||||
(int)((i * sizeof(struct _ddebug)) >> 10));
|
(int)((i * sizeof(struct _ddebug)) >> 10));
|
||||||
|
|
||||||
|
if (di.num_classes)
|
||||||
|
v2pr_info(" %d builtin ddebug class-maps\n", di.num_classes);
|
||||||
|
|
||||||
/* now that ddebug tables are loaded, process all boot args
|
/* now that ddebug tables are loaded, process all boot args
|
||||||
* again to find and activate queries given in dyndbg params.
|
* again to find and activate queries given in dyndbg params.
|
||||||
* While this has already been done for known boot params, it
|
* While this has already been done for known boot params, it
|
||||||
|
Loading…
x
Reference in New Issue
Block a user