Commit Graph

442 Commits

Author SHA1 Message Date
Donald Dutile f488b55f1b modpost: use sym_get_data() to get module device_table data
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit abe864b8e19adf33b48997de8bc1a8f095390ade
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Wed Jul 20 01:53:00 2022 +0900

    modpost: use sym_get_data() to get module device_table data

    Use sym_get_data() to replace the long code.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:18 -04:00
Donald Dutile f10a86dae2 modpost: drop executable ELF support
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 5764f6626f5f334b27e168a33735b3899d08bcd2
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Wed Jul 20 01:52:59 2022 +0900

    modpost: drop executable ELF support

    Since commit 269a535ca9 ("modpost: generate vmlinux.symvers and
    reuse it for the second modpost"), modpost only parses relocatable
    files (ET_REL).

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:18 -04:00
Donald Dutile b3afc5ba53 module: panic: Taint the kernel when selftest modules load
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 74829ddf5977567d77440150d72d4c0c5c427446
Author: David Gow <davidgow@google.com>
Date:   Fri Jul 8 12:48:45 2022 +0800

    module: panic: Taint the kernel when selftest modules load

    Taint the kernel with TAINT_TEST whenever a test module loads, by adding
    a new "TEST" module property, and setting it for all modules in the
    tools/testing directory. This property can also be set manually, for
    tests which live outside the tools/testing directory with:
    MODULE_INFO(test, "Y");

    Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
    Reviewed-by: Aaron Tomlin <atomlin@redhat.com>
    Acked-by: Brendan Higgins <brendanhiggins@google.com>
    Signed-off-by: David Gow <davidgow@google.com>
    Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:18 -04:00
Donald Dutile 9349da9c63 modpost: fix section mismatch check for exported init/exit sections
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 28438794aba47a27e922857d27b31b74e8559143
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sat Jun 11 03:32:30 2022 +0900

    modpost: fix section mismatch check for exported init/exit sections

    Since commit f02e8a6596 ("module: Sort exported symbols"),
    EXPORT_SYMBOL* is placed in the individual section ___ksymtab(_gpl)+<sym>
    (3 leading underscores instead of 2).

    Since then, modpost cannot detect the bad combination of EXPORT_SYMBOL
    and __init/__exit.

    Fix the .fromsec field.

    Fixes: f02e8a6596 ("module: Sort exported symbols")
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 8d020d2c08 modpost: use fnmatch() to simplify match()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit a89227d769845eb9e9ab113f9f83df34d3c91db5
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon May 30 18:01:39 2022 +0900

    modpost: use fnmatch() to simplify match()

    Replace the own implementation for wildcard (glob) matching with
    a function call to fnmatch().

    Also, change the return type to 'bool'.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 090feaafca modpost: simplify mod->name allocation
JIRA: https://issues.redhat.com/browse/RHEL-28063

Conflicts: In hunk3 of modpost.c, source diff since
       upstream c25e1c55822f9b3b53 not applied, which would
       have removed the 3 lines added in RHEL9 version of this hunk.

commit 8c9ce89c5b63028dd3be43807f10b009cd2c6e51
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon May 30 18:01:38 2022 +0900

    modpost: simplify mod->name allocation

    mod->name is set to the ELF filename with the suffix ".o" stripped.

    The current code calls strdup() and free() to manipulate the string,
    but a simpler approach is to pass new_module() with the name length
    subtracted by 2.

    Also, check if the passed filename ends with ".o" before stripping it.

    The current code blindly chops the suffix:

        tmp[strlen(tmp) - 2] = '\0'

    It will cause buffer under-run if strlen(tmp) < 2;

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 8860ad2b5b kbuild: check static EXPORT_SYMBOL* by script instead of modpost
JIRA: https://issues.redhat.com/browse/RHEL-28063

Conflicts:
	- Only backport the scripts/mod/modpost.c portion as later
	  commits ended up ditching the check_local_export approach.
	  The modpost script later re-assumed responsibility for
	  checking on static EXPORT_SYMBOL* and this partial backport
	  will help setup the code context for that.

commit 31cb50b5590fe911077b8463ad01144fac8fa4f3
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Fri May 27 19:01:51 2022 +0900

    kbuild: check static EXPORT_SYMBOL* by script instead of modpost

    The 'static' specifier and EXPORT_SYMBOL() are an odd combination.

    Commit 15bfc2348d ("modpost: check for static EXPORT_SYMBOL*
    functions") tried to detect it, but this check has false negatives.

    Here is the sample code.

      Makefile:

        obj-y += foo1.o foo2.o

      foo1.c:

        #include <linux/export.h>
        static void foo(void) {}
        EXPORT_SYMBOL(foo);

      foo2.c:

        void foo(void) {}

    foo1.c exports the static symbol 'foo', but modpost cannot catch it
    because it is fooled by foo2.c, which has a global symbol with the
    same name.

    s->is_static is cleared if a global symbol with the same name is found
    somewhere, but EXPORT_SYMBOL() and the global symbol do not necessarily
    belong to the same compilation unit.

    This check should be done per compilation unit, but I do not know how
    to do it in modpost. modpost runs against vmlinux.o or modules, which
    merges multiple objects, then forgets their origin.

    modpost cannot parse individual objects because they may not be ELF but
    LLVM IR when CONFIG_LTO_CLANG=y.

    Add a simple bash script to parse the output from ${NM}. This works for
    CONFIG_LTO_CLANG=y because llvm-nm can dump symbols of LLVM IR files.

    Revert 15bfc2348d.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 137b8f6ffd modpost: squash if...else-if in find_elf_symbol2()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 68fef6704e38581f7462cb7aac349978fd4ca5cc
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue May 24 01:46:26 2022 +0900

    modpost: squash if...else-if in find_elf_symbol2()

    if ((addr - sym->st_value) < distance) {
                distance = addr - sym->st_value;
                near = sym;
        } else if ((addr - sym->st_value) == distance) {
                near = sym;
        }

    is equivalent to:

        if (addr - sym->st_value <= distance) {
                distance = addr - sym->st_value;
                near = sym;
        }

    (The else-if block can overwrite 'distance' with the same value).

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile f8e5ebbd21 modpost: reuse ARRAY_SIZE() macro for section_mismatch()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit c5c468dcc25efc0095361bb63b6255622e22f695
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue May 24 01:46:25 2022 +0900

    modpost: reuse ARRAY_SIZE() macro for section_mismatch()

    Move ARRAY_SIZE() from file2alias.c to modpost.h to reuse it in
    section_mismatch().

    Also, move the variable 'check' inside the for-loop.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile dc8f8710cf modpost: remove the unused argument of check_sec_ref()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 76954527fe05354add150737aa1b9a6baa4a6ee5
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue May 24 01:46:23 2022 +0900

    modpost: remove the unused argument of check_sec_ref()

    check_sec_ref() does not use the first parameter 'mod'.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 6fc607e737 modpost: fix undefined behavior of is_arm_mapping_symbol()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit d6b732666a1bae0df3c3ae06925043bba34502b1
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue May 24 01:46:22 2022 +0900

    modpost: fix undefined behavior of is_arm_mapping_symbol()

    The return value of is_arm_mapping_symbol() is unpredictable when "$"
    is passed in.

    strchr(3) says:
      The strchr() and strrchr() functions return a pointer to the matched
      character or NULL if the character is not found. The terminating null
      byte is considered part of the string, so that if c is specified as
      '\0', these functions return a pointer to the terminator.

    When str[1] is '\0', strchr("axtd", str[1]) is not NULL, and str[2] is
    referenced (i.e. buffer overrun).

    Test code
    ---------

      char str1[] = "abc";
      char str2[] = "ab";

      strcpy(str1, "$");
      strcpy(str2, "$");

      printf("test1: %d\n", is_arm_mapping_symbol(str1));
      printf("test2: %d\n", is_arm_mapping_symbol(str2));

    Result
    ------

      test1: 0
      test2: 1

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 1f836d2295 modpost: fix removing numeric suffixes
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit b5beffa20d83c4e15306c991ffd00de0d8628338
Author: Alexander Lobakin <alexandr.lobakin@intel.com>
Date:   Tue May 24 17:27:18 2022 +0200

    modpost: fix removing numeric suffixes

    With the `-z unique-symbol` linker flag or any similar mechanism,
    it is possible to trigger the following:

    ERROR: modpost: "param_set_uint.0" [vmlinux] is a static EXPORT_SYMBOL

    The reason is that for now the condition from remove_dot():

    if (m && (s[n + m] == '.' || s[n + m] == 0))

    which was designed to test if it's a dot or a '\0' after the suffix
    is never satisfied.
    This is due to that `s[n + m]` always points to the last digit of a
    numeric suffix, not on the symbol next to it (from a custom debug
    print added to modpost):

    param_set_uint.0, s[n + m] is '0', s[n + m + 1] is '\0'

    So it's off-by-one and was like that since 2014.

    Fix this for the sake of any potential upcoming features, but don't
    bother stable-backporting, as it's well hidden -- apart from that
    LD flag, it can be triggered only with GCC LTO which never landed
    upstream.

    Fixes: fcd38ed0ff ("scripts: modpost: fix compilation warning")
    Signed-off-by: Alexander Lobakin <alexandr.lobakin@intel.com>
    Reviewed-by: Petr Mladek <pmladek@suse.com>
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile ba0625ee4c kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS
JIRA: https://issues.redhat.com/browse/RHEL-28063

Conflicts:
	Minor ordering in patch-diff listing, but content the same.
	Well, after the objtool update, cs9 05c520e6c2 backport of upstream
	5d45950dffb and cs9 b206f546c7 backport of upstream b42d230650241 were
	applied out of order.  Maintain those changes by dropping 3
	shell functions.

commit 7b4537199a4a8480b8c3ba37a2d44765ce76cd9b
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Fri May 13 20:39:22 2022 +0900

    kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS

    include/{linux,asm-generic}/export.h defines a weak symbol, __crc_*
    as a placeholder.

    Genksyms writes the version CRCs into the linker script, which will be
    used for filling the __crc_* symbols. The linker script format depends
    on CONFIG_MODULE_REL_CRCS. If it is enabled, __crc_* holds the offset
    to the reference of CRC.

    It is time to get rid of this complexity.

    Now that modpost parses text files (.*.cmd) to collect all the CRCs,
    it can generate C code that will be linked to the vmlinux or modules.

    Generate a new C file, .vmlinux.export.c, which contains the CRCs of
    symbols exported by vmlinux. It is compiled and linked to vmlinux in
    scripts/link-vmlinux.sh.

    Put the CRCs of symbols exported by modules into the existing *.mod.c
    files. No additional build step is needed for modules. As before,
    *.mod.c are compiled and linked to *.ko in scripts/Makefile.modfinal.

    No linker magic is used here. The new C implementation works in the
    same way, whether CONFIG_RELOCATABLE is enabled or not.
    CONFIG_MODULE_REL_CRCS is no longer needed.

    Previously, Kbuild invoked additional $(LD) to update the CRCs in
    objects, but this step is unneeded too.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Nicolas Schier <nicolas@fjasle.eu>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:17 -04:00
Donald Dutile 2e392f1d2e modpost: extract symbol versions from *.cmd files
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit f292d875d0dc700b3af0bef04c5abc1dc7b3b62c
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Fri May 13 20:39:21 2022 +0900

    modpost: extract symbol versions from *.cmd files

    Currently, CONFIG_MODVERSIONS needs extra link to embed the symbol
    versions into ELF objects. Then, modpost extracts the version CRCs
    from them.

    The following figures show how it currently works, and how I am trying
    to change it.

    Current implementation
    ======================
                                                               |----------|
                     embed CRC      -------------------------->| final    |
           $(CC)       $(LD)       /  |---------|              | link for |
           -----> *.o -------> *.o -->| modpost |              | vmlinux  |
          /              /            |         |-- *.mod.c -->| or       |
         / genksyms     /             |---------|              | module   |
      *.c ------> *.symversions                                |----------|

    Genksyms outputs the calculated CRCs in the form of linker script
    (*.symversions), which is used by $(LD) to update the object.

    If CONFIG_LTO_CLANG=y, the build process is much more complex. Embedding
    the CRCs is postponed until the LLVM bitcode is converted into ELF,
    creating another intermediate *.prelink.o.

    However, this complexity is unneeded. There is no reason why we must
    embed version CRCs in objects so early.

    There is final link stage for vmlinux (scripts/link-vmlinux.sh) and
    modules (scripts/Makefile.modfinal). We can link CRCs at the very last
    moment.

    New implementation
    ==================
                                                               |----------|
                       --------------------------------------->| final    |
           $(CC)      /    |---------|                         | link for |
           -----> *.o ---->|         |                         | vmlinux  |
          /                | modpost |--- .vmlinux.export.c -->| or       |
         / genksyms        |         |--- *.mod.c ------------>| module   |
      *.c ------> *.cmd -->|---------|                         |----------|

    Pass the symbol versions to modpost as separate text data, which are
    available in *.cmd files.

    This commit changes modpost to extract CRCs from *.cmd files instead of
    from ELF objects.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:16 -04:00
Donald Dutile e6fef94080 modpost: add sym_find_with_module() helper
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 69c4cc99bbcbf3ef2e1901b569954e9226180840
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Thu May 12 01:45:04 2022 +0900

    modpost: add sym_find_with_module() helper

    find_symbol() returns the first symbol found in the hash table. This
    table is global, so it may return a symbol from an unexpected module.

    There is a case where we want to search for a symbol with a given name
    in a specified module.

    Add sym_find_with_module(), which receives the module pointer as the
    second argument. It is equivalent to find_module() if NULL is passed
    as the module pointer.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Nathan Chancellor <nathan@kernel.org>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM-14 (x86-64)

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:16 -04:00
Donald Dutile eeebd7801a modpost: change the license of EXPORT_SYMBOL to bool type
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 2a66c3124afd2782015d160f8bad693488ce68de
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon May 9 04:06:19 2022 +0900

    modpost: change the license of EXPORT_SYMBOL to bool type

    There were more EXPORT_SYMBOL types in the past. The following commits
    removed unused ones.

     - f1c3d73e97 ("module: remove EXPORT_SYMBOL_GPL_FUTURE")
     - 367948220f ("module: remove EXPORT_UNUSED_SYMBOL*")

    There are 3 remaining in enum export, but export_unknown does not make
    any sense because we never expect such a situation like "we do not know
    how it was exported".

    If the symbol name starts with "__ksymtab_", but the section name
    does not start with "___ksymtab+" or "___ksymtab_gpl+", it is not an
    exported symbol.

    It occurs when a variable starting with "__ksymtab_" is directly defined:

       int __ksymtab_foo;

    Presumably, there is no practical issue for using such a weird variable
    name (but there is no good reason for doing so, either).

    Anyway, that is not an exported symbol. Setting export_unknown is not
    the right thing to do. Do not call sym_add_exported() in this case.

    With pointless export_unknown removed, the export type finally becomes
    boolean (either EXPORT_SYMBOL or EXPORT_SYMBOL_GPL).

    I renamed the field name to is_gpl_only. EXPORT_SYMBOL_GPL sets it true.
    Only GPL-compatible modules can use it.

    I removed the orphan comment, "How a symbol is exported", which is
    unrelated to sec_mismatch_count. It is about enum export.
    See commit bd5cbcedf4 ("kbuild: export-type enhancement to modpost.c")

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Nathan Chancellor <nathan@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:16 -04:00
Donald Dutile a952a26a27 modpost: move *.mod.c generation to write_mod_c_files()
JIRA: https://issues.redhat.com/browse/RHEL-28063

Conflicts:
   Keep RHEL-only commit that calls add_rhelversion() in new write_mod_c_files()

commit a44abaca0e196cfeef2374ed663b97daa1ad112a
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Thu May 5 16:22:33 2022 +0900

    modpost: move *.mod.c generation to write_mod_c_files()

    A later commit will add more code to this list_for_each_entry loop.

    Before that, move the loop body into a separate helper function.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Nathan Chancellor <nathan@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 29e423380c modpost: merge add_{intree_flag,retpoline,staging_flag} to add_header
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 7fedac9698b3a56571064eb3b23063f09c93eb94
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Thu May 5 16:22:32 2022 +0900

    modpost: merge add_{intree_flag,retpoline,staging_flag} to add_header

    add_intree_flag(), add_retpoline(), and add_staging_flag() are small
    enough to be merged into add_header().

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
    Tested-by: Nathan Chancellor <nathan@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 75497760ff modpost: split new_symbol() to symbol allocation and hash table addition
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit f18379a30271c0289c2d0e1074e1ed633bfd708c
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:19 2022 +0900

    modpost: split new_symbol() to symbol allocation and hash table addition

    new_symbol() does two things; allocate a new symbol and register it
    to the hash table.

    Using a separate function for each is easier to understand.

    Replace new_symbol() with hash_add_symbol(). Remove the second parameter
    of alloc_symbol().

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 65dae7128b modpost: make sym_add_exported() always allocate a new symbol
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit e76cc48d8e6df5d949284132981db73d2dd8c6b5
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:18 2022 +0900

    modpost: make sym_add_exported() always allocate a new symbol

    Currently, sym_add_exported() does not allocate a symbol if the same
    name symbol already exists in the hash table.

    This does not reflect the real use cases. You can let an external
    module override the in-tree one. In this case, the external module
    will export the same name symbols as the in-tree one. However,
    modpost simply ignores those symbols, then Module.symvers for the
    external module loses its symbols.

    sym_add_exported() should allocate a new symbol.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 8efe3613bb modpost: make multiple export error
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit b8422711080f57cdf9fb1c0cb8683a2112bed27c
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:17 2022 +0900

    modpost: make multiple export error

    This is currently a warning, but I think modpost should stop building
    in this case.

    If the same symbol is exported multiple times and we let it keep going,
    the sanity check becomes difficult.

    Only the legitimate case is that an external module overrides the
    corresponding in-tree module to provide a different implementation
    with the same interface.

    Also, there exists an upstream example that exploits this feature.

      $ make M=tools/testing/nvdimm

    ... builds tools/testing/nvdimm/libnvdimm.ko. This is a mocked module
    that overrides the symbols from drivers/nvdimm/libnvdimm.ko.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile bd484c3938 modpost: dump Module.symvers in the same order of modules.order
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit f841536e8c5b28e1fbf8743911ae1dc78993abd4
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:15 2022 +0900

    modpost: dump Module.symvers in the same order of modules.order

    modpost dumps the exported symbols into Module.symvers, but currently
    in random order because it iterates in the hash table.

    Add a linked list of exported symbols in struct module, so we can
    iterate on symbols per module.

    This commit makes Module.symvers much more readable; the outer loop in
    write_dump() iterates over the modules in the order of modules.order,
    and the inner loop dumps symbols in each module.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 61ea2b79e4 modpost: traverse the namespace_list in order
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit ab489d6002fc27dc5db6d66f121da6fc0bda13ad
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:14 2022 +0900

    modpost: traverse the namespace_list in order

    Use the doubly linked list to traverse the list in the added order.
    This makes the code more consistent.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 93448e84b6 modpost: use doubly linked list for dump_lists
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 4484054816cab940fc2fde23fa989174fec889d0
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:13 2022 +0900

    modpost: use doubly linked list for dump_lists

    This looks easier to understand (just because this is a pattern in
    the kernel code). No functional change is intended.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 9b9f692504 modpost: traverse unresolved symbols in order
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 8a69152be9a8c1f7a02c6b8410b35c68cb200f6d
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:12 2022 +0900

    modpost: traverse unresolved symbols in order

    Currently, modpost manages unresolved in a singly linked list; it adds
    a new node to the head, and traverses the list from new to old.

    Use a doubly linked list to keep the order in the symbol table in the
    ELF file.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 9e5a775c60 modpost: add sym_add_unresolved() helper
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit e882e89bcf1d54da2e4388570325774c3e3078a9
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:11 2022 +0900

    modpost: add sym_add_unresolved() helper

    Add a small helper, sym_add_unresolved() to ease the further
    refactoring.

    Remove the 'weak' argument from alloc_symbol() because it is sensible
    only for unresolved symbols.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 012e7f1a37 modpost: traverse modules in order
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 325eba05e8ab53a9182a2734f0986c15e5f87349
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:10 2022 +0900

    modpost: traverse modules in order

    Currently, modpost manages modules in a singly linked list; it adds
    a new node to the head, and traverses the list from new to old.

    It works, but the error messages are shown in the reverse order.

    If you have a Makefile like this:

      obj-m += foo.o bar.o

    then, modpost shows error messages in bar.o, foo.o, in this order.

    Use a doubly linked list to keep the order in modules.order; use
    list_add_tail() for the node addition and list_for_each_entry() for
    the list traverse.

    Now that the kernel's list macros have been imported to modpost, I will
    use them actively going forward.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 96b3a69404 modpost: change mod->gpl_compatible to bool type
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 5066743e4c2f702c1da8ba00a1dc217527a0ab7c
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:08 2022 +0900

    modpost: change mod->gpl_compatible to bool type

    Currently, mod->gpl_compatible is tristate; it is set to -1 by default,
    then to 1 or 0 when MODULE_LICENSE() is found.

    Maybe, -1 was chosen to represent the 'unknown' license, but it is not
    useful.

    The current code:

        if (!mod->gpl_compatible)
                check_for_gpl_usage(exp->export, basename, exp->name);

    ... only cares whether gpl_compatible is zero or not.

    Change it to a bool type with the initial value 'true', which has no
    functional change.

    The default value should be 'true' instead of 'false'.

    Since commit 1d6cd39293 ("modpost: turn missing MODULE_LICENSE() into
    error"), unknown module license is an error.

    The error message, "missing MODULE_LICENSE()" is enough to explain the
    issue. It is not sensible to show another message, "GPL-incompatible
    module ... uses GPL-only symbol".

    Add comments to explain this.

    While I was here, I renamed gpl_compatible to is_gpl_compatible for
    clarification, and also slightly refactored the code.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 257a024dc4 modpost: use bool type where appropriate
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 58e01fcae18c9d01be701bec9e9a8ee58269c7c1
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sun May 1 17:40:07 2022 +0900

    modpost: use bool type where appropriate

    Use 'bool' to clarify that the valid value is true or false.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile a42b1c1472 modpost: move struct namespace_list to modpost.c
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 70ddb48db4aaddd3c2a7d8802463e15b21ce8525
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:56 2022 +0900

    modpost: move struct namespace_list to modpost.c

    There is no good reason to define struct namespace_list in modpost.h

    struct module has pointers to struct namespace_list, but that does
    not require the definition of struct namespace_list.

    Move it to modpost.c.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 06b047beed modpost: retrieve the module dependency and CRCs in check_exports()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 4cae77ac582b430d6ad6fbf0e1b23248997ceac8
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:49 2022 +0900

    modpost: retrieve the module dependency and CRCs in check_exports()

    Do not repeat the similar code.

    It is simpler to do this in check_exports() instead of add_versions().

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:15 -04:00
Donald Dutile 8f440b1a3b modpost: add a separate error for exported symbols without definition
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 23beb44a0effaad1bd627fd134f0301c622deba7
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:48 2022 +0900

    modpost: add a separate error for exported symbols without definition

    It took me a while to understand the intent of "exp->module == mod".

    This code goes back to 2003. [1]

    The commit is not in this git repository, and might be worth a little
    explanation.

    You can add EXPORT_SYMBOL() without having its definition in the same
    file (but you need to put a declaration).

    This is typical when EXPORT_SYMBOL() is added in a C file, but the
    actual implementation is in a separate assembly file.

    One example is arch/arm/kernel/armksyms.c

    In the old days, EXPORT_SYMBOL() was only available in C files (but
    this limitation does not exist any more). If you forget to add the
    definition, this error occurs.

    Add a separate, clearer message for this case. It should be an error
    even if KBUILD_MODPOST_WARN is given.

    [1]: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=2763b6bcb96e6a38a2fe31108fe5759ec5bcc80a

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 1b3db8fe75 modpost: remove stale comment about sym_add_exported()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 594ade3eef3f2d458902ced2cb2614dfae8558de
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:47 2022 +0900

    modpost: remove stale comment about sym_add_exported()

    The description,

      it may have already been added without a
      CRC, in this case just update the CRC

    ... is no longer valid.

    In the old days, this function was used to update the CRC as well.

    Commit 040fcc819a ("kbuild: improved modversioning support for
    external modules") started to use a separate function (sym_update_crc)
    for updating the CRC.

    The first part, "Add an exported symbol" is correct, but it is too
    obvious from the function name. Drop this comment entirely.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile f83e4985ef modpost: do not write out any file when error occurred
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit c155a47d83ab0b5ee96ebe1721057cba1936d0d5
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:46 2022 +0900

    modpost: do not write out any file when error occurred

    If an error occurs, modpost will fail anyway. Do not write out
    any content (, which might be invalid).

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 1b2e6c9a4c modpost: use snprintf() instead of sprintf() for safety
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 15a28c7c72917f96820e9e9ccd113606363ba3ac
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Mon Apr 25 04:07:45 2022 +0900

    modpost: use snprintf() instead of sprintf() for safety

    Use snprintf() to avoid the potential buffer overflow, and also
    check the return value to detect the too long path.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 6c80ebbe28 modpost: remove annoying namespace_from_kstrtabns()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 79f646e8654b6b8e4f7dda456ec3eabd51052041
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue Apr 5 20:33:54 2022 +0900

    modpost: remove annoying namespace_from_kstrtabns()

    There are two call sites for sym_update_namespace().

    When the symbol has no namespace, s->namespace is set to NULL,
    but the conversion from "" to NULL is done in two different places.

    [1] read_symbols()

      This gets the namespace from __kstrtabns_<symbol>. If the symbol has
      no namespace, sym_get_data(info, sym) returns the empty string "".
      namespace_from_kstrtabns() converts it to NULL before it is passed to
      sym_update_namespace().

    [2] read_dump()

      This gets the namespace from the dump file, *.symvers. If the symbol
      has no namespace, the 'namespace' is the empty string "", which is
      directly passed into sym_update_namespace(). The conversion from
      "" to NULL is done in sym_update_namespace().

    namespace_from_kstrtabns() exists only for creating this inconsistency.

    Remove namespace_from_kstrtabns() so that sym_update_namespace() is
    consistently passed with "" instead of NULL.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 35a2f34910 modpost: remove redundant initializes for static variables
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit b5f1a52a59eb810f68c96d1cea7cf1256c39956c
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue Apr 5 20:33:53 2022 +0900

    modpost: remove redundant initializes for static variables

    These are initialized with zeros without explicit initializers.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile ef7dd6e362 modpost: move export_from_secname() call to more relevant place
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 535b3e05f435698f8f661d9e6449beb5791fff59
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue Apr 5 20:33:52 2022 +0900

    modpost: move export_from_secname() call to more relevant place

    The assigned 'export' is only used when

        if (strstarts(symname, "__ksymtab_"))

    is met. The else-part of the assignment is the dead code.

    Move the export_from_secname() call to where it is used.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 26bce24299 modpost: remove useless export_from_sec()
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit 7ce3e410e0188ce7ca65b49c90cff2863d6e232e
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Tue Apr 5 20:33:51 2022 +0900

    modpost: remove useless export_from_sec()

    With commit 1743694eb2 ("modpost: stop symbol preloading for
    modversion CRC") applied, now export_from_sec() is useless.

    handle_symbol() is called for every symbol in the ELF.

    When 'symname' does not start with "__ksymtab", export_from_sec() is
    called, and the returned value is stored in 'export'.

    It is used in the last part of handle_symbol():

        if (strstarts(symname, "__ksymtab_")) {
                name = symname + strlen("__ksymtab_");
                sym_add_exported(name, mod, export);
        }

    'export' is used only when 'symname' starts with "__ksymtab_".

    So, the value returned by export_from_sec() is never used.

    Remove useless export_from_sec(). This makes further cleanups possible.

    I put the temporary code:

        export = export_unknown;

    Otherwise, I would get the compiler warning:

        warning: 'export' may be used uninitialized in this function [-Wmaybe-uninitialized]

    This is apparently false positive because

        if (strstarts(symname, "__ksymtab_")

    ... is a stronger condition than:

        if (strstarts(symname, "__ksymtab")

    Anyway, this part will be cleaned up by the next commit.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:14 -04:00
Donald Dutile 3c428c7e9b modpost: restore the warning message for missing symbol versions
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit bf5c0c2231bcab677e5cdfb7f73e6c79f6d8c2d4
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sat Apr 2 00:56:10 2022 +0900

    modpost: restore the warning message for missing symbol versions

    This log message was accidentally chopped off.

    I was wondering why this happened, but checking the ML log, Mark
    precisely followed my suggestion [1].

    I just used "..." because I was too lazy to type the sentence fully.
    Sorry for the confusion.

    [1]: https://lore.kernel.org/all/CAK7LNAR6bXXk9-ZzZYpTqzFqdYbQsZHmiWspu27rtsFxvfRuVA@mail.gmail.com/

    Fixes: 4a6795933a ("kbuild: modpost: Explicitly warn about unprototyped symbols")
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    Acked-by: Mark Brown <broonie@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:12 -04:00
Donald Dutile 97035d845d modpost: get the *.mod file path more simply
JIRA: https://issues.redhat.com/browse/RHEL-28063

commit e54dd93a08228b9942d708b133ad3715d92712b0
Author: Masahiro Yamada <masahiroy@kernel.org>
Date:   Sat Aug 28 18:50:59 2021 +0900

    modpost: get the *.mod file path more simply

    get_src_version() strips 'o' or 'lto.o' from the end of the object file
    path (so, postfixlen is 1 or 5), then adds 'mod'.

    If you look at the code closely, mod->name already holds the base path
    with the extension stripped.

    Most of the code changes made by commit 7ac204b545 ("modpost: lto:
    strip .lto from module names") was actually unneeded.

    sumversion.c does not need strends(), so it can get back local in
    modpost.c again.

    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

Signed-off-by: Donald Dutile <ddutile@redhat.com>
2024-06-17 14:17:11 -04:00
Joel Slebodnick af8931b273 kbuild: Fixup the IBT kbuild changes
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2160559
Tested: Kernel booted on Orin board with no warnings using device tree

commit d31ed5d767c0452b4f49846d80a0bfeafa3a4ded
Author: Peter Zijlstra <peterz@infradead.org>
Date:   Fri Mar 18 12:19:27 2022 +0100

    kbuild: Fixup the IBT kbuild changes

    Masahiro-san deemed my kbuild changes to support whole module objtool
    runs too terrible to live and gracefully provided an alternative.

    Suggested-by: Masahiro Yamada <masahiroy@kernel.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/CAK7LNAQ2mYMnOKMQheVi+6byUFE3KEkjm1zcndNUfe0tORGvug@mail.gmail.com
    (cherry picked from commit d31ed5d767c0452b4f49846d80a0bfeafa3a4ded)

Signed-off-by: Joel Slebodnick <jslebodn@redhat.com>
2023-03-24 17:06:53 -04:00
Julia Denham f9d03a2ab4 s390/nospec: add an option to use thunk-extern
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2072713

Conflicts:
	arch/s390/lib/Makefile
	- RHEL9 does not have commit d340d28a968 ("kprobes: add testcases for s390"). Diff context only.

commit 1d2ad084800edad81cdc955304272742b10721c7
Author: Vasily Gorbik <gor@linux.ibm.com>
Date:   Sun Mar 6 20:56:07 2022 +0100

s390/nospec: add an option to use thunk-extern

Currently with -mindirect-branch=thunk and -mfunction-return=thunk compiler
options expoline thunks are put into individual COMDAT group sections. s390
is the only architecture which has group sections and it has implications
for kpatch and objtool tools support.

Using -mindirect-branch=thunk-extern and -mfunction-return=thunk-extern
is an alternative, which comes with a need to generate all required
expoline thunks manually. Unfortunately modules area is too far away from
the kernel image, and expolines from the kernel image cannon be used.
But since all new distributions (except Debian) build kernels for machine
generations newer than z10, where "exrl" instruction is available, that
leaves only 16 expolines thunks possible.

Provide an option to build the kernel with
-mindirect-branch=thunk-extern and -mfunction-return=thunk-extern for
z10 or newer. This also requires to postlink expoline thunks into all
modules explicitly. Currently modules already contain most expolines
anyhow.

Unfortunately -mindirect-branch=thunk-extern and
-mfunction-return=thunk-extern options support is broken in gcc <= 11.2.
Additional compile test is required to verify proper gcc support.

Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Co-developed-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
(cherry picked from commit 1d2ad084800edad81cdc955304272742b10721c7)

Signed-off-by: Julia Denham <jdenham@redhat.com>
2022-11-08 08:34:18 -05:00
Waiman Long 97c8ca0759 Kbuild: use -Wdeclaration-after-statement
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2074118

commit 4d94f910e79a349b00a4f8aab6f3ae87129d8c5a
Author: Mark Rutland <mark.rutland@arm.com>
Date:   Tue, 8 Mar 2022 22:56:13 +0100

    Kbuild: use -Wdeclaration-after-statement

    The kernel is moving from using `-std=gnu89` to `-std=gnu11`, permitting
    the use of additional C11 features such as for-loop initial declarations.

    One contentious aspect of C99 is that it permits mixed declarations and
    code, and for now at least, it seems preferable to enforce that
    declarations must come first.

    These warnings were already enabled in the kernel itself, but not
    for KBUILD_USERCFLAGS or the compat VDSO on arch/arm64, which uses
    a separate set of CFLAGS.

    This patch fixes an existing violation in modpost.c, which is not
    reported because of the missing flag in KBUILD_USERCFLAGS:

    | scripts/mod/modpost.c: In function ‘match’:
    | scripts/mod/modpost.c:837:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    |   837 |   const char *endp = p + strlen(p) - 1;
    |       |   ^~~~~

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    [arnd: don't add a duplicate flag to the default set, update changelog]
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Reviewed-by: Nathan Chancellor <nathan@kernel.org>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM/Clang v13.0.0 (x86-64)
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-06-07 17:44:35 -04:00
Laura Abbott d2857e6759 modules: add rhelversion MODULE_INFO tag
There were several changes in the 5.0-rc1 kernel that required
this patch to be rebased with some context diff.

    Patchwork-id: 7379
    O-Subject: [kernel team] [RHEL8.0 BZ 1544999 1/2] modules: add rhelversion MODULE_INFO tag
    Bugzilla: 1544999
    RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
    RH-Acked-by: Oleg Nesterov <oleg@redhat.com>
    RH-Acked-by: Jarod Wilson <jarod@redhat.com>

    Bugzilla: http://bugzilla.redhat.com/1544999

    kernel-alt commit 9816b4b6ca5d4c0504d8806ce99442c90afbc8e6
    Author: Prarit Bhargava <prarit@redhat.com>
    Date:   Fri Feb 9 18:09:26 2018 -0500

        [kernel] modules: add rhelversion MODULE_INFO tag

        Message-id: <20180209180926.5955-3-prarit@redhat.com>
        Patchwork-id: 205587
        O-Subject: [RHEL-ALT-7.5 BZ 1542796 2/2] modules: add rhelversion MODULE_INFO tag
        Bugzilla: 1542796
        RH-Acked-by: David Arcari <darcari@redhat.com>
        RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
        RH-Acked-by: Steve Best <sbest@redhat.com>

        Bugzilla: http://bugzilla.redhat.com/1542796

        rhel7 commit 9af8c3992ce5fff253c49abc0dedb3ec77badba4
        Author: Kyle McMartin <kmcmarti@redhat.com>
        Date:   Fri Sep 12 17:46:12 2014 -0400

            [kernel] modules: add rhelversion MODULE_INFO tag

            Message-id: <20140912174612.GS29420@redacted.bos.redhat.com>
            Patchwork-id: 94052
            O-Subject: [RHEL7.1 PATCH 2/6 v4] modules: add rhelversion MODULE_INFO tag
            Bugzilla: 1110315
            RH-Acked-by: Prarit Bhargava <prarit@redhat.com>
            RH-Acked-by: Johannes Weiner <jweiner@redhat.com>
            RH-Acked-by: Don Zickus <dzickus@redhat.com>

            From: Kyle McMartin <kmcmarti@redhat.com>

            Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1110315

            >From kylem's RHEL8 post:

            Let's not lose this ability in RHEL8. Sadly can't be applied to RHEL7
            because it breaks KABI due to the struct module change.

            Inspired by bits of a147e4729d9920ccae2c717ca65c811cc0f93a1d in RHEL6,
            which got lost for RHEL7.0. :/

            Kyle is correct and doing this would break RHEL7's KABI.  I'm taking this
            patch in as a base and the next patch will resolve the KABI issues.

            [v2]: dzickus, cleanup add_rhelversion()
            [v4]: resubmitted along with 16k stacks change

            Signed-off-by: Jarod Wilson <jarod@redhat.com>

        Cc: Richard Guy Briggs <rgb@redhat.com>
        Cc: Peter Rajnoha <prajnoha@redhat.com>
        Cc: Laura Abbott <labbott@redhat.com>
        Cc: Josh Poimboeuf <jpoimboe@redhat.com>
        Signed-off-by: Herton R. Krzesinski <herton@redhat.com>

Upstream Status: RHEL only
Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
Acked-by: Don Zickus <dzickus@redhat.com>
Acked-by: Prarit Bhargava <prarit@redhat.com>
2021-08-30 10:50:55 -04:00
Mark Brown 4a6795933a kbuild: modpost: Explicitly warn about unprototyped symbols
One common cause of modpost version generation failures is a failure to
prototype exported assembly functions - the tooling requires this for
exported functions even if they are not and should not be called from C
code in order to do the version mangling for symbols. Unfortunately the
error message is currently rather abstruse, simply saying that "version
generation failed" and even diving into the code doesn't directly show
what's going on since there's several steps between the problem and it
being observed.

Provide an explicit hint as to the likely cause of a version generation
failure to help anyone who runs into this in future more readily diagnose
and fix the problem.

Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-06-17 10:01:05 +09:00
Yonghong Song 1fdd7433a9 kbuild: add an elfnote for whether vmlinux is built with lto
Currently, clang LTO built vmlinux won't work with pahole.
LTO introduced cross-cu dwarf tag references and broke
current pahole model which handles one cu as a time.
The solution is to merge all cu's as one pahole cu as in [1].
We would like to do this merging only if cross-cu dwarf
references happens. The LTO build mode is a pretty good
indication for that.

In earlier version of this patch ([2]), clang flag
-grecord-gcc-switches is proposed to add to compilation flags
so pahole could detect "-flto" and then merging cu's.
This will increate the binary size of 1% without LTO though.

Arnaldo suggested to use a note to indicate the vmlinux
is built with LTO. Such a cheap way to get whether the vmlinux
is built with LTO or not helps pahole but is also useful
for tracing as LTO may inline/delete/demote global functions,
promote static functions, etc.

So this patch added an elfnote with a new type LINUX_ELFNOTE_LTO_INFO.
The owner of the note is "Linux".

With gcc 8.4.1 and clang trunk, without LTO, I got
  $ readelf -n vmlinux
  Displaying notes found in: .notes
    Owner                Data size        Description
  ...
    Linux                0x00000004       func
     description data: 00 00 00 00
  ...
With "readelf -x ".notes" vmlinux", I can verify the above "func"
with type code 0x101.

With clang thin-LTO, I got the same as above except the following:
     description data: 01 00 00 00
which indicates the vmlinux is built with LTO.

  [1] https://lore.kernel.org/bpf/20210325065316.3121287-1-yhs@fb.com/
  [2] https://lore.kernel.org/bpf/20210331001623.2778934-1-yhs@fb.com/

Suggested-by: Arnaldo Carvalho de Melo <arnaldo.melo@gmail.com>
Signed-off-by: Yonghong Song <yhs@fb.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # LLVM/Clang v12.0.0-rc4 (x86-64)
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-04-25 05:25:42 +09:00
Bhaskar Chowdhury f3945833e4 scripts: modpost.c: Fix a few typos
s/agorithm/algorithm/
s/criterias/criteria/
s/targetting/targeting/   ....two different places.

Signed-off-by: Bhaskar Chowdhury <unixbhaskar@gmail.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-04-25 05:21:45 +09:00
Masahiro Yamada 4475dff55c kbuild: fix false-positive modpost warning when all symbols are trimmed
Nathan reports that the mips defconfig emits the following warning:

  WARNING: modpost: Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.

This false-positive happens when CONFIG_TRIM_UNUSED_KSYMS is enabled,
but no CONFIG option is set to 'm'.

Commit a0590473c5 ("nfs: fix PNFS_FLEXFILE_LAYOUT Kconfig default")
turned the last 'm' into 'y' for the mips defconfig, and uncovered
this issue.

In this case, the module feature itself is enabled, but we have no
module to build. As a result, CONFIG_TRIM_UNUSED_KSYMS drops all the
instances of EXPORT_SYMBOL. Then, modpost wrongly assumes vmlinux is
missing because vmlinux.symvers is empty. (As another false-positive
case, you can create a module that does not use any symbol of vmlinux).

The current behavior is to entirely suppress the unresolved symbol
warnings when vmlinux is missing just because there are too many.
I found the origin of this code in the historical git tree. [1]

If this is a matter of noisiness, I think modpost can display the
first 10 warnings, and the number of suppressed warnings at the end.

You will get a bit noisier logs when you run 'make modules' without
vmlinux, but such warnings are better to show because you never know
the resulting modules are actually loadable or not.

This commit changes the following:

 - If any of input *.symver files is missing, pass -w option to let
   the module build keep going with warnings instead of errors.

 - If there are too many (10+) unresolved symbol warnings, show only
   the first 10, and also the number of suppressed warnings.

[1]: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=1cc0e0529569bf6a94f6d49770aa6d4b599d2c46

Reported-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-04-25 05:17:53 +09:00
Masahiro Yamada 69bc8d386a kbuild: generate Module.symvers only when vmlinux exists
The external module build shows the following warning if Module.symvers
is missing in the kernel tree.

  WARNING: Symbol version dump "Module.symvers" is missing.
           Modules may not have dependencies or modversions.

I think this is an important heads-up because the resulting modules may
not work as expected. This happens when you did not build the entire
kernel tree, for example, you might have prepared the minimal setups
for external modules by 'make defconfig && make modules_preapre'.

A problem is that 'make modules' creates Module.symvers even without
vmlinux. In this case, that warning is suppressed since Module.symvers
already exists in spite of its incomplete content.

The incomplete (i.e. invalid) Module.symvers should not be created.

This commit changes the second pass of modpost to dump symbols into
modules-only.symvers. The final Module.symvers is created by
concatenating vmlinux.symvers and modules-only.symvers if both exist.

Module.symvers is supposed to collect symbols from both vmlinux and
modules. It might be a bit confusing, and I am not quite sure if it
is an official interface, but presumably it is difficult to rename it
because some tools (e.g. kmod) parse it.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2021-04-25 05:17:02 +09:00
Linus Torvalds 21a6ab2131 Modules updates for v5.12
Summary of modules changes for the 5.12 merge window:
 
 - Retire EXPORT_UNUSED_SYMBOL() and EXPORT_SYMBOL_GPL_FUTURE(). These export
   types were introduced between 2006 - 2008. All the of the unused symbols have
   been long removed and gpl future symbols were converted to gpl quite a long
   time ago, and I don't believe these export types have been used ever since.
   So, I think it should be safe to retire those export types now. (Christoph Hellwig)
 
 - Refactor and clean up some aged code cruft in the module loader (Christoph Hellwig)
 
 - Build {,module_}kallsyms_on_each_symbol only when livepatching is enabled, as
   it is the only caller (Christoph Hellwig)
 
 - Unexport find_module() and module_mutex and fix the last module
   callers to not rely on these anymore. Make module_mutex internal to
   the module loader. (Christoph Hellwig)
 
 - Harden ELF checks on module load and validate ELF structures before checking
   the module signature (Frank van der Linden)
 
 - Fix undefined symbol warning for clang (Fangrui Song)
 
 - Fix smatch warning (Dan Carpenter)
 
 Signed-off-by: Jessica Yu <jeyu@kernel.org>
 -----BEGIN PGP SIGNATURE-----
 
 iQJEBAABCAAuFiEEVrp26glSWYuDNrCUwEV+OM47wXIFAmA0/KMQHGpleXVAa2Vy
 bmVsLm9yZwAKCRDARX44zjvBcu0uD/4nmRp18EKAtdUZivsZHat0aEWGlkmrVueY
 5huYw6iwM8b/wIAl3xwLki1Iv0/l0a83WXZhLG4ekl0/Nj8kgllA+jtBrZWpoLMH
 CZusN5dS9YwwyD2vu3ak83ARcehcDEPeA9thvc3uRFGis6Hi4bt1rkzGdrzsgqR4
 tybfN4qaQx4ZAKFxA8bnS58l7QTFwUzTxJfM6WWzl1Q+mLZDr/WP+loJ/f1/oFFg
 ufN31KrqqFpdQY5UKq5P4H8FVq/eXE1Mwl8vo3HsnAj598fznyPUmA3D/j+N4GuR
 sTGBVZ9CSehUj7uZRs+Qgg6Bd+y3o44N29BrdZWA6K3ieTeQQpA+VgPUNrDBjGhP
 J/9Y4ms4PnuNEWWRaa73m9qsVqAsjh9+T2xp9PYn9uWLCM8BvQFtWcY7tw4/nB0/
 INmyiP/tIRpwWkkBl47u1TPR09FzBBGDZjBiSn3lm3VX+zCYtHoma5jWyejG11cf
 ybDrTsci9ANyHNP2zFQsUOQJkph78PIal0i3k4ODqGJvaC0iEIH3Xjv+0dmE14rq
 kGRrG/HN6HhMZPjashudVUktyTZ63+PJpfFlQbcUzdvjQQIkzW0vrCHMWx9vD1xl
 Na7vZLl4Nb03WSJp6saY6j2YSRKL0poGETzGqrsUAHEhpEOPHduaiCVlAr/EmeMk
 p6SrWv8+UQ==
 =T29Q
 -----END PGP SIGNATURE-----

Merge tag 'modules-for-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux

Pull module updates from Jessica Yu:

 - Retire EXPORT_UNUSED_SYMBOL() and EXPORT_SYMBOL_GPL_FUTURE(). These
   export types were introduced between 2006 - 2008. All the of the
   unused symbols have been long removed and gpl future symbols were
   converted to gpl quite a long time ago, and I don't believe these
   export types have been used ever since. So, I think it should be safe
   to retire those export types now (Christoph Hellwig)

 - Refactor and clean up some aged code cruft in the module loader
   (Christoph Hellwig)

 - Build {,module_}kallsyms_on_each_symbol only when livepatching is
   enabled, as it is the only caller (Christoph Hellwig)

 - Unexport find_module() and module_mutex and fix the last module
   callers to not rely on these anymore. Make module_mutex internal to
   the module loader (Christoph Hellwig)

 - Harden ELF checks on module load and validate ELF structures before
   checking the module signature (Frank van der Linden)

 - Fix undefined symbol warning for clang (Fangrui Song)

 - Fix smatch warning (Dan Carpenter)

* tag 'modules-for-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
  module: potential uninitialized return in module_kallsyms_on_each_symbol()
  module: remove EXPORT_UNUSED_SYMBOL*
  module: remove EXPORT_SYMBOL_GPL_FUTURE
  module: move struct symsearch to module.c
  module: pass struct find_symbol_args to find_symbol
  module: merge each_symbol_section into find_symbol
  module: remove each_symbol_in_section
  module: mark module_mutex static
  kallsyms: only build {,module_}kallsyms_on_each_symbol when required
  kallsyms: refactor {,module_}kallsyms_on_each_symbol
  module: use RCU to synchronize find_module
  module: unexport find_module and module_mutex
  drm: remove drm_fb_helper_modinit
  powerpc/powernv: remove get_cxl_module
  module: harden ELF info handling
  module: Ignore _GLOBAL_OFFSET_TABLE_ when warning for undefined symbols
2021-02-23 10:15:33 -08:00
Christoph Hellwig 367948220f module: remove EXPORT_UNUSED_SYMBOL*
EXPORT_UNUSED_SYMBOL* is not actually used anywhere.  Remove the
unused functionality as we generally just remove unused code anyway.

Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
2021-02-08 12:28:07 +01:00
Christoph Hellwig f1c3d73e97 module: remove EXPORT_SYMBOL_GPL_FUTURE
As far as I can tell this has never been used at all, and certainly
not any time recently.

Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
2021-02-08 12:28:02 +01:00
Sami Tolvanen 7ac204b545 modpost: lto: strip .lto from module names
With LTO, everything is compiled into LLVM bitcode, so we have to link
each module into native code before modpost. Kbuild uses the .lto.o
suffix for these files, which also ends up in module information. This
change strips the unnecessary .lto suffix from the module name.

Suggested-by: Bill Wendling <morbo@google.com>
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20201211184633.3213045-11-samitolvanen@google.com
2021-01-14 08:21:09 -08:00
Quentin Perret b9ed847b5a modpost: turn static exports into error
Using EXPORT_SYMBOL*() on static functions is fundamentally wrong.
Modpost currently reports that as a warning, but clearly this is not a
pattern we should allow, and all in-tree occurences should have been
fixed by now. So, promote the warn() message to error() to make sure
this never happens again.

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Quentin Perret <qperret@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-12-21 13:57:08 +09:00
Masahiro Yamada c7299d98c0 modpost: turn section mismatches to error from fatal()
There is code that reports static EXPORT_SYMBOL a few lines below.
It is not a good idea to bail out here.

I renamed sec_mismatch_fatal to sec_mismatch_warn_only (with logical
inversion) to match to CONFIG_SECTION_MISMATCH_WARN_ONLY.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-12-21 13:57:08 +09:00
Masahiro Yamada d6d692fa21 modpost: change license incompatibility to error() from fatal()
Change fatal() to error() to continue running to report more possible
issues.

There is no difference in the fact that modpost will fail anyway.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-12-21 13:57:08 +09:00
Masahiro Yamada 1d6cd39293 modpost: turn missing MODULE_LICENSE() into error
Do not create modules with no license tag.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-12-21 13:57:08 +09:00
Masahiro Yamada 0fd3fbadd9 modpost: refactor error handling and clarify error/fatal difference
We have 3 log functions. fatal() is special because it lets modpost bail
out immediately. The difference between warn() and error() is the only
prefix parts ("WARNING:" vs "ERROR:").

In my understanding, the expected handling of error() is to propagate
the return code of the function to the exit code of modpost, as
check_exports() etc. already does. This is a good manner in general
because we should display as many error messages as possible in a
single run of modpost.

What is annoying about fatal() is that it kills modpost at the first
error. People would need to run Kbuild again and again until they fix
all errors.

But, unfortunately, people tend to do:
"This case should not be allowed. Let's replace warn() with fatal()."

One of the reasons is probably it is tedious to manually hoist the error
code to the main() function.

This commit refactors error() so any single call for it automatically
makes modpost return the error code.

I also added comments in modpost.h for warn(), error(), and fatal().

Please use fatal() only when you have a strong reason to do so.
For example:

  - Memory shortage (i.e. malloc() etc. has failed)
  - The ELF file is broken, and there is no point to continue parsing
  - Something really odd has happened

For general coding errors, please use error().

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Quentin Perret <qperret@google.com>
2020-12-21 13:57:08 +09:00
Masahiro Yamada bc72d723ec modpost: rename merror() to error()
The log function names, warn(), merror(), fatal() are inconsistent.

Commit 2a11665945 ("kbuild: distinguish between errors and warnings
in modpost") intentionally chose merror() to avoid the conflict with
the library function error(). See man page of error(3).

But, we are already causing the conflict with warn() because it is also
a library function. See man page of warn(3). err() would be a problem
for the same reason.

The common technique to work around name conflicts is to use macros.
For example:

    /* in a header */
    #define error(fmt, ...)  __error(fmt, ##__VA_ARGS__)
    #define warn(fmt, ...)   __warn(fmt, ##__VA_ARGS__)

    /* function definition */
    void __error(const char *fmt, ...)
    {
            <our implementation>
    }

    void __warn(const char *fmt, ...)
    {
            <our implementation>
    }

In this way, we can implement our own warn() and error(), still we can
include <error.h> and <err.h> with no problem.

And, commit 93c95e526a ("modpost: rework and consolidate logging
interface") already did that.

Since the log functions are all macros, we can use error() without
causing "conflicting types" errors.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-12-21 13:57:08 +09:00
Joe Perches 33def8498f treewide: Convert macro and uses of __section(foo) to __section("foo")
Use a more generic form for __section that requires quotes to avoid
complications with clang and gcc differences.

Remove the quote operator # from compiler_attributes.h __section macro.

Convert all unquoted __section(foo) uses to quoted __section("foo").
Also convert __attribute__((section("foo"))) uses to __section("foo")
even if the __attribute__ has multiple list entry forms.

Conversion done using the script at:

    https://lore.kernel.org/lkml/75393e5ddc272dc7403de74d645e6c6e0f4e70eb.camel@perches.com/2-convert_section.pl

Signed-off-by: Joe Perches <joe@perches.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@gooogle.com>
Reviewed-by: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-10-25 14:51:49 -07:00
Wolfram Sang 6020db504c modpost: explain why we can't use strsep
Mention why we open-code strsep, so it is clear that it is intentional.

Fixes: 736bb11898 ("modpost: remove use of non-standard strsep() in HOSTCC code")
Signed-off-by: Wolfram Sang <wsa@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-07-27 13:38:38 +09:00
H. Nikolaus Schaller 736bb11898 modpost: remove use of non-standard strsep() in HOSTCC code
strsep() is neither standard C nor POSIX and used outside
the kernel code here. Using it here requires that the
build host supports it out of the box which is e.g.
not true for a Darwin build host and using a cross-compiler.
This leads to:

scripts/mod/modpost.c:145:2: warning: implicit declaration of function 'strsep' [-Wimplicit-function-declaration]
  return strsep(stringp, "\n");
  ^

and a segfault when running MODPOST.

See also: https://stackoverflow.com/a/7219504

So let's replace this by strchr() instead of using strsep().
It does not hurt kernel size or speed since this code is run
on the build host.

Fixes: ac5100f543 ("modpost: add read_text_file() and get_line() helpers")
Co-developed-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-07-07 11:21:00 +09:00
Linus Torvalds cff11abeca Kbuild updates for v5.8
- fix warnings in 'make clean' for ARCH=um, hexagon, h8300, unicore32
 
  - ensure to rebuild all objects when the compiler is upgraded
 
  - exclude system headers from dependency tracking and fixdep processing
 
  - fix potential bit-size mismatch between the kernel and BPF user-mode
    helper
 
  - add the new syntax 'userprogs' to build user-space programs for the
    target architecture (the same arch as the kernel)
 
  - compile user-space sample code under samples/ for the target arch
    instead of the host arch
 
  - make headers_install fail if a CONFIG option is leaked to user-space
 
  - sanitize the output format of scripts/checkstack.pl
 
  - handle ARM 'push' instruction in scripts/checkstack.pl
 
  - error out before modpost if a module name conflict is found
 
  - error out when multiple directories are passed to M= because this
    feature is broken for a long time
 
  - add CONFIG_DEBUG_INFO_COMPRESSED to support compressed debug info
 
  - a lot of cleanups of modpost
 
  - dump vmlinux symbols out into vmlinux.symvers, and reuse it in the
    second pass of modpost
 
  - do not run the second pass of modpost if nothing in modules is updated
 
  - install modules.builtin(.modinfo) by 'make install' as well as by
    'make modules_install' because it is useful even when CONFIG_MODULES=n
 
  - add new command line variables, GZIP, BZIP2, LZOP, LZMA, LZ4, and XZ
    to allow users to use alternatives such as pigz, pbzip2, etc.
 -----BEGIN PGP SIGNATURE-----
 
 iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAl7brm0VHG1hc2FoaXJv
 eUBrZXJuZWwub3JnAAoJED2LAQed4NsGjeEP/Rrf8H9cp/Tq+ALQCBycI3W5ZEHg
 n2EqprZkVP2MlOV0d+8b9t4PdZf6E5Wmfv26sMaBAhl6X1KQI/0NgPMnTINvy5jJ
 Q2SMhj9y8Gwr3XKFu9Hd/0U+Sax5rz+LmY84tdF95dXzPIUWjAEVnbmN+ofY6T++
 sNf2YGNFSR6iiqr3uCYA0hHZmpKlfhVgDPAdncWa5aadSsuQb79nZQWefGeVEsuD
 HrISpwnkhBc0qY1xyWry6agE92xWmkNkdjKq6A7peguZL02XySWLRWjyHoiiaPOB
 6U4urKs/NSXqPgxGxwZthhwERHryC3+g4s8wRBDKE6ISRWKBBA2ruHpgdF5h/utu
 re1ZP2qRcAt8NBFynr4MEb2AU0mYkv7iEgfLJ7NUCRlMOtqrn5RFwnS4r8ReyQp5
 1UM11RbPhYgYjM5g9hBHJ7nK944/kfvy1/4jF4I1+M5O7QL6f00pu3r2bBIa/65g
 DWrNOpIliKG27GgnRlxi7HgLfxs9etFcXTpHO0ymgnMmlz+7FQsdceR9qqybGU9o
 yBWw6zculMQjb3E+k0DTnE5kLWsycbua921wxM9ABSxRmJi7WciNF73RdLUIBoAY
 VUbwrP2aIpdL+2uyX6RqdTaWzEBpW8omszr46aQ96pX+RiqMrPvJRLaA/tr3ZH8g
 tdHenJPWdHSaOcO4
 =GKe5
 -----END PGP SIGNATURE-----

Merge tag 'kbuild-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:

 - fix warnings in 'make clean' for ARCH=um, hexagon, h8300, unicore32

 - ensure to rebuild all objects when the compiler is upgraded

 - exclude system headers from dependency tracking and fixdep processing

 - fix potential bit-size mismatch between the kernel and BPF user-mode
   helper

 - add the new syntax 'userprogs' to build user-space programs for the
   target architecture (the same arch as the kernel)

 - compile user-space sample code under samples/ for the target arch
   instead of the host arch

 - make headers_install fail if a CONFIG option is leaked to user-space

 - sanitize the output format of scripts/checkstack.pl

 - handle ARM 'push' instruction in scripts/checkstack.pl

 - error out before modpost if a module name conflict is found

 - error out when multiple directories are passed to M= because this
   feature is broken for a long time

 - add CONFIG_DEBUG_INFO_COMPRESSED to support compressed debug info

 - a lot of cleanups of modpost

 - dump vmlinux symbols out into vmlinux.symvers, and reuse it in the
   second pass of modpost

 - do not run the second pass of modpost if nothing in modules is
   updated

 - install modules.builtin(.modinfo) by 'make install' as well as by
   'make modules_install' because it is useful even when
   CONFIG_MODULES=n

 - add new command line variables, GZIP, BZIP2, LZOP, LZMA, LZ4, and XZ
   to allow users to use alternatives such as pigz, pbzip2, etc.

* tag 'kbuild-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (96 commits)
  kbuild: add variables for compression tools
  Makefile: install modules.builtin even if CONFIG_MODULES=n
  mksysmap: Fix the mismatch of '.L' symbols in System.map
  kbuild: doc: rename LDFLAGS to KBUILD_LDFLAGS
  modpost: change elf_info->size to size_t
  modpost: remove is_vmlinux() helper
  modpost: strip .o from modname before calling new_module()
  modpost: set have_vmlinux in new_module()
  modpost: remove mod->skip struct member
  modpost: add mod->is_vmlinux struct member
  modpost: remove is_vmlinux() call in check_for_{gpl_usage,unused}()
  modpost: remove mod->is_dot_o struct member
  modpost: move -d option in scripts/Makefile.modpost
  modpost: remove -s option
  modpost: remove get_next_text() and make {grab,release_}file static
  modpost: use read_text_file() and get_line() for reading text files
  modpost: avoid false-positive file open error
  modpost: fix potential mmap'ed file overrun in get_src_version()
  modpost: add read_text_file() and get_line() helpers
  modpost: do not call get_modinfo() for vmlinux(.o)
  ...
2020-06-06 12:00:25 -07:00
Masahiro Yamada 3b09efc4f0 modpost: change elf_info->size to size_t
Align with the mmap / munmap APIs.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:20 +09:00
Masahiro Yamada 4de7b62936 modpost: remove is_vmlinux() helper
Now that is_vmlinux() is called only in new_module(), we can inline
the function call.

modname is the basename with '.o' is stripped. No need to compare it
with 'vmlinux.o'.

vmlinux is always located at the current working directory. No need
to strip the directory path.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:20 +09:00
Masahiro Yamada a82f794c41 modpost: strip .o from modname before calling new_module()
new_module() conditionally strips the .o because the modname has .o
suffix when it is called from read_symbols(), but no .o when it is
called from read_dump().

It is clearer to strip .o in read_symbols().

I also used flexible-array for mod->name.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:20 +09:00
Masahiro Yamada 858b937d28 modpost: set have_vmlinux in new_module()
Set have_vmlinux flag in a single place.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:20 +09:00
Masahiro Yamada 0b19d54cae modpost: remove mod->skip struct member
The meaning of 'skip' is obscure since it does not explain
"what to skip".

mod->skip is set when it is vmlinux or the module info came from
a dump file.

So, mod->skip is equivalent to (mod->is_vmlinux || mod->from_dump).

For the check in write_namespace_deps_files(), mod->is_vmlinux is
unneeded because the -d option is not passed in the first pass of
modpost.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:20 +09:00
Masahiro Yamada 5a438af9db modpost: add mod->is_vmlinux struct member
is_vmlinux() is called in several places to check whether the current
module is vmlinux or not.

It is faster and clearer to check mod->is_vmlinux flag.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:39:19 +09:00
Masahiro Yamada 1be5fa6c94 modpost: remove is_vmlinux() call in check_for_{gpl_usage,unused}()
check_exports() is never called for vmlinux because mod->skip is set
for vmlinux.

Hence, check_for_gpl_usage() and check_for_unused() are not called
for vmlinux, either. is_vmlinux() is always false here.

Remove the is_vmlinux() calls, and hard-code the ".ko" suffix.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:13 +09:00
Masahiro Yamada 3379576dd6 modpost: remove mod->is_dot_o struct member
Previously, there were two cases where mod->is_dot_o is unset:

[1] the executable 'vmlinux' in the second pass of modpost
[2] modules loaded by read_dump()

I think [1] was intended usage to distinguish 'vmlinux.o' and 'vmlinux'.
Now that modpost does not parse the executable 'vmlinux', this case
does not happen.

[2] is obscure, maybe a bug. Module.symver stores module paths without
extension. So, none of modules loaded by read_dump() has the .o suffix,
and new_module() unsets ->is_dot_o. Anyway, it is not a big deal because
handle_symbol() is not called for the case.

To sum up, all the parsed ELF files are .o files.

mod->is_dot_o is unneeded.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:13 +09:00
Masahiro Yamada 467b82d7ce modpost: remove -s option
The -s option was added by commit 8d8d8289df ("kbuild: do not do
section mismatch checks on vmlinux in 2nd pass").

Now that the second pass does not parse vmlinux, this option is
unneeded.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:13 +09:00
Masahiro Yamada 75893572d4 modpost: remove get_next_text() and make {grab,release_}file static
get_next_line() is no longer used. Remove.

grab_file() and release_file() are only used in modpost.c. Make them
static.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:13 +09:00
Masahiro Yamada 70f30cfe5b modpost: use read_text_file() and get_line() for reading text files
grab_file() mmaps a file, but it is not so efficient here because
get_next_line() copies every line to the temporary buffer anyway.

read_text_file() and get_line() are simpler. get_line() exploits the
library function strchr().

Going forward, the missing *.symvers or *.cmd is a fatal error.
This should not happen because scripts/Makefile.modpost guards the
-i option files with $(wildcard $(input-symdump)).

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:13 +09:00
Masahiro Yamada ac5100f543 modpost: add read_text_file() and get_line() helpers
modpost uses grab_file() to open a file, but it is not suitable for
a text file because the mmap'ed file is not terminated by null byte.
Actually, I see some issues for the use of grab_file().

The new helper, read_text_file() loads the whole file content into a
malloc'ed buffer, and appends a null byte. Then, get_line() reads
each line.

To handle text files, I intend to replace as follows:

  grab_file()    -> read_text_file()
  get_new_line() -> get_line()

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada 4ddea2f8e8 modpost: do not call get_modinfo() for vmlinux(.o)
The three calls of get_modinfo() ("license", "import_ns", "version")
always return NULL for vmlinux(.o) because the built-in module info is
prefixed with __MODULE_INFO_PREFIX.

It is harmless to call get_modinfo(), but there is no point to search
for what apparently does not exist.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada f693153519 modpost: drop RCS/CVS $Revision handling in MODULE_VERSION()
As far as I understood, this code gets rid of '$Revision$' or '$Revision:'
of CVS, RCS or whatever in MODULE_VERSION() tags.

Remove the primeval code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada 7e8a323582 modpost: show warning if vmlinux is not found when processing modules
check_exports() does not print warnings about unresolved symbols if
vmlinux is missing because there would be too many.

This situation happens when you do 'make modules' from the clean
tree, or compile external modules against a kernel tree that has
not been completely built.

It is dangerous to not check unresolved symbols because you might be
building useless modules. At least it should be warned.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada 436b2ac603 modpost: invoke modpost only when input files are updated
Currently, the second pass of modpost is always invoked when you run
'make' or 'make modules' even if none of modules is changed.

Use if_changed to invoke it only when it is necessary.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada e3fb4df7fe modpost: re-add -e to set external_module flag
Previously, the -i option had two functions; load a symbol dump file,
and set the external_module flag.

I want to assign a dedicate option for each of them.

Going forward, the -i is used to load a symbol dump file, and the -e
to set the external_module flag.

With this, we will be able to use -i for loading in-kernel symbols.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada 7924799ed2 modpost: rename ext_sym_list to dump_list
The -i option is used to include Modules.symver as well as files from
$(KBUILD_EXTRA_SYMBOLS).

Make the struct and variable names more generic.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada ce2ddd6d6a modpost: allow to pass -i option multiple times to remove -e option
Now that there is no difference between -i and -e, they can be unified.

Make modpost accept the -i option multiple times, then remove -e.

I will reuse -e for a different purpose.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:38:12 +09:00
Masahiro Yamada 52c3416db0 modpost: track if the symbol origin is a dump file or ELF object
The meaning of sym->kernel is obscure; it is set for in-kernel symbols
loaded from Modules.symvers. This happens only when we are building
external modules, and it is used to determine whether to dump symbols
to $(KBUILD_EXTMOD)/Modules.symvers

It is clearer to remember whether the symbol or module came from a dump
file or ELF object.

This changes the KBUILD_EXTRA_SYMBOLS behavior. Previously, symbols
loaded from KBUILD_EXTRA_SYMBOLS are accumulated into the current
$(KBUILD_EXTMOD)/Modules.symvers

Going forward, they will be only used to check symbol references, but
not dumped into the current $(KBUILD_EXTMOD)/Modules.symvers. I believe
this makes more sense.

sym->vmlinux will have no user. Remove it too.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-06 23:36:55 +09:00
Linus Torvalds cb8e59cc87 Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
Pull networking updates from David Miller:

 1) Allow setting bluetooth L2CAP modes via socket option, from Luiz
    Augusto von Dentz.

 2) Add GSO partial support to igc, from Sasha Neftin.

 3) Several cleanups and improvements to r8169 from Heiner Kallweit.

 4) Add IF_OPER_TESTING link state and use it when ethtool triggers a
    device self-test. From Andrew Lunn.

 5) Start moving away from custom driver versions, use the globally
    defined kernel version instead, from Leon Romanovsky.

 6) Support GRO vis gro_cells in DSA layer, from Alexander Lobakin.

 7) Allow hard IRQ deferral during NAPI, from Eric Dumazet.

 8) Add sriov and vf support to hinic, from Luo bin.

 9) Support Media Redundancy Protocol (MRP) in the bridging code, from
    Horatiu Vultur.

10) Support netmap in the nft_nat code, from Pablo Neira Ayuso.

11) Allow UDPv6 encapsulation of ESP in the ipsec code, from Sabrina
    Dubroca. Also add ipv6 support for espintcp.

12) Lots of ReST conversions of the networking documentation, from Mauro
    Carvalho Chehab.

