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


Reply via email to