| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Raghavendra Rao Ananta <rananta@codeaurora.org> |
| Date: Fri, 18 Oct 2019 11:20:57 -0700 |
| Subject: ANDROID: Revert "Merge tag 'modules-for-v5.4' of |
| git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux" |
| |
| This reverts commit e0703556644a531e50b5dc61b9f6ea83af5f6604, reversing |
| changes made to 8808cf8cbc4da1ceef9307fba7e499563908c211. |
| |
| Introducing symbol-namespaces into the kernel has caused issues with |
| respect to the ABI checker. Hence, revert the changes until a valid |
| fix is available. The revert was done based off of 5.4-rc1. |
| |
| Change-Id: I529ced269661f457ce667a76eb383843002f0a7d |
| Signed-off-by: Raghavendra Rao Ananta <rananta@codeaurora.org> |
| --- |
| include/linux/export.h | 14 +++++++---- |
| scripts/mod/modpost.c | 55 +++++++++++++++--------------------------- |
| 2 files changed, 28 insertions(+), 41 deletions(-) |
| |
| diff --git a/include/linux/export.h b/include/linux/export.h |
| index 941d075f03d6..621158ecd2e2 100644 |
| --- a/include/linux/export.h |
| +++ b/include/linux/export.h |
| @@ -18,6 +18,8 @@ extern struct module __this_module; |
| #define THIS_MODULE ((struct module *)0) |
| #endif |
| |
| +#define NS_SEPARATOR "." |
| + |
| #ifdef CONFIG_MODVERSIONS |
| /* Mark the CRC weak since genksyms apparently decides not to |
| * generate a checksums for some symbols */ |
| @@ -46,11 +48,11 @@ extern struct module __this_module; |
| * absolute relocations that require runtime processing on relocatable |
| * kernels. |
| */ |
| -#define __KSYMTAB_ENTRY_NS(sym, sec) \ |
| +#define __KSYMTAB_ENTRY_NS(sym, sec, ns) \ |
| __ADDRESSABLE(sym) \ |
| asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\" \n" \ |
| " .balign 4 \n" \ |
| - "__ksymtab_" #sym ": \n" \ |
| + "__ksymtab_" #ns NS_SEPARATOR #sym ": \n" \ |
| " .long " #sym "- . \n" \ |
| " .long __kstrtab_" #sym "- . \n" \ |
| " .long __kstrtabns_" #sym "- . \n" \ |
| @@ -72,14 +74,16 @@ struct kernel_symbol { |
| int namespace_offset; |
| }; |
| #else |
| -#define __KSYMTAB_ENTRY_NS(sym, sec) \ |
| - static const struct kernel_symbol __ksymtab_##sym \ |
| +#define __KSYMTAB_ENTRY_NS(sym, sec, ns) \ |
| + static const struct kernel_symbol __ksymtab_##sym##__##ns \ |
| + asm("__ksymtab_" #ns NS_SEPARATOR #sym) \ |
| __attribute__((section("___ksymtab" sec "+" #sym), used)) \ |
| __aligned(sizeof(void *)) \ |
| = { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } |
| |
| #define __KSYMTAB_ENTRY(sym, sec) \ |
| static const struct kernel_symbol __ksymtab_##sym \ |
| + asm("__ksymtab_" #sym) \ |
| __attribute__((section("___ksymtab" sec "+" #sym), used)) \ |
| __aligned(sizeof(void *)) \ |
| = { (unsigned long)&sym, __kstrtab_##sym, NULL } |
| @@ -111,7 +115,7 @@ struct kernel_symbol { |
| static const char __kstrtabns_##sym[] \ |
| __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ |
| = #ns; \ |
| - __KSYMTAB_ENTRY_NS(sym, sec) |
| + __KSYMTAB_ENTRY_NS(sym, sec, ns) |
| |
| #define ___EXPORT_SYMBOL(sym, sec) \ |
| ___export_symbol_common(sym, sec); \ |
| diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c |
| index d2a30a7b3f07..a5dca74cc3ca 100644 |
| --- a/scripts/mod/modpost.c |
| +++ b/scripts/mod/modpost.c |
| @@ -348,38 +348,26 @@ static enum export export_from_sec(struct elf_info *elf, unsigned int sec) |
| return export_unknown; |
| } |
| |
| -static const char *namespace_from_kstrtabns(struct elf_info *info, |
| - Elf_Sym *kstrtabns) |
| +static char *sym_extract_namespace(const char **symname) |
| { |
| - char *value = info->ksymtab_strings + kstrtabns->st_value; |
| - return value[0] ? value : NULL; |
| -} |
| - |
| -static void sym_update_namespace(const char *symname, const char *namespace) |
| -{ |
| - struct symbol *s = find_symbol(symname); |
| + char *namespace = NULL; |
| + char *ns_separator; |
| |
| - /* |
| - * That symbol should have been created earlier and thus this is |
| - * actually an assertion. |
| - */ |
| - if (!s) { |
| - merror("Could not update namespace(%s) for symbol %s\n", |
| - namespace, symname); |
| - return; |
| + ns_separator = strchr(*symname, '.'); |
| + if (ns_separator) { |
| + namespace = NOFAIL(strndup(*symname, ns_separator - *symname)); |
| + *symname = ns_separator + 1; |
| } |
| |
| - free(s->namespace); |
| - s->namespace = |
| - namespace && namespace[0] ? NOFAIL(strdup(namespace)) : NULL; |
| + return namespace; |
| } |
| |
| /** |
| * Add an exported symbol - it may have already been added without a |
| * CRC, in this case just update the CRC |
| **/ |
| -static struct symbol *sym_add_exported(const char *name, struct module *mod, |
| - enum export export) |
| +static struct symbol *sym_add_exported(const char *name, const char *namespace, |
| + struct module *mod, enum export export) |
| { |
| struct symbol *s = find_symbol(name); |
| |
| @@ -395,6 +383,8 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod, |
| s->module = mod; |
| } |
| } |
| + free(s->namespace); |
| + s->namespace = namespace ? strdup(namespace) : NULL; |
| s->preloaded = 0; |
| s->vmlinux = is_vmlinux(mod->name); |
| s->kernel = 0; |
| @@ -686,6 +676,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, |
| enum export export; |
| bool is_crc = false; |
| const char *name; |
| + char *namespace; |
| |
| if ((!is_vmlinux(mod->name) || mod->is_dot_o) && |
| strstarts(symname, "__ksymtab")) |
| @@ -758,7 +749,9 @@ static void handle_modversions(struct module *mod, struct elf_info *info, |
| /* All exported symbols */ |
| if (strstarts(symname, "__ksymtab_")) { |
| name = symname + strlen("__ksymtab_"); |
| - sym_add_exported(name, mod, export); |
| + namespace = sym_extract_namespace(&name); |
| + sym_add_exported(name, namespace, mod, export); |
| + free(namespace); |
| } |
| if (strcmp(symname, "init_module") == 0) |
| mod->has_init = 1; |
| @@ -2054,16 +2047,6 @@ static void read_symbols(const char *modname) |
| handle_moddevtable(mod, &info, sym, symname); |
| } |
| |
| - /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */ |
| - for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { |
| - symname = remove_dot(info.strtab + sym->st_name); |
| - |
| - if (strstarts(symname, "__kstrtabns_")) |
| - sym_update_namespace(symname + strlen("__kstrtabns_"), |
| - namespace_from_kstrtabns(&info, |
| - sym)); |
| - } |
| - |
| // check for static EXPORT_SYMBOL_* functions && global vars |
| for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { |
| unsigned char bind = ELF_ST_BIND(sym->st_info); |
| @@ -2217,7 +2200,7 @@ static int check_exports(struct module *mod) |
| else |
| basename = mod->name; |
| |
| - if (exp->namespace) { |
| + if (exp->namespace && exp->namespace[0]) { |
| add_namespace(&mod->required_namespaces, |
| exp->namespace); |
| |
| @@ -2475,12 +2458,12 @@ static void read_dump(const char *fname, unsigned int kernel) |
| mod = new_module(modname); |
| mod->skip = 1; |
| } |
| - s = sym_add_exported(symname, mod, export_no(export)); |
| + s = sym_add_exported(symname, namespace, mod, |
| + export_no(export)); |
| s->kernel = kernel; |
| s->preloaded = 1; |
| s->is_static = 0; |
| sym_update_crc(symname, mod, crc, export_no(export)); |
| - sym_update_namespace(symname, namespace); |
| } |
| release_file(file, size); |
| return; |