13) Support configuration of ethtool rxnfc flows in bcmgenet driver,
    from Doug Berger.

14) Allow to dump cgroup id and filter by it in inet_diag code, from
    Dmitry Yakunin.

15) Add infrastructure to export netlink attribute policies to
    userspace, from Johannes Berg.

16) Several optimizations to sch_fq scheduler, from Eric Dumazet.

17) Fallback to the default qdisc if qdisc init fails because otherwise
    a packet scheduler init failure will make a device inoperative. From
    Jesper Dangaard Brouer.

18) Several RISCV bpf jit optimizations, from Luke Nelson.

19) Correct the return type of the ->ndo_start_xmit() method in several
    drivers, it's netdev_tx_t but many drivers were using
    'int'. From Yunjian Wang.

20) Add an ethtool interface for PHY master/slave config, from Oleksij
    Rempel.

21) Add BPF iterators, from Yonghang Song.

22) Add cable test infrastructure, including ethool interfaces, from
    Andrew Lunn. Marvell PHY driver is the first to support this
    facility.

23) Remove zero-length arrays all over, from Gustavo A. R. Silva.

24) Calculate and maintain an explicit frame size in XDP, from Jesper
    Dangaard Brouer.

25) Add CAP_BPF, from Alexei Starovoitov.

26) Support terse dumps in the packet scheduler, from Vlad Buslov.

