|
@@ -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,6 +522,7 @@ 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;
|
|
|
}
|
|
@@ -515,6 +537,10 @@ static int update_iter_mod(struct kallsym_iter *iter, loff_t pos)
|
|
|
{
|
|
|
iter->pos = pos;
|
|
|
|
|
|
+ if ((!iter->pos_arch_end || iter->pos_arch_end > pos) &&
|
|
|
+ get_ksymbol_arch(iter))
|
|
|
+ return 1;
|
|
|
+
|
|
|
if ((!iter->pos_mod_end || iter->pos_mod_end > pos) &&
|
|
|
get_ksymbol_mod(iter))
|
|
|
return 1;
|