• John Hubbard's avatar
    selftests/mm: mseal, self_elf: fix missing __NR_mseal · 504d8a5e
    John Hubbard authored
    Patch series "cleanups, fixes, and progress towards avoiding "make
    headers"", v3.
    
    Eventually, once the build succeeds on a sufficiently old distro, the idea
    is to delete $(KHDR_INCLUDES) from the selftests/mm build, and then after
    that, from selftests/lib.mk and all of the other selftest builds.
    
    For now, this series merely achieves a clean build of selftests/mm on a
    not-so-old distro: Ubuntu 23.04.  In other words, after this series is
    applied, it is possible to delete $(KHDR_INCLUDES) from
    selftests/mm/Makefile and the build will still succeed.
    
    1. Add tools/uapi/asm/unistd_[32|x32|64].h files, which include
       definitions of __NR_mseal, and include them (indirectly) from the files
       that use __NR_mseal.  The new files are copied from ./usr/include/asm,
       which is how we have agreed to do this sort of thing, see [1].
    
    2. Add fs.h, similarly created: it was copied directly from a snapshot
       of ./usr/include/linux/fs.h after running "make headers".
    
    3. Add a few selected prctl.h values that the ksm and mdwe tests require.
    
    4. Factor out some common code from mseal_test.c and seal_elf.c, into
       a new mseal_helpers.h file.
    
    5. Remove local __NR_* definitions and checks.
    
    [1] commit e076eaca ("selftests: break the dependency upon local
    header files")
    
    
    This patch (of 6):
    
    The selftests/mm build isn't exactly "broken", according to the current
    documentation, which still claims that one must run "make headers",
    before building the kselftests.  However, according to the new plan to
    get rid of that requirement [1], they are future-broken: attempting to
    build selftests/mm *without* first running "make headers" will fail due
    to not finding __NR_mseal.
    
    Therefore, include asm-generic/unistd.h, which has all of the system
    call numbers that are needed, abstracted across the various CPU arches.
    
    Some explanation in support of this "asm-generic" approach:
    
    For most user space programs, the header file inclusion behaves as per
    this microblaze example, which comes from David Hildenbrand (thanks!):
    
         arch/microblaze/include/asm/unistd.h
             -> #include <uapi/asm/unistd.h>
    
         arch/microblaze/include/uapi/asm/unistd.h
             -> #include <asm/unistd_32.h>
             -> Generated during "make headers"
    
         usr/include/asm/unistd_32.h is generated via
         arch/microblaze/kernel/syscalls/Makefile with the syshdr command.
    
         So we never end up including asm-generic/unistd.h directly on
         microblaze... [2]
    
    However, those programs are installed on a single computer that has a
    single set of asm and kernel headers installed.
    
    In contrast, the kselftests are quite special, because they must
    provide a set of user space programs that:
    
         a) Mostly avoid using the installed (distro) system header files.
    
         b) Build (and run) on all supported CPU architectures
    
         c) Occasionally use symbols that have so new that they have not
            yet been included in the distro's header files.
    
    Doing (a) creates a new problem: how to get a set of cross-platform
    headers that works in all cases.
    
    Fortunately, asm-generic headers solve that one.  Which is why we need
    to use them here--at least, for particularly difficult headers such as
    unistd.h.
    
    The reason this hasn't really come up yet, is that until now, the
    kselftests requirement (which I'm trying to eventually remove) was that
    "make headers" must first be run.  That allowed the selftests to get a
    snapshot of sufficiently new header files that looked just like (and
    conflict with) the installed system headers.
    
    And as an aside, this is also an improvement over past practices of
    simply open-coding in a single (not per-arch) definition of a new
    symbol, directly into the selftest code.
    
    [1] commit e076eaca ("selftests: break the dependency upon local
    header files")
    
    [2] https://lore.kernel.org/all/0b152bea-ccb6-403e-9c57-08ed5e828135@redhat.com/
    
    Link: https://lkml.kernel.org/r/20240618022422.804305-1-jhubbard@nvidia.com
    Link: https://lkml.kernel.org/r/20240618022422.804305-2-jhubbard@nvidia.com
    Fixes: 4926c7a5 ("selftest mm/mseal memory sealing")
    Signed-off-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
    Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
    Cc: Jeff Xu <jeffxu@chromium.org>
    Cc: Andrei Vagin <avagin@google.com>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Kees Cook <kees@kernel.org>
    Cc: Kent Overstreet <kent.overstreet@linux.dev>
    Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
    Cc: Muhammad Usama Anjum <usama.anjum@collabora.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Rich Felker <dalias@libc.org>
    Cc: Shuah Khan <shuah@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    504d8a5e
mseal_test.c 42.2 KB