27) Support XDP_TX bulking in dpaa2 driver, from Ioana Ciornei.

28) Add devm_register_netdev(), from Bartosz Golaszewski.

29) Minimize qdisc resets, from Cong Wang.

30) Get rid of kernel_getsockopt and kernel_setsockopt in order to
    eliminate set_fs/get_fs calls. From Christoph Hellwig.

* git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (2517 commits)
  selftests: net: ip_defrag: ignore EPERM
  net_failover: fixed rollback in net_failover_open()
  Revert "tipc: Fix potential tipc_aead refcnt leak in tipc_crypto_rcv"
  Revert "tipc: Fix potential tipc_node refcnt leak in tipc_rcv"
  vmxnet3: allow rx flow hash ops only when rss is enabled
  hinic: add set_channels ethtool_ops support
  selftests/bpf: Add a default $(CXX) value
  tools/bpf: Don't use $(COMPILE.c)
  bpf, selftests: Use bpf_probe_read_kernel
  s390/bpf: Use bcr 0,%0 as tail call nop filler
  s390/bpf: Maintain 8-byte stack alignment
  selftests/bpf: Fix verifier test
  selftests/bpf: Fix sample_cnt shared between two threads
  bpf, selftests: Adapt cls_redirect to call csum_level helper
  bpf: Add csum_level helper for fixing up csum levels
  bpf: Fix up bpf_skb_adjust_room helper's skb csum setting
  sfc: add missing annotation for efx_ef10_try_update_nic_stats_vf()
  crypto/chtls: IPv6 support for inline TLS
  Crypto/chcr: Fixes a coccinile check error
  Crypto/chcr: Fixes compilations warnings
  ...
