Provide CONFIG_ARCH_HAS_ADDRESS_LOOKUP which allows architectures to do their own symbol/address lookup if kernel and module lookups miss. powerpc will use this to deal with firmware symbols. Signed-off-by: Nicholas Piggin <npiggin@xxxxxxxxx> --- include/linux/kallsyms.h | 20 ++++++++++++++++++++ kernel/kallsyms.c | 13 ++++++++++++- lib/Kconfig | 3 +++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 657a83b943f0..8fdd44873373 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -83,6 +83,26 @@ extern int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize, unsigned long *offset); +#ifdef CONFIG_ARCH_HAS_ADDRESS_LOOKUP +const char *arch_address_lookup(unsigned long addr, + unsigned long *symbolsize, + unsigned long *offset, + char **modname, char *namebuf); +unsigned long arch_address_lookup_name(const char *name); +#else +static inline const char *arch_address_lookup(unsigned long addr, + unsigned long *symbolsize, + unsigned long *offset, + char **modname, char *namebuf) +{ + return NULL; +} +static inline unsigned long arch_address_lookup_name(const char *name) +{ + return 0; +} +#endif + /* Lookup an address. modname is set to NULL if it's in the kernel. */ const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index a9b3f660dee7..580c762fadd8 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -164,6 +164,7 @@ static unsigned long kallsyms_sym_address(int idx) unsigned long kallsyms_lookup_name(const char *name) { char namebuf[KSYM_NAME_LEN]; + unsigned long ret; unsigned long i; unsigned int off; @@ -173,7 +174,12 @@ unsigned long kallsyms_lookup_name(const char *name) if (strcmp(namebuf, name) == 0) return kallsyms_sym_address(i); } - return module_kallsyms_lookup_name(name); + + ret = module_kallsyms_lookup_name(name); + if (ret) + return ret; + + return arch_address_lookup_name(name); } EXPORT_SYMBOL_GPL(kallsyms_lookup_name); @@ -311,6 +317,11 @@ const char *kallsyms_lookup(unsigned long addr, if (!ret) ret = ftrace_mod_address_lookup(addr, symbolsize, offset, modname, namebuf); + + if (!ret) + ret = arch_address_lookup(addr, symbolsize, + offset, modname, namebuf); + return ret; } diff --git a/lib/Kconfig b/lib/Kconfig index bc7e56370129..16d3b8dbcadf 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -80,6 +80,9 @@ config ARCH_USE_CMPXCHG_LOCKREF config ARCH_HAS_FAST_MULTIPLIER bool +config ARCH_HAS_ADDRESS_LOOKUP + bool + config INDIRECT_PIO bool "Access I/O in non-MMIO mode" depends on ARM64 -- 2.23.0