[PATCH 0/5 v16] KASan for Arm

Ard Biesheuvel ardb at kernel.org
Fri Oct 30 03:58:20 EDT 2020


On Fri, 30 Oct 2020 at 08:57, Nathan Chancellor
<natechancellor at gmail.com> wrote:
>
> On Fri, Oct 30, 2020 at 08:52:53AM +0100, Ard Biesheuvel wrote:
> > On Fri, 30 Oct 2020 at 02:32, Nathan Chancellor
> > <natechancellor at gmail.com> wrote:
> > >
> > > On Thu, Oct 29, 2020 at 05:38:22PM -0700, Nick Desaulniers wrote:
> > > > On Thu, Oct 29, 2020 at 5:29 PM Nathan Chancellor
> > > > <natechancellor at gmail.com> wrote:
> > > > >
> > > > > On Mon, Oct 19, 2020 at 10:41:35AM +0200, Linus Walleij wrote:
> > > > > > This is the 16th and final (knock on wood) version of
> > > > > > KASan for ARM32.
> > > > > >
> > > > > > Changes since v15:
> > > > > >
> > > > > > - Things now work on all boards we have tested on including
> > > > > >   Broadcom and i.MX6Q.
> > > > > >
> > > > > > - Folded in a fix from Ard to PAGE_ALIGN() the end of
> > > > > >   mappings making everything work on all Broadcom board.
> > > > > >
> > > > > > - Folded in a fix from Ahmad Fatoum making things work
> > > > > >   with fortify on i.MX6Q.
> > > > > >
> > > > > > - Testing and testing and testing on build servers.
> > > > > >
> > > > > > - We are good to go.
> > > > > >
> > > > > > I will now put this in Russell's patch tracker for v5.11.
> > > > > >
> > > > > > There is a git branch you can pull in:
> > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-integrator.git/log/?h=kasan
> > > > > >
> > > > > > This branch includes Ard's two patches already in Russell's
> > > > > > patch tracker.
> > > > > >
> > > > > >
> > > > > > Abbott Liu (1):
> > > > > >   ARM: Define the virtual space of KASan's shadow region
> > > > > >
> > > > > > Andrey Ryabinin (3):
> > > > > >   ARM: Disable KASan instrumentation for some code
> > > > > >   ARM: Replace string mem* functions for KASan
> > > > > >   ARM: Enable KASan for ARM
> > > > > >
> > > > > > Linus Walleij (1):
> > > > > >   ARM: Initialize the mapping of KASan shadow memory
> > > > > >
> > > > > >  Documentation/arm/memory.rst                  |   5 +
> > > > > >  Documentation/dev-tools/kasan.rst             |   4 +-
> > > > > >  .../features/debug/KASAN/arch-support.txt     |   2 +-
> > > > > >  arch/arm/Kconfig                              |  10 +
> > > > > >  arch/arm/boot/compressed/Makefile             |   1 +
> > > > > >  arch/arm/boot/compressed/string.c             |  19 ++
> > > > > >  arch/arm/include/asm/kasan.h                  |  33 ++
> > > > > >  arch/arm/include/asm/kasan_def.h              |  81 +++++
> > > > > >  arch/arm/include/asm/memory.h                 |   5 +
> > > > > >  arch/arm/include/asm/pgalloc.h                |   8 +-
> > > > > >  arch/arm/include/asm/string.h                 |  26 ++
> > > > > >  arch/arm/include/asm/thread_info.h            |   8 +
> > > > > >  arch/arm/include/asm/uaccess-asm.h            |   2 +-
> > > > > >  arch/arm/kernel/entry-armv.S                  |   3 +-
> > > > > >  arch/arm/kernel/entry-common.S                |   9 +-
> > > > > >  arch/arm/kernel/head-common.S                 |   7 +-
> > > > > >  arch/arm/kernel/setup.c                       |   2 +
> > > > > >  arch/arm/kernel/unwind.c                      |   6 +-
> > > > > >  arch/arm/lib/memcpy.S                         |   3 +
> > > > > >  arch/arm/lib/memmove.S                        |   5 +-
> > > > > >  arch/arm/lib/memset.S                         |   3 +
> > > > > >  arch/arm/mm/Makefile                          |   5 +
> > > > > >  arch/arm/mm/kasan_init.c                      | 292 ++++++++++++++++++
> > > > > >  arch/arm/mm/mmu.c                             |  18 ++
> > > > > >  arch/arm/mm/pgd.c                             |  16 +-
> > > > > >  arch/arm/vdso/Makefile                        |   2 +
> > > > > >  26 files changed, 561 insertions(+), 14 deletions(-)
> > > > > >  create mode 100644 arch/arm/include/asm/kasan.h
> > > > > >  create mode 100644 arch/arm/include/asm/kasan_def.h
> > > > > >  create mode 100644 arch/arm/mm/kasan_init.c
> > > > > >
> > > > > > --
> > > > > > 2.26.2
> > > > > >
> > > > >
> > > > > After this series was applied and available in -next, ARCH=arm LLVM=1
> > > > > allyesconfig builds started failing:
> > > > >
> > > > > $ make -skj"$(nproc)" ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KCONFIG_ALLCONFIG=<(echo CONFIG_CPU_BIG_ENDIAN=n) LLVM=1 distclean allyesconfig vmlinux
> > > > > ...
> > > > > ld.lld: error: section: .exit.data is not contiguous with other relro sections
> > > > > ...
> > > > >
> > > > > $ git bisect ld: [3f267ec60b922eff2a5c90d532357a39f155b730] Add linux-next specific files for 20201029
> > > > > # good: [23859ae44402f4d935b9ee548135dd1e65e2cbf4] Merge tag 'trace-v5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
> > > > > git bisect start '3f267ec60b922eff2a5c90d532357a39f155b730' '23859ae44402f4d935b9ee548135dd1e65e2cbf4'
> > > > > # bad: [bfa70a4ea4bfa6f87b58cf8b90b88297389c92b7] Merge remote-tracking branch 'mtd/mtd/next' into master
> > > > > git bisect bad bfa70a4ea4bfa6f87b58cf8b90b88297389c92b7
> > > > > # bad: [37a292dcf77532547f335ed5063d9169031c9b08] Merge remote-tracking branch 'sunxi/sunxi/for-next' into master
> > > > > git bisect bad 37a292dcf77532547f335ed5063d9169031c9b08
> > > > > # good: [e6d922c77db276a16f0b7933c2a9951dc9c0052c] Merge remote-tracking branch 'drm-misc-fixes/for-linux-next-fixes' into master
> > > > > git bisect good e6d922c77db276a16f0b7933c2a9951dc9c0052c
> > > > > # bad: [cbe49fbb8f6c8d29bc1d9a5a9a742ef2c2eb6320] Merge remote-tracking branch 'mvebu/for-next' into master
> > > > > git bisect bad cbe49fbb8f6c8d29bc1d9a5a9a742ef2c2eb6320
> > > > > # bad: [d0e12484e7e1ede73c538744cdbe9439f7335d01] Merge remote-tracking branch 'arm-soc/for-next' into master
> > > > > git bisect bad d0e12484e7e1ede73c538744cdbe9439f7335d01
> > > > > # good: [24a23387c15f34bad2485a9e1c3b7ac6f0fb35a6] Merge branch 'asm-generic-cleanup' into asm-generic
> > > > > git bisect good 24a23387c15f34bad2485a9e1c3b7ac6f0fb35a6
> > > > > # good: [3a8eb4d3421a2ca0f95ac3b1a8f012940d4f0d52] Merge remote-tracking branch 'kbuild/for-next' into master
> > > > > git bisect good 3a8eb4d3421a2ca0f95ac3b1a8f012940d4f0d52
> > > > > # bad: [20f96e606509ee5084690179afe1810b95617a92] Merge branches 'fixes' and 'misc' into for-next
> > > > > git bisect bad 20f96e606509ee5084690179afe1810b95617a92
> > > > > # good: [d6d51a96c7d63b7450860a3037f2d62388286a52] ARM: 9014/2: Replace string mem* functions for KASan
> > > > > git bisect good d6d51a96c7d63b7450860a3037f2d62388286a52
> > > > > # good: [5615f69bc2097452ecc954f5264d784e158d6801] ARM: 9016/2: Initialize the mapping of KASan shadow memory
> > > > > git bisect good 5615f69bc2097452ecc954f5264d784e158d6801
> > > > > # bad: [fc2933c133744305236793025b00c2f7d258b687] ARM: 9020/1: mm: use correct section size macro to describe the FDT virtual address
> > > > > git bisect bad fc2933c133744305236793025b00c2f7d258b687
> > > > > # bad: [421015713b306e47af95d4d61cdfbd96d462e4cb] ARM: 9017/2: Enable KASan for ARM
> > > > > git bisect bad 421015713b306e47af95d4d61cdfbd96d462e4cb
> > > > > # first bad commit: [421015713b306e47af95d4d61cdfbd96d462e4cb] ARM: 9017/2: Enable KASan for ARMog
> > > > >
> > > > > An allyesconfig kernel compiled with clang does not link properly with
> > > > > ld.bfd without a workaround [1], which I do not have time to apply and
> > > > > test now but can later if it is relevant. I have not done any triage on
> > > > > this yet either but I wanted to get the report out in case there is
> > > > > anything obvious.
> > > > >
> > > > > [1]: https://github.com/ClangBuiltLinux/linux/issues/325
> > > >
> > > > relro? smells like:
> > > > https://lore.kernel.org/lkml/20201016175339.2429280-1-ndesaulniers@google.com/T/#u
> > > >
> > >
> > > Huh, did not even realize that the error messages were the same, my bad!
> > >
> > > This issue is simple enough to produce by just adding CONFIG_KASAN=y to
> > > multi_v7_defconfig. I tried adding '-z norelro' to LDFLAGS_vmlinux in
> > > arch/arm/Makefile and it fixes the build error but the resulting kernel
> > > does not boot in QEMU.
> > >
> > > $ make -skj"$(nproc)" ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LLVM=1 distclean defconfig
> > >
> > > $ scripts/config -e KASAN
> > >
> > > $ make -skj"$(nproc)" ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LLVM=1 olddefconfig zImage
> > >
> > > $ ~/cbl/github/boot-utils/boot-qemu.sh -a arm32_v7 -k .
> > > /home/nathan/cbl/github/boot-utils/images/arm/rootfs.cpio.zst: 3176448 bytes
> > > + timeout --foreground 3m unbuffer qemu-system-arm -machine virt -no-reboot -append 'console=ttyAMA0 ' -display none -initrd /home/nathan/cbl/github/boot-utils/images/arm/rootfs.cpio -kernel /home/nathan/src/linux-next/arch/arm/boot/zImage -m 512m -nodefaults -serial mon:stdio
> > > + RET=124
> > > + set +x
> > >
> > > '-z norelro' boots fine without KASAN so I assume there is something up
> > > specifically with KASAN and LLVM for ARM.
> > >
> >
> > How long did you wait for it to boot? Booting a KASAN kernel under
> > QEMU emulation is going to be *very* slow.
>
> The timeout command above is 3m and there was no output from the kernel
> in that amount of time. What kind of time should I be reasonably
> expecting?
>

3 minutes is probably long enough.

Do you see any output with 'earlycon=pl011,0x9000000' added to the
kernel command line?



More information about the linux-arm-kernel mailing list