2020-06-03 16:27:18 -07:00
Masahiro Yamada 2beee86899 modpost: load KBUILD_EXTRA_SYMBOLS files in order
Currently, modpost reads extra symbol dump files in the reverse order.
If '-e foo -e bar' is given, modpost reads bar, foo, in this order.

This is probably not a big deal, but there is no good reason to reverse
the order. Read files in the given order.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-06-03 13:22:18 +09:00
Masahiro Yamada 565587d8d5 modpost: refactor sech_name()
Use sym_get_data_by_offset() helper to get access to the .shstrtab
section data. No functional change is intended because
elf->sechdrs[elf->secindex_strings].sh_addr is 0 for both ET_REL
and ET_EXEC object types.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-05-29 03:08:49 +09:00
Masahiro Yamada d2e4d05cf1 modpost: fix potential segmentation fault for addend_i386_rel()
This may not be a practical problem, but the second pass of ARCH=i386
modpost causes segmentation fault if the -s option is not passed.

    MODPOST 12 modules
  Segmentation fault (core dumped)
  make[2]: *** [scripts/Makefile.modpost:94: __modpost] Error 139
  make[1]: *** [Makefile:1339: modules] Error 2
  make[1]: *** Waiting for unfinished jobs....

The segmentation fault occurs when section_rel() is called for vmlinux,
which is untested in regular builds. The cause of the problem is
reloc_location() returning a wrong pointer for ET_EXEC object type.
In this case, you need to subtract sechdr->sh_addr, otherwise it would
get access beyond the mmap'ed memory.

