lkml.org 
[lkml]   [2022]   [Aug]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v5 44/44] x86: kmsan: enable KMSAN builds for x86
    From
    Make KMSAN usable by adding the necessary Kconfig bits.

    Also declare x86-specific functions checking address validity
    in arch/x86/include/asm/kmsan.h.

    Signed-off-by: Alexander Potapenko <glider@google.com>
    ---
    v4:
    -- per Marco Elver's request, create arch/x86/include/asm/kmsan.h
    and move arch-specific inline functions there.

    Link: https://linux-review.googlesource.com/id/I1d295ce8159ce15faa496d20089d953a919c125e
    ---
    arch/x86/Kconfig | 1 +
    arch/x86/include/asm/kmsan.h | 55 ++++++++++++++++++++++++++++++++++++
    2 files changed, 56 insertions(+)
    create mode 100644 arch/x86/include/asm/kmsan.h

    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index 697da8dae1418..bd9436cd0f29b 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -168,6 +168,7 @@ config X86
    select HAVE_ARCH_KASAN if X86_64
    select HAVE_ARCH_KASAN_VMALLOC if X86_64
    select HAVE_ARCH_KFENCE
    + select HAVE_ARCH_KMSAN if X86_64
    select HAVE_ARCH_KGDB
    select HAVE_ARCH_MMAP_RND_BITS if MMU
    select HAVE_ARCH_MMAP_RND_COMPAT_BITS if MMU && COMPAT
    diff --git a/arch/x86/include/asm/kmsan.h b/arch/x86/include/asm/kmsan.h
    new file mode 100644
    index 0000000000000..a790b865d0a68
    --- /dev/null
    +++ b/arch/x86/include/asm/kmsan.h
    @@ -0,0 +1,55 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +/*
    + * x86 KMSAN support.
    + *
    + * Copyright (C) 2022, Google LLC
    + * Author: Alexander Potapenko <glider@google.com>
    + */
    +
    +#ifndef _ASM_X86_KMSAN_H
    +#define _ASM_X86_KMSAN_H
    +
    +#ifndef MODULE
    +
    +#include <asm/processor.h>
    +#include <linux/mmzone.h>
    +
    +/*
    + * Taken from arch/x86/mm/physaddr.h to avoid using an instrumented version.
    + */
    +static inline bool kmsan_phys_addr_valid(unsigned long addr)
    +{
    + if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
    + return !(addr >> boot_cpu_data.x86_phys_bits);
    + else
    + return true;
    +}
    +
    +/*
    + * Taken from arch/x86/mm/physaddr.c to avoid using an instrumented version.
    + */
    +static inline bool kmsan_virt_addr_valid(void *addr)
    +{
    + unsigned long x = (unsigned long)addr;
    + unsigned long y = x - __START_KERNEL_map;
    +
    + /* use the carry flag to determine if x was < __START_KERNEL_map */
    + if (unlikely(x > y)) {
    + x = y + phys_base;
    +
    + if (y >= KERNEL_IMAGE_SIZE)
    + return false;
    + } else {
    + x = y + (__START_KERNEL_map - PAGE_OFFSET);
    +
    + /* carry flag will be set if starting x was >= PAGE_OFFSET */
    + if ((x > y) || !kmsan_phys_addr_valid(x))
    + return false;
    + }
    +
    + return pfn_valid(x >> PAGE_SHIFT);
    +}
    +
    +#endif /* !MODULE */
    +
    +#endif /* _ASM_X86_KMSAN_H */
    --
    2.37.2.672.g94769d06f0-goog
    \
     
     \ /
      Last update: 2022-08-26 17:17    [W:4.058 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site