]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - kernel/kallsyms.c
tracing: probeevent: Unify fetch_insn processing common part
[mirror_ubuntu-jammy-kernel.git] / kernel / kallsyms.c
index a23e21ada81b9dc6cbc8cd21c04805072bb98438..02a0b01380d8ef678bf544054cacf586292fb0e1 100644 (file)
@@ -432,6 +432,7 @@ int sprint_backtrace(char *buffer, unsigned long address)
 /* To avoid using get_symbol_offset for every symbol, we carry prefix along. */
 struct kallsym_iter {
        loff_t pos;
+       loff_t pos_arch_end;
        loff_t pos_mod_end;
        loff_t pos_ftrace_mod_end;
        unsigned long value;
@@ -443,9 +444,29 @@ struct kallsym_iter {
        int show_value;
 };
 
+int __weak arch_get_kallsym(unsigned int symnum, unsigned long *value,
+                           char *type, char *name)
+{
+       return -EINVAL;
+}
+
+static int get_ksymbol_arch(struct kallsym_iter *iter)
+{
+       int ret = arch_get_kallsym(iter->pos - kallsyms_num_syms,
+                                  &iter->value, &iter->type,
+                                  iter->name);
+
+       if (ret < 0) {
+               iter->pos_arch_end = iter->pos;
+               return 0;
+       }
+
+       return 1;
+}
+
 static int get_ksymbol_mod(struct kallsym_iter *iter)
 {
-       int ret = module_get_kallsym(iter->pos - kallsyms_num_syms,
+       int ret = module_get_kallsym(iter->pos - iter->pos_arch_end,
                                     &iter->value, &iter->type,
                                     iter->name, iter->module_name,
                                     &iter->exported);
@@ -501,32 +522,34 @@ static void reset_iter(struct kallsym_iter *iter, loff_t new_pos)
        iter->nameoff = get_symbol_offset(new_pos);
        iter->pos = new_pos;
        if (new_pos == 0) {
+               iter->pos_arch_end = 0;
                iter->pos_mod_end = 0;
                iter->pos_ftrace_mod_end = 0;
        }
 }
 
+/*
+ * The end position (last + 1) of each additional kallsyms section is recorded
+ * in iter->pos_..._end as each section is added, and so can be used to
+ * determine which get_ksymbol_...() function to call next.
+ */
 static int update_iter_mod(struct kallsym_iter *iter, loff_t pos)
 {
        iter->pos = pos;
 
-       if (iter->pos_ftrace_mod_end > 0 &&
-           iter->pos_ftrace_mod_end < iter->pos)
-               return get_ksymbol_bpf(iter);
+       if ((!iter->pos_arch_end || iter->pos_arch_end > pos) &&
+           get_ksymbol_arch(iter))
+               return 1;
 
-       if (iter->pos_mod_end > 0 &&
-           iter->pos_mod_end < iter->pos) {
-               if (!get_ksymbol_ftrace_mod(iter))
-                       return get_ksymbol_bpf(iter);
+       if ((!iter->pos_mod_end || iter->pos_mod_end > pos) &&
+           get_ksymbol_mod(iter))
                return 1;
-       }
 
-       if (!get_ksymbol_mod(iter)) {
-               if (!get_ksymbol_ftrace_mod(iter))
-                       return get_ksymbol_bpf(iter);
-       }
+       if ((!iter->pos_ftrace_mod_end || iter->pos_ftrace_mod_end > pos) &&
+           get_ksymbol_ftrace_mod(iter))
+               return 1;
 
-       return 1;
+       return get_ksymbol_bpf(iter);
 }
 
 /* Returns false if pos at or past end of file. */