Add sym_get_data_by_offset() helper to avoid code duplication.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-05-29 03:08:49 +09:00
Gustavo A. R. Silva 859c817501 modpost,fixdep: Replace zero-length array with flexible-array
The current codebase makes use of the zero-length array language
extension to the C90 standard, but the preferred mechanism to declare
variable-length types such as these ones is a flexible array member[1][2],
introduced in C99:

struct foo {
        int stuff;
        struct boo array[];
};

By making use of the mechanism above, we will get a compiler warning
in case the flexible array does not occur last in the structure, which
will help us prevent some kind of undefined behavior bugs from being
inadvertently introduced[3] to the codebase from now on.

Also, notice that, dynamic memory allocations won't be affected by
this change:

"Flexible array members have incomplete type, and so the sizeof operator
may not be applied. As a quirk of the original implementation of
zero-length arrays, sizeof evaluates to zero."[1]

sizeof(flexible-array-member) triggers a warning because flexible array
members have incomplete type[1]. There are some instances of code in
which the sizeof operator is being incorrectly/erroneously applied to
zero-length arrays and the result is zero. Such instances may be hiding
some bugs. So, this work (flexible-array member conversions) will also
help to get completely rid of those sorts of issues.

This issue was found with the help of Coccinelle.

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 7649773293 ("cxgb3/l2t: Fix undefined behaviour")

Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-05-26 00:03:16 +09:00
Thomas Gleixner 6553896666 vmlinux.lds.h: Create section for protection against instrumentation
Some code pathes, especially the low level entry code, must be protected
against instrumentation for various reasons:

 - Low level entry code can be a fragile beast, especially on x86.

 - With NO_HZ_FULL RCU state needs to be established before using it.

