Setup the optional unwinder debug information for kernel .sframe sections. Modules are indicated by the format "(<module-name>)".
Suggested-by: Jens Remus <[email protected]> Signed-off-by: Dylan Hatch <[email protected]> --- kernel/unwind/sframe.c | 4 ++++ kernel/unwind/sframe_debug.h | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index e8ede0343cb2..d256e72620fe 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -1036,6 +1036,8 @@ void __init init_sframe_table(void) kernel_sfsec.text_start = (unsigned long)_stext; kernel_sfsec.text_end = (unsigned long)_etext; + dbg_init(&kernel_sfsec); + if (WARN_ON(sframe_read_header(&kernel_sfsec))) return; if (WARN_ON(sframe_validate_section(&kernel_sfsec))) @@ -1099,6 +1101,8 @@ void sframe_module_init(struct module *mod, void *sframe, size_t sframe_size, sec->text_start = (unsigned long)text; sec->text_end = (unsigned long)text + text_size; + dbg_init(sec); + if (WARN_ON(sframe_read_header(sec))) return; if (WARN_ON(sframe_sort_fdes(sec))) diff --git a/kernel/unwind/sframe_debug.h b/kernel/unwind/sframe_debug.h index e568be4172b1..6c7ab3aa7c9e 100644 --- a/kernel/unwind/sframe_debug.h +++ b/kernel/unwind/sframe_debug.h @@ -32,6 +32,19 @@ static inline void dbg_init(struct sframe_section *sec) struct mm_struct *mm = current->mm; struct vm_area_struct *vma; + if (sec->sec_type == SFRAME_KERNEL) { + if (sec == &kernel_sfsec) { + sec->filename = kstrdup("(vmlinux)", GFP_KERNEL); + } else { + struct module *mod = container_of(sec, struct module, + arch.sframe_sec); + sec->filename = kasprintf(GFP_KERNEL, "(%s)", + mod->name); + } + + return; + } + guard(mmap_read_lock)(mm); vma = vma_lookup(mm, sec->sframe_start); if (!vma) -- 2.54.0.563.g4f69b47b94-goog