Having a dedicated section for such code allows to validate with tooling
that no unsafe functions are invoked.

Add the .noinstr.text section and the noinstr attribute to mark
functions. noinstr implies notrace. Kprobes will gain a section check
later.

Provide also a set of markers: instrumentation_begin()/end()

These are used to mark code inside a noinstr function which calls
into regular instrumentable text section as safe.

The instrumentation markers are only active when CONFIG_DEBUG_ENTRY is
enabled as the end marker emits a NOP to prevent the compiler from merging
the annotation points. This means the objtool verification requires a
kernel compiled with this option.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200505134100.075416272@linutronix.de
2020-05-19 15:47:20 +02:00
Leon Romanovsky 51161bfc66 kernel/module: Hide vermagic header file from general use
VERMAGIC* definitions are not supposed to be used by the drivers,
see this [1] bug report, so introduce special define to guard inclusion
of this header file and define it in kernel/modules.h and in internal
script that generates *.mod.c files.

In-tree module build:
➜  kernel git:(vermagic) ✗ make clean
➜  kernel git:(vermagic) ✗ make M=drivers/infiniband/hw/mlx5
➜  kernel git:(vermagic) ✗ modinfo drivers/infiniband/hw/mlx5/mlx5_ib.ko
filename:	/images/leonro/src/kernel/drivers/infiniband/hw/mlx5/mlx5_ib.ko
<...>
vermagic:       5.6.0+ SMP mod_unload modversions

Out-of-tree module build:
➜  mlx5 make -C /images/leonro/src/kernel clean M=/tmp/mlx5
➜  mlx5 make -C /images/leonro/src/kernel M=/tmp/mlx5
➜  mlx5 modinfo /tmp/mlx5/mlx5_ib.ko
filename:       /tmp/mlx5/mlx5_ib.ko
<...>
vermagic:       5.6.0+ SMP mod_unload modversions

[1] https://lore.kernel.org/lkml/20200411155623.GA22175@zn.tnic
Reported-by: Borislav Petkov <bp@suse.de>
Acked-by: Borislav Petkov <bp@suse.de>
Acked-by: Jessica Yu <jeyu@kernel.org>
Co-developed-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-04-21 13:27:37 -07:00
Linus Torvalds 5b67fbfc32 Kbuild updates for v5.7
[Build system]
 
  - add CONFIG_UNUSED_KSYMS_WHITELIST, which will be useful to define
    a fixed set of export symbols for Generic Kernel Image (GKI)
 
  - allow to run 'make dt_binding_check' without .config
 
  - use full schema for checking DT examples in *.yaml files
 
  - make modpost fail for missing MODULE_IMPORT_NS(), which makes more
    sense because we know the produced modules are never loadable
 
  - Remove unused 'AS' variable
 
 [Kconfig]
 
  - sanitize DEFCONFIG_LIST, and remove ARCH_DEFCONFIG from Kconfig files
 
  - relax the 'imply' behavior so that symbols implied by y can become m
 
  - make 'imply' obey 'depends on' in order to make 'imply' really weak
 
 [Misc]
 
  - add documentation on building the kernel with Clang/LLVM
 
  - revive __HAVE_ARCH_STRLEN for 32bit sparc to use optimized strlen()
 
  - fix warning from deb-pkg builds when CONFIG_DEBUG_INFO=n
 
  - various script and Makefile cleanups
 -----BEGIN PGP SIGNATURE-----
 
 iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAl6DbP8VHG1hc2FoaXJv
 eUBrZXJuZWwub3JnAAoJED2LAQed4NsGAfkQALZqMCqtX9cAJej04+lnBCzwVPep
 6s8/s6vW6PF92sHv+SJtHvKSnDekcZT2xT8dkPDaVmuOye8xhENs5dFZ4tSKO5D0
 F8YkkM17mu/cylNZ2UCy/8weh6/TjsD7pa+mFqWo/++30JiXm12v3mVFR568KPXI
 kFau/3ALvY1NIr2wUAI2SOd6A4v/Epzpk0ltnFg3f5iWVFKlE03MGueAF+YZzq7v
 UrU73HdUxF/SBW2Jz3UtV9XY8P38uQmmtoDE8SZikG4PjW03q9w6pnhntDBl/H2b
 dZFg40eG7SHXN4L+OOI32ae9jePHvKpsnjeaeNoT/DZpwpuuxXu7C2EmUy+wCAnM
 Rw4+kiAVNppRMRH1GTdp1XjLY6PwPqizzZGmufwX+W3MI8oZdlLSUJLbrO73P/aF
 QR3MgkJkjvgmRVPP9fr8SNcZ39tDGI4KqLdWvjVVSC/s86aDnw/34puEfw0lj4vs
 gCi923iJQ7Y/QWX63TYZhy96pnedlwE2s6aR1InVER3+XMH9K1nW34CDaKQsp1CB
 6zyrd40+K5ETOKo3OAjq4FttlhRkEpX9nIsffCzOz6tybysHTSrCzYhfjpIAzzYj
 Et5HpXbegHShIqN44yqBumt6YkTZac6Aub9FzInW2LPzZgiofDaNesDQmnQmIZOa
 JlUyBrjXRfwkvCH0
 =wT8A
 -----END PGP SIGNATURE-----

Merge tag 'kbuild-v5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:
 "Build system:

   - add CONFIG_UNUSED_KSYMS_WHITELIST, which will be useful to define a
     fixed set of export symbols for Generic Kernel Image (GKI)

   - allow to run 'make dt_binding_check' without .config

   - use full schema for checking DT examples in *.yaml files

   - make modpost fail for missing MODULE_IMPORT_NS(), which makes more
     sense because we know the produced modules are never loadable

   - Remove unused 'AS' variable

  Kconfig:

   - sanitize DEFCONFIG_LIST, and remove ARCH_DEFCONFIG from Kconfig
     files

   - relax the 'imply' behavior so that symbols implied by 'y' can
     become 'm'

   - make 'imply' obey 'depends on' in order to make 'imply' really weak

  Misc:

   - add documentation on building the kernel with Clang/LLVM

   - revive __HAVE_ARCH_STRLEN for 32bit sparc to use optimized strlen()

   - fix warning from deb-pkg builds when CONFIG_DEBUG_INFO=n

   - various script and Makefile cleanups"

* tag 'kbuild-v5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (34 commits)
  Makefile: Update kselftest help information
  kbuild: deb-pkg: fix warning when CONFIG_DEBUG_INFO is unset
  kbuild: add outputmakefile to no-dot-config-targets
  kbuild: remove AS variable
  net: wan: wanxl: refactor the firmware rebuild rule
  net: wan: wanxl: use $(M68KCC) instead of $(M68KAS) for rebuilding firmware
  net: wan: wanxl: use allow to pass CROSS_COMPILE_M68k for rebuilding firmware
  kbuild: add comment about grouped target
  kbuild: add -Wall to KBUILD_HOSTCXXFLAGS
  kconfig: remove unused variable in qconf.cc
  sparc: revive __HAVE_ARCH_STRLEN for 32bit sparc
  kbuild: refactor Makefile.dtbinst more
  kbuild: compute the dtbs_install destination more simply
  Makefile: disallow data races on gcc-10 as well
  kconfig: make 'imply' obey the direct dependency
  kconfig: allow symbols implied by y to become m
  net: drop_monitor: use IS_REACHABLE() to guard net_dm_hw_report()
  modpost: return error if module is missing ns imports and MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n
  modpost: rework and consolidate logging interface
  kbuild: allow to run dt_binding_check without kernel configuration
  ...
2020-03-31 16:03:39 -07:00
Linus Torvalds dbb381b619 timekeeping and timer updates:
Core:
 
   - Consolidation of the vDSO build infrastructure to address the
     difficulties of cross-builds for ARM64 compat vDSO libraries by
     restricting the exposure of header content to the vDSO build.
 
     This is achieved by splitting out header content into separate
     headers. which contain only the minimaly required information which is
     necessary to build the vDSO. These new headers are included from the
     kernel headers and the vDSO specific files.
 
   - Enhancements to the generic vDSO library allowing more fine grained
     control over the compiled in code, further reducing architecture
     specific storage and preparing for adopting the generic library by PPC.
 
   - Cleanup and consolidation of the exit related code in posix CPU timers.
 
   - Small cleanups and enhancements here and there
 
  Drivers:
 
   - The obligatory new drivers: Ingenic JZ47xx and X1000 TCU support
 
   - Correct the clock rate of PIT64b global clock
 
   - setup_irq() cleanup
 
   - Preparation for PWM and suspend support for the TI DM timer
 
   - Expand the fttmr010 driver to support ast2600 systems
 
   - The usual small fixes, enhancements and cleanups all over the place
 -----BEGIN PGP SIGNATURE-----
 
 iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl6B+QETHHRnbHhAbGlu
 dXRyb25peC5kZQAKCRCmGPVMDXSYofJ5D/94s5fpaqiuNcaAsLq2D3DRIrTnqxx7
 yEeAOPcbYV1bM1SgY/M83L5yGc2S8ny787e26abwRTCZhZV3eAmRTphIFFIZR0Xk
 xS+i67odscbdJTRtztKj3uQ9rFxefszRuphyaa89pwSY9nnyMWLcahGSQOGs0LJK
 hvmgwPjyM1drNfPxgPiaFg7vDr2XxNATpQr/FBt+BhelvVan8TlAfrkcNPiLr++Y
 Axz925FP7jMaRRbZ1acji34gLiIAZk0jLCUdbix7YkPrqDB4GfO+v8Vez+fGClbJ
 uDOYeR4r1+Be/BtSJtJ2tHqtsKCcAL6agtaE2+epZq5HbzaZFRvBFaxgFNF8WVcn
 3FFibdEMdsRNfZTUVp5wwgOLN0UIqE/7LifE12oLEL2oFB5H2PiNEUw3E02XHO11
 rL3zgHhB6Ke1sXKPCjSGdmIQLbxZmV5kOlQFy7XuSeo5fmRapVzKNffnKcftIliF
 1HNtZbgdA+3tdxMFCqoo1QX+kotl9kgpslmdZ0qHAbaRb3xqLoSskbqEjFRMuSCC
 8bjJrwboD9T5GPfwodSCgqs/58CaSDuqPFbIjCay+p90Fcg6wWAkZtyG04ZLdPRc
 GgNNdN4gjTD9bnrRi8cH47z1g8OO4vt4K4SEbmjo8IlDW+9jYMxuwgR88CMeDXd7
 hu7aKsr2I2q/WQ==
 =5o9G
 -----END PGP SIGNATURE-----

Merge tag 'timers-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timekeeping and timer updates from Thomas Gleixner:
 "Core:

   - Consolidation of the vDSO build infrastructure to address the
     difficulties of cross-builds for ARM64 compat vDSO libraries by
     restricting the exposure of header content to the vDSO build.

     This is achieved by splitting out header content into separate
     headers. which contain only the minimaly required information which
     is necessary to build the vDSO. These new headers are included from
     the kernel headers and the vDSO specific files.

   - Enhancements to the generic vDSO library allowing more fine grained
     control over the compiled in code, further reducing architecture
     specific storage and preparing for adopting the generic library by
     PPC.

   - Cleanup and consolidation of the exit related code in posix CPU
     timers.

   - Small cleanups and enhancements here and there

  Drivers:

   - The obligatory new drivers: Ingenic JZ47xx and X1000 TCU support

   - Correct the clock rate of PIT64b global clock

   - setup_irq() cleanup

   - Preparation for PWM and suspend support for the TI DM timer

   - Expand the fttmr010 driver to support ast2600 systems

   - The usual small fixes, enhancements and cleanups all over the
     place"

* tag 'timers-core-2020-03-30' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (80 commits)
  Revert "clocksource/drivers/timer-probe: Avoid creating dead devices"
  vdso: Fix clocksource.h macro detection
  um: Fix header inclusion
  arm64: vdso32: Enable Clang Compilation
  lib/vdso: Enable common headers
  arm: vdso: Enable arm to use common headers
  x86/vdso: Enable x86 to use common headers
  mips: vdso: Enable mips to use common headers
  arm64: vdso32: Include common headers in the vdso library
  arm64: vdso: Include common headers in the vdso library
  arm64: Introduce asm/vdso/processor.h
  arm64: vdso32: Code clean up
  linux/elfnote.h: Replace elf.h with UAPI equivalent
  scripts: Fix the inclusion order in modpost
  common: Introduce processor.h
  linux/ktime.h: Extract common header for vDSO
  linux/jiffies.h: Extract common header for vDSO
  linux/time64.h: Extract common header for vDSO
  linux/time32.h: Extract common header for vDSO
  linux/time.h: Extract common header for vDSO
  ...
2020-03-30 18:51:47 -07:00
Vincenzo Frascino f58dd03b11 scripts: Fix the inclusion order in modpost
In the process of creating the source file of a module modpost injects a
set of includes that are not required if the compilation unit is
statically built into the kernel.

The order of inclusion of the headers can cause redefinition problems
(e.g.):

   In file included from include/linux/elf.h:5:0,
                    from include/linux/module.h:18,
                    from crypto/arc4.mod.c:2:
    #define ELF_OSABI  ELFOSABI_LINUX

   In file included from include/linux/elfnote.h:62:0,
                    from include/linux/build-salt.h:4,
                    from crypto/arc4.mod.c:1:
   include/uapi/linux/elf.h:363:0: note: this is the location of
   the previous definition
    #define ELF_OSABI ELFOSABI_NONE

The issue was exposed during the development of the series [1].

[1] https://lore.kernel.org/lkml/20200306133242.26279-1-vincenzo.frascino@arm.com/

Reported-by: kbuild test robot <lkp@intel.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Masahiro Yamada <masahiroy@kernel.org>
Cc: Michal Marek <michal.lkml@markovi.net>
Link: https://lkml.kernel.org/r/20200320145351.32292-17-vincenzo.frascino@arm.com
2020-03-21 15:24:00 +01:00
Xiao Yang 4b8a5cfb5f modpost: Get proper section index by get_secindex() instead of st_shndx
(uint16_t) st_shndx is limited to 65535(i.e. SHN_XINDEX) so sym_get_data() gets
wrong section index by st_shndx if requested symbol contains extended section
index that is more than 65535.  In this case, we need to get proper section index
by .symtab_shndx section.

Module.symvers generated by building kernel with "-ffunction-sections -fdata-sections"
shows the issue.

Fixes: 56067812d5 ("kbuild: modversions: add infrastructure for emitting relative CRCs")
Fixes: e84f9fbbec ("modpost: refactor namespace_from_kstrtabns() to not hard-code section name")
Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-03-19 01:44:25 +09:00
Jessica Yu 5190044c29 modpost: move the namespace field in Module.symvers last
In order to preserve backwards compatability with kmod tools, we have to
move the namespace field in Module.symvers last, as the depmod -e -E
option looks at the first three fields in Module.symvers to check symbol
versions (and it's expected they stay in the original order of crc,
symbol, module).

In addition, update an ancient comment above read_dump() in modpost that
suggested that the export type field in Module.symvers was optional. I
suspect that there were historical reasons behind that comment that are
no longer accurate. We have been unconditionally printing the export
type since 2.6.18 (commit bd5cbcedf4), which is over a decade ago now.

Fix up read_dump() to treat each field as non-optional. I suspect the
original read_dump() code treated the export field as optional in order
to support pre <= 2.6.18 Module.symvers (which did not have the export
type field). Note that although symbol namespaces are optional, the
field will not be omitted from Module.symvers if a symbol does not have
a namespace. In this case, the field will simply be empty and the next
delimiter or end of line will follow.

Cc: stable@vger.kernel.org
Fixes: cb9b55d21f ("modpost: add support for symbol namespaces")
Tested-by: Matthias Maennich <maennich@google.com>
Reviewed-by: Matthias Maennich <maennich@google.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-03-17 08:59:03 +09:00
Jessica Yu 54b7784769 modpost: return error if module is missing ns imports and MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n
Currently when CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, modpost
only warns when a module is missing namespace imports. Under this
configuration, such a module cannot be loaded into the kernel anyway, as
the module loader would reject it. We might as well return a build
error when a module is missing namespace imports under
CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, so that the build
warning does not go ignored/unnoticed.

Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-03-13 10:04:36 +09:00
Jessica Yu 93c95e526a modpost: rework and consolidate logging interface
Rework modpost's logging interface by consolidating merror(), warn(), and
fatal() to use a single function, modpost_log(). Introduce different
logging levels (WARN, ERROR, FATAL) as well. The purpose of this cleanup is
to reduce code duplication when deciding whether or not to warn or error
out based on a condition.

Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
2020-03-13 10:04:36 +09:00
Masahiro Yamada 5370d4acc5 modpost: assume STT_SPARC_REGISTER is defined
Commit 8d5290149e ("[SPARC]: Deal with glibc changing macro names in
modpost.c") was more than 14 years ago. STT_SPARC_REGISTER is hopefully
defined in elf.h of recent C libraries.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: David S. Miller <davem@davemloft.net>
2020-01-16 00:26:22 +09:00
Masahiro Yamada 7ef9ab3b32 modpost: respect the previous export when 'exported twice' is warned
When 'exported twice' is warned, let sym_add_exported() return without
updating the symbol info. This respects the previous export, which is
ordered first in modules.order

This simplifies the code too.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
2019-11-23 15:46:42 +09:00