Andrey Konovalov
bc653c3b74
UPSTREAM: kasan: simplify quarantine_put call site
...
[ Upstream commit c696de9f12 ]
Patch series "kasan: boot parameters for hardware tag-based mode", v4.
=== Overview
Hardware tag-based KASAN mode [1] is intended to eventually be used in
production as a security mitigation. Therefore there's a need for finer
control over KASAN features and for an existence of a kill switch.
This patchset adds a few boot parameters for hardware tag-based KASAN that
allow to disable or otherwise control particular KASAN features, as well
as provides some initial optimizations for running KASAN in production.
There's another planned patchset what will further optimize hardware
tag-based KASAN, provide proper benchmarking and tests, and will fully
enable tag-based KASAN for production use.
Hardware tag-based KASAN relies on arm64 Memory Tagging Extension (MTE)
[2] to perform memory and pointer tagging. Please see [3] and [4] for
detailed analysis of how MTE helps to fight memory safety problems.
The features that can be controlled are:
1. Whether KASAN is enabled at all.
2. Whether KASAN collects and saves alloc/free stacks.
3. Whether KASAN panics on a detected bug or not.
The patch titled "kasan: add and integrate kasan boot parameters" of this
series adds a few new boot parameters.
kasan.mode allows to choose one of three main modes:
- kasan.mode=off - KASAN is disabled, no tag checks are performed
- kasan.mode=prod - only essential production features are enabled
- kasan.mode=full - all KASAN features are enabled
The chosen mode provides default control values for the features mentioned
above. However it's also possible to override the default values by
providing:
- kasan.stacktrace=off/on - enable stacks collection
(default: on for mode=full, otherwise off)
- kasan.fault=report/panic - only report tag fault or also panic
(default: report)
If kasan.mode parameter is not provided, it defaults to full when
CONFIG_DEBUG_KERNEL is enabled, and to prod otherwise.
It is essential that switching between these modes doesn't require
rebuilding the kernel with different configs, as this is required by
the Android GKI (Generic Kernel Image) initiative.
=== Benchmarks
For now I've only performed a few simple benchmarks such as measuring
kernel boot time and slab memory usage after boot. There's an upcoming
patchset which will optimize KASAN further and include more detailed
benchmarking results.
The benchmarks were performed in QEMU and the results below exclude the
slowdown caused by QEMU memory tagging emulation (as it's different from
the slowdown that will be introduced by hardware and is therefore
irrelevant).
KASAN_HW_TAGS=y + kasan.mode=off introduces no performance or memory
impact compared to KASAN_HW_TAGS=n.
kasan.mode=prod (manually excluding tagging) introduces 3% of performance
and no memory impact (except memory used by hardware to store tags)
compared to kasan.mode=off.
kasan.mode=full has about 40% performance and 30% memory impact over
kasan.mode=prod. Both come from alloc/free stack collection.
=== Notes
This patchset is available here:
https://github.com/xairy/linux/tree/up-boot-mte-v4
This patchset is based on v11 of "kasan: add hardware tag-based mode for
arm64" patchset [1].
For testing in QEMU hardware tag-based KASAN requires:
1. QEMU built from master [6] (use "-machine virt,mte=on -cpu max" arguments
to run).
2. GCC version 10.
[1] https://lore.kernel.org/linux-arm-kernel/cover.1606161801.git.andreyknvl@google.com/T/#t
[2] https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/enhancing-memory-safety
[3] https://arxiv.org/pdf/1802.09517.pdf
[4] https://github.com/microsoft/MSRC-Security-Research/blob/master/papers/2020/Security%20analysis%20of%20memory%20tagging.pdf
[5] https://source.android.com/devices/architecture/kernel/generic-kernel-image
[6] https://github.com/qemu/qemu
=== Tags
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
This patch (of 19):
Move get_free_info() call into quarantine_put() to simplify the call site.
No functional changes.
Link: https://lkml.kernel.org/r/cover.1606162397.git.andreyknvl@google.com
Link: https://lkml.kernel.org/r/312d0a3ef92cc6dc4fa5452cbc1714f9393ca239.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Will Deacon <will.deacon@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I16d0738e3a1db7367a43a9b0f52365ba323da504
2021-01-19 21:47:30 -08:00
Vincenzo Frascino
43fe730804
UPSTREAM: kselftest/arm64: check GCR_EL1 after context switch
...
[ Upstream commit 29f0808816 ]
This test is specific to MTE and verifies that the GCR_EL1 register is
context switched correctly.
It spawns 1024 processes and each process spawns 5 threads. Each thread
writes a random setting of GCR_EL1 through the prctl() system call and
reads it back verifying that it is the same. If the values are not the
same it reports a failure.
Note: The test has been extended to verify that even SYNC and ASYNC mode
setting is preserved correctly over context switching.
Link: https://lkml.kernel.org/r/b51a165426e906e7ec8a68d806ef3f8cd92581a6.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Acked-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I19b3e8558a5a9e3672ef87ccef678a298063bd2f
2021-01-19 21:47:30 -08:00
Andrey Konovalov
9c79ff1e23
UPSTREAM: kasan: add documentation for hardware tag-based mode
...
[ Upstream commit 948e32539f ]
Add documentation for hardware tag-based KASAN mode and also add some
clarifications for software tag-based mode.
Link: https://lkml.kernel.org/r/20ed1d387685e89fc31be068f890f070ef9fd5d5.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ia6919bee081bb691d36f47e806cee23d1c7acd71
2021-01-19 21:47:30 -08:00
Andrey Konovalov
ceb619b1dc
UPSTREAM: kasan, arm64: enable CONFIG_KASAN_HW_TAGS
...
[ Upstream commit 94ab5b61ee ]
Hardware tag-based KASAN is now ready, enable the configuration option.
Link: https://lkml.kernel.org/r/a6fa50d3bb6b318e05c6389a44095be96442b8b0.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Acked-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I6342b3bc2df86d4c9759d8e609aa6b5ad8e79aff
2021-01-19 21:47:30 -08:00
Andrey Konovalov
8d4b6fc236
UPSTREAM: kasan, mm: reset tags when accessing metadata
...
[ Upstream commit aa1ef4d7b3 ]
Kernel allocator code accesses metadata for slab objects, that may lie
out-of-bounds of the object itself, or be accessed when an object is
freed. Such accesses trigger tag faults and lead to false-positive
reports with hardware tag-based KASAN.
Software KASAN modes disable instrumentation for allocator code via
KASAN_SANITIZE Makefile macro, and rely on kasan_enable/disable_current()
annotations which are used to ignore KASAN reports.
With hardware tag-based KASAN neither of those options are available, as
it doesn't use compiler instrumetation, no tag faults are ignored, and MTE
is disabled after the first one.
Instead, reset tags when accessing metadata (currently only for SLUB).
Link: https://lkml.kernel.org/r/a0f3cefbc49f34c843b664110842de4db28179d0.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Acked-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I9e465a2b11b96938d2dc4d45d31a15b1c6c1d129
2021-01-19 21:47:30 -08:00
Andrey Konovalov
cadd7c8b25
UPSTREAM: kasan, arm64: print report from tag fault handler
...
[ Upstream commit 4291e9ee61 ]
Add error reporting for hardware tag-based KASAN. When
CONFIG_KASAN_HW_TAGS is enabled, print KASAN report from the arm64 tag
fault handler.
SAS bits aren't set in ESR for all faults reported in EL1, so it's
impossible to find out the size of the access the caused the fault. Adapt
KASAN reporting code to handle this case.
Link: https://lkml.kernel.org/r/b559c82b6a969afedf53b4694b475f0234067a1a.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I1eb30d4a38f98fee4ba6a503a96afb8e89c58c14
2021-01-19 21:47:30 -08:00
Andrey Konovalov
11167161e5
UPSTREAM: kasan, arm64: implement HW_TAGS runtime
...
[ Upstream commit 2e903b9147 ]
Provide implementation of KASAN functions required for the hardware
tag-based mode. Those include core functions for memory and pointer
tagging (tags_hw.c) and bug reporting (report_tags_hw.c). Also adapt
common KASAN code to support the new mode.
Link: https://lkml.kernel.org/r/cfd0fbede579a6b66755c98c88c108e54f9c56bf.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Acked-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I01f73c7dad50345aa95272fa93eb26cbb1d6bf83
2021-01-19 21:47:30 -08:00
Andrey Konovalov
67e914b607
BACKPORT: kasan, arm64: expand CONFIG_KASAN checks
...
[ Upstream commit 0fea6e9af8 ]
[ Conflict: no real conflict, adjacent lines changed ]
Some #ifdef CONFIG_KASAN checks are only relevant for software KASAN modes
(either related to shadow memory or compiler instrumentation). Expand
those into CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS.
Link: https://lkml.kernel.org/r/e6971e432dbd72bb897ff14134ebb7e169bdcf0c.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: If98ea492b3523c950d46c81c616eb284859482b5
2021-01-19 21:47:30 -08:00
Andrey Konovalov
b243efc9b4
UPSTREAM: kasan, x86, s390: update undef CONFIG_KASAN
...
[ Upstream commit 8a494023b8 ]
With the intoduction of hardware tag-based KASAN some kernel checks of
this kind:
ifdef CONFIG_KASAN
will be updated to:
if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
x86 and s390 use a trick to #undef CONFIG_KASAN for some of the code
that isn't linked with KASAN runtime and shouldn't have any KASAN
annotations.
Also #undef CONFIG_KASAN_GENERIC with CONFIG_KASAN.
Link: https://lkml.kernel.org/r/9d84bfaaf8fabe0fc89f913c9e420a30bd31a260.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Acked-by: Vasily Gorbik <gor@linux.ibm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I5cf77ddb7725f71a69cf08dec139b988e59a7386
2021-01-19 21:47:29 -08:00
Andrey Konovalov
b5982bb106
UPSTREAM: kasan: define KASAN_GRANULE_SIZE for HW_TAGS
...
[ Upstream commit 6c6a04fe36 ]
Hardware tag-based KASAN has granules of MTE_GRANULE_SIZE. Define
KASAN_GRANULE_SIZE to MTE_GRANULE_SIZE for CONFIG_KASAN_HW_TAGS.
Link: https://lkml.kernel.org/r/3d15794b3d1b27447fd7fdf862c073192ba657bd.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Id0add4dda3cd0ab41e08071aa856abb470c529bc
2021-01-19 21:47:29 -08:00
Andrey Konovalov
4a7d7549b1
UPSTREAM: arm64: kasan: add arch layer for memory tagging helpers
...
[ Upstream commit ccbe2aaba1 ]
This patch add a set of arch_*() memory tagging helpers currently only
defined for arm64 when hardware tag-based KASAN is enabled. These helpers
will be used by KASAN runtime to implement the hardware tag-based mode.
The arch-level indirection level is introduced to simplify adding hardware
tag-based KASAN support for other architectures in the future by defining
the appropriate arch_*() macros.
Link: https://lkml.kernel.org/r/fc9e5bb71201c03131a2fc00a74125723568dda9.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I0f0eab39eab75e84fb6c6b56d3cb24a8a1684772
2021-01-19 21:47:29 -08:00
Andrey Konovalov
03c758182e
UPSTREAM: arm64: kasan: align allocations for HW_TAGS
...
[ Upstream commit dc09b29fd0 ]
Hardware tag-based KASAN uses the memory tagging approach, which requires
all allocations to be aligned to the memory granule size. Align the
allocations to MTE_GRANULE_SIZE via ARCH_SLAB_MINALIGN when
CONFIG_KASAN_HW_TAGS is enabled.
Link: https://lkml.kernel.org/r/fe64131606b1c2aabfd34ae99554c0d9df18eb19.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I5873f1d8d25af80b38ee2f9c5cb708b486091ecb
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
a878e24296
UPSTREAM: kasan, mm: untag page address in free_reserved_area
...
[ Upstream commit c746170d6a ]
free_reserved_area() memsets the pages belonging to a given memory area.
As that memory hasn't been allocated via page_alloc, the KASAN tags that
those pages have are 0x00. As the result the memset might result in a tag
mismatch.
Untag the address to avoid spurious faults.
Link: https://lkml.kernel.org/r/ebef6425f4468d063e2f09c1b62ccbb2236b71d3.1606161801.git.andreyknvl@google.com
Cc: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I7ee2b3a75f390d26b82dec5e66e9d103bf3df8c4
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
f884d5dda1
UPSTREAM: arm64: mte: switch GCR_EL1 in kernel entry and exit
...
[ Upstream commit bad1e1c663 ]
When MTE is present, the GCR_EL1 register contains the tags mask that
allows to exclude tags from the random generation via the IRG instruction.
With the introduction of the new Tag-Based KASAN API that provides a
mechanism to reserve tags for special reasons, the MTE implementation has
to make sure that the GCR_EL1 setting for the kernel does not affect the
userspace processes and viceversa.
Save and restore the kernel/user mask in GCR_EL1 in kernel entry and exit.
Link: https://lkml.kernel.org/r/578b03294708cc7258fad0dc9c2a2e809e5a8214.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Co-developed-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I46f10bd03e582f99bacaad141f49814eaa7b712d
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
90dc903dc9
UPSTREAM: arm64: mte: convert gcr_user into an exclude mask
...
[ Upstream commit 620954a67b ]
The gcr_user mask is a per thread mask that represents the tags that are
excluded from random generation when the Memory Tagging Extension is
present and an 'irg' instruction is invoked.
gcr_user affects the behavior on EL0 only.
Currently that mask is an include mask and it is controlled by the user
via prctl() while GCR_EL1 accepts an exclude mask.
Convert the include mask into an exclude one to make it easier the
register setting.
Note: This change will affect gcr_kernel (for EL1) introduced with a
future patch.
Link: https://lkml.kernel.org/r/946dd31be833b660334c4f93410acf6d6c4cf3c4.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I62e0f000a56d1b2367987cdb0872b3cc759df11c
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
81a5c3c4d4
UPSTREAM: arm64: kasan: allow enabling in-kernel MTE
...
[ Upstream commit bfc62c5985 ]
Hardware tag-based KASAN relies on Memory Tagging Extension (MTE) feature
and requires it to be enabled. MTE supports
This patch adds a new mte_enable_kernel() helper, that enables MTE in
Synchronous mode in EL1 and is intended to be called from KASAN runtime
during initialization.
The Tag Checking operation causes a synchronous data abort as a
consequence of a tag check fault when MTE is configured in synchronous
mode.
As part of this change enable match-all tag for EL1 to allow the kernel to
access user pages without faulting. This is required because the kernel
does not have knowledge of the tags set by the user in a page.
Note: For MTE, the TCF bit field in SCTLR_EL1 affects only EL1 in a
similar way as TCF0 affects EL0.
MTE that is built on top of the Top Byte Ignore (TBI) feature hence we
enable it as part of this patch as well.
Link: https://lkml.kernel.org/r/7352b0a0899af65c2785416c8ca6bf3845b66fa1.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Co-developed-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I71e3bf80b886a29c1d1aabe15cb15ce6034a2e49
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
dc14274fed
BACKPORT: arm64: mte: add in-kernel tag fault handler
...
[ Upstream commit 98c970da8b ]
[ Conflict: upstream slightly reworked uaccess_enable/disable ]
Add the implementation of the in-kernel fault handler.
When a tag fault happens on a kernel address:
* MTE is disabled on the current CPU,
* the execution continues.
When a tag fault happens on a user address:
* the kernel executes do_bad_area() and panics.
The tag fault handler for kernel addresses is currently empty and will be
filled in by a future commit.
Link: https://lkml.kernel.org/r/20201203102628.GB2224@gaia
Link: https://lkml.kernel.org/r/ad31529b073e22840b7a2246172c2b67747ed7c4.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Co-developed-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
[catalin.marinas@arm.com: ensure CONFIG_ARM64_PAN is enabled with MTE]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Change-Id: I03a50d7d684917c4d2ff0475880dafc7b530d55b
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
d7095e2017
UPSTREAM: arm64: mte: reset the page tag in page->flags
...
[ Upstream commit e5b8d92189 ]
The hardware tag-based KASAN for compatibility with the other modes stores
the tag associated to a page in page->flags. Due to this the kernel
faults on access when it allocates a page with an initial tag and the user
changes the tags.
Reset the tag associated by the kernel to a page in all the meaningful
places to prevent kernel faults on access.
Note: An alternative to this approach could be to modify page_to_virt().
This though could end up being racy, in fact if a CPU checks the
PG_mte_tagged bit and decides that the page is not tagged but another CPU
maps the same with PROT_MTE and becomes tagged the subsequent kernel
access would fail.
Link: https://lkml.kernel.org/r/9073d4e973747a6f78d5bdd7ebe17f290d087096.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Id3d492dab2d3ff3a7f99a233bda8e19110f14686
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
53ca99b3da
UPSTREAM: arm64: mte: add in-kernel MTE helpers
...
[ Upstream commit 85f49cae4d ]
Provide helper functions to manipulate allocation and pointer tags for
kernel addresses.
Low-level helper functions (mte_assign_*, written in assembly) operate tag
values from the [0x0, 0xF] range. High-level helper functions
(mte_get/set_*) use the [0xF0, 0xFF] range to preserve compatibility with
normal kernel pointers that have 0xFF in their top byte.
MTE_GRANULE_SIZE and related definitions are moved to mte-def.h header
that doesn't have any dependencies and is safe to include into any
low-level header.
Link: https://lkml.kernel.org/r/c31bf759b4411b2d98cdd801eb928e241584fd1f.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Co-developed-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I2419a2578f5ec1694f64227fb54700aa87e43cdd
2021-01-19 21:47:29 -08:00
Vincenzo Frascino
bbc60b009e
UPSTREAM: arm64: enable armv8.5-a asm-arch option
...
[ Upstream commit f469c032c0 ]
Hardware tag-based KASAN relies on Memory Tagging Extension (MTE) which is
an armv8.5-a architecture extension.
Enable the correct asm option when the compiler supports it in order to
allow the usage of ALTERNATIVE()s with MTE instructions.
Link: https://lkml.kernel.org/r/d03d1157124ea3532eaeb77507988733f5734986.1606161801.git.andreyknvl@google.com
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I7ec5f3dc7fe81d4677f6992cca980ea3fdbef9fb
2021-01-19 21:47:29 -08:00
Andrey Konovalov
25d5d4e7d2
UPSTREAM: kasan: introduce CONFIG_KASAN_HW_TAGS
...
[ Upstream commit 6a63a63ff1 ]
This patch adds a configuration option for a new KASAN mode called
hardware tag-based KASAN. This mode uses the memory tagging approach like
the software tag-based mode, but relies on arm64 Memory Tagging Extension
feature for tag management and access checking.
Link: https://lkml.kernel.org/r/44906a209d3a44f9c6f5a21841e90988e365601e.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Co-developed-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ifac52c3760f0e6b4c20f40bb582c93a0defaf129
2021-01-19 21:47:28 -08:00
Andrey Konovalov
93b65b4815
UPSTREAM: kasan: separate metadata_fetch_row for each mode
...
[ Upstream commit 96e0279df6 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Rework print_memory_metadata() to make it agnostic with regard to the way
metadata is stored. Allow providing a separate metadata_fetch_row()
implementation for each KASAN mode. Hardware tag-based KASAN will provide
its own implementation that doesn't use shadow memory.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/5fb1ec0152bb1f521505017800387ec3e36ffe18.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ib32f54f9db493642d2d128cd5033a3dfd94958d8
2021-01-19 21:47:28 -08:00
Andrey Konovalov
23d84bb610
UPSTREAM: kasan: rename SHADOW layout macros to META
...
[ Upstream commit 88b865974d ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Hardware tag-based KASAN won't be using shadow memory, but will reuse
these macros. Rename "SHADOW" to implementation-neutral "META".
No functional changes.
Link: https://lkml.kernel.org/r/f96244ec59dc17db35173ec352c5592b14aefaf8.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ifcb4934007f99bb907127d4f72a7b44dd575d066
2021-01-19 21:47:28 -08:00
Andrey Konovalov
0f0fc694d2
UPSTREAM: kasan: rename print_shadow_for_address to print_memory_metadata
...
[ Upstream commit db3de8f759 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Hardware tag-based KASAN won't be using shadow memory, but will reuse this
function. Rename "shadow" to implementation-neutral "metadata".
No functional changes.
Link: https://lkml.kernel.org/r/dd955c5aadaee16aef451a6189d19172166a23f5.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I691465642dc400850c1e04d5aca845780ce15018
2021-01-19 21:47:28 -08:00
Andrey Konovalov
9a3a96fb76
UPSTREAM: kasan: rename addr_has_shadow to addr_has_metadata
...
[ Upstream commit 6882464faf ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Hardware tag-based KASAN won't be using shadow memory, but will reuse this
function. Rename "shadow" to implementation-neutral "metadata".
No functional changes.
Link: https://lkml.kernel.org/r/370466fba590a4596b55ffd38adfd990f8886db4.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ia118d386ef9f53809092eec0c1318fdbbf791661
2021-01-19 21:47:28 -08:00
Andrey Konovalov
45e9e7c075
UPSTREAM: kasan, arm64: rename kasan_init_tags and mark as __init
...
[ Upstream commit 60a3a5fe95 ]
Rename kasan_init_tags() to kasan_init_sw_tags() as the upcoming hardware
tag-based KASAN mode will have its own initialization routine. Also
similarly to kasan_init() mark kasan_init_tags() as __init.
Link: https://lkml.kernel.org/r/71e52af72a09f4b50c8042f16101c60e50649fbb.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I20b82431e4fd230dde52fe5d47485979d468c62e
2021-01-19 21:47:28 -08:00
Andrey Konovalov
af7baded16
UPSTREAM: kasan, arm64: move initialization message
...
[ Upstream commit 28ab35841c ]
Software tag-based KASAN mode is fully initialized with kasan_init_tags(),
while the generic mode only requires kasan_init(). Move the
initialization message for tag-based mode into kasan_init_tags().
Also fix pr_fmt() usage for KASAN code: generic.c doesn't need it as it
doesn't use any printing functions; tag-based mode should use "kasan:"
instead of KBUILD_MODNAME (which stands for file name).
Link: https://lkml.kernel.org/r/29a30ea4e1750450dd1f693d25b7b6cb05913ecf.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Iabe6c750615c601e6fffeedddb59db9304006764
2021-01-19 21:47:28 -08:00
Andrey Konovalov
e0ae1141ab
UPSTREAM: kasan, arm64: only use kasan_depth for software modes
...
[ Upstream commit d73b49365e ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Hardware tag-based KASAN won't use kasan_depth. Only define and use it
when one of the software KASAN modes are enabled.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/e16f15aeda90bc7fb4dfc2e243a14b74cc5c8219.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I553d5ca1fa50ae80cd2eb929e328ac3cb3ce0e9f
2021-01-19 21:47:28 -08:00
Andrey Konovalov
44a5a74e92
UPSTREAM: kasan, arm64: only init shadow for software modes
...
[ Upstream commit afe6ef80dc ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Hardware tag-based KASAN won't be using shadow memory. Only initialize it
when one of the software KASAN modes are enabled.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/d1742eea2cd728d150d49b144e49b6433405c7ba.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Marco Elver <elver@google.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I8574f1b0e37786c5d6843f058d363cf9a07c9c8f
2021-01-19 21:47:28 -08:00
Andrey Konovalov
1c494ea111
UPSTREAM: kasan: decode stack frame only with KASAN_STACK_ENABLE
...
[ Upstream commit 97fc712232 ]
Decoding routines aren't needed when CONFIG_KASAN_STACK_ENABLE is not
enabled. Currently only generic KASAN mode implements stack error
reporting.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/05a24db36f5ec876af876a299bbea98c29468ebd.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I871e4339e80e7fd0e244d7298cc69bc274ec36f2
2021-01-19 21:47:28 -08:00
Andrey Konovalov
a5832cbd1d
UPSTREAM: kasan: hide invalid free check implementation
...
[ Upstream commit 2cdbed6349 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
For software KASAN modes the check is based on the value in the shadow
memory. Hardware tag-based KASAN won't be using shadow, so hide the
implementation of the check in check_invalid_free().
Also simplify the code for software tag-based mode.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/d01534a4b977f97d87515dc590e6348e1406de81.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Iea1ef21d2194064c712d28cafcd8849293f5a6c3
2021-01-19 21:47:28 -08:00
Andrey Konovalov
987eaa9e50
UPSTREAM: kasan: don't duplicate config dependencies
...
[ Upstream commit ffcc5cea46 ]
Both KASAN_GENERIC and KASAN_SW_TAGS have common dependencies, move those
to KASAN.
Link: https://lkml.kernel.org/r/c1cc0d562608a318c607afe22db5ec2a7af72e47.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I63e39c7b58353f5057dbb05810c12b52e9fede6d
2021-01-19 21:47:28 -08:00
Andrey Konovalov
d1f338cc02
UPSTREAM: kasan: rename report and tags files
...
[ Upstream commit 59fd51b2ba ]
Rename generic_report.c to report_generic.c and tags_report.c to
report_sw_tags.c, as their content is more relevant to report.c file.
Also rename tags.c to sw_tags.c to better reflect that this file contains
code for software tag-based mode.
No functional changes.
Link: https://lkml.kernel.org/r/a6105d416da97d389580015afed66c4c3cfd4c08.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I5c6dd8eb57967f98a72a88203489f553505f4b6e
2021-01-19 21:47:28 -08:00
Andrey Konovalov
28fddd451e
UPSTREAM: kasan: define KASAN_MEMORY_PER_SHADOW_PAGE
...
[ Upstream commit affc3f0775 ]
Define KASAN_MEMORY_PER_SHADOW_PAGE as (KASAN_GRANULE_SIZE << PAGE_SHIFT),
which is the same as (KASAN_GRANULE_SIZE * PAGE_SIZE) for software modes
that use shadow memory, and use it across KASAN code to simplify it.
Link: https://lkml.kernel.org/r/8329391cfe14b5cffd3decf3b5c535b6ce21eef6.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I5124f2abec4fc5b3bfc65427c703158162aaca47
2021-01-19 21:47:27 -08:00
Andrey Konovalov
0d7071f479
UPSTREAM: kasan: split out shadow.c from common.c
...
[ Upstream commit bb359dbcb7 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
The new mode won't be using shadow memory. Move all shadow-related code
to shadow.c, which is only enabled for software KASAN modes that use
shadow memory.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/17d95cfa7d5cf9c4fcd9bf415f2a8dea911668df.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Ic48ae9dbde9dab6683a764989fa4428e1830db61
2021-01-19 21:47:27 -08:00
Andrey Konovalov
b1624bb7d8
UPSTREAM: kasan: only build init.c for software modes
...
[ Upstream commit b266e8fee9 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
The new mode won't be using shadow memory, so only build init.c that
contains shadow initialization code for software modes.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/bae0a6a35b7a9b1a443803c1a55e6e3fecc311c9.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I8720a0fae02d0f0c0b27700950a1389f994314df
2021-01-19 21:47:27 -08:00
Andrey Konovalov
70585d9a09
UPSTREAM: kasan: rename KASAN_SHADOW_* to KASAN_GRANULE_*
...
[ Upstream commit 1f600626b3 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
The new mode won't be using shadow memory, but will still use the concept
of memory granules. Each memory granule maps to a single metadata entry:
8 bytes per one shadow byte for generic mode, 16 bytes per one shadow byte
for software tag-based mode, and 16 bytes per one allocation tag for
hardware tag-based mode.
Rename KASAN_SHADOW_SCALE_SIZE to KASAN_GRANULE_SIZE, and
KASAN_SHADOW_MASK to KASAN_GRANULE_MASK.
Also use MASK when used as a mask, otherwise use SIZE.
No functional changes.
Link: https://lkml.kernel.org/r/939b5754e47f528a6e6a6f28ffc5815d8d128033.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I195cb22714625685acf520eb62e661e636105fa0
2021-01-19 21:47:27 -08:00
Andrey Konovalov
37f77a6fb3
UPSTREAM: kasan: rename (un)poison_shadow to (un)poison_range
...
[ Upstream commit cebd0eb29a ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
The new mode won't be using shadow memory. Rename external annotation
kasan_unpoison_shadow() to kasan_unpoison_range(), and introduce internal
functions (un)poison_range() (without kasan_ prefix).
Co-developed-by: Marco Elver <elver@google.com >
Link: https://lkml.kernel.org/r/fccdcaa13dc6b2211bf363d6c6d499279a54fe3a.1606161801.git.andreyknvl@google.com
Signed-off-by: Marco Elver <elver@google.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: If25b1b58a3a38a2643367a165e1c9bbd69d42455
2021-01-19 21:47:27 -08:00
Andrey Konovalov
f4fb11566b
UPSTREAM: kasan: shadow declarations only for software modes
...
[ Upstream commit d5750edf6d ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Group shadow-related KASAN function declarations and only define them for
the two existing software modes.
No functional changes for software modes.
Link: https://lkml.kernel.org/r/35126.1606402815@turing-police
Link: https://lore.kernel.org/linux-arm-kernel/24105.1606397102@turing-police/
Link: https://lkml.kernel.org/r/e88d94eff94db883a65dca52e1736d80d28dd9bc.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Signed-off-by: Valdis Kletnieks <valdis.kletnieks@vt.edu >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
[valdis.kletnieks@vt.edu: fix build issue with asmlinkage]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Change-Id: I440336ef97171f7c5b10dc5b8646177649faebd8
2021-01-19 21:47:27 -08:00
Andrey Konovalov
2487712e36
UPSTREAM: kasan: group vmalloc code
...
[ Upstream commit 3b1a4a8640 ]
This is a preparatory commit for the upcoming addition of a new hardware
tag-based (MTE-based) KASAN mode.
Group all vmalloc-related function declarations in include/linux/kasan.h,
and their implementations in mm/kasan/common.c.
No functional changes.
Link: https://lkml.kernel.org/r/80a6fdd29b039962843bd6cf22ce2643a7c8904e.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I6513dc1bb9b624f9c0ba3f8b46b71ea5a18f3106
2021-01-19 21:47:27 -08:00
Andrey Konovalov
d9d1610f1f
UPSTREAM: kasan: KASAN_VMALLOC depends on KASAN_GENERIC
...
[ Upstream commit 71f6af6d52 ]
Currently only generic KASAN mode supports vmalloc, reflect that in the
config.
Link: https://lkml.kernel.org/r/0c493d3a065ad95b04313d00244e884a7e2498ff.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Cc: Will Deacon <will.deacon@arm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I88ed0821d7c47355e44990550393ae53d90af77d
2021-01-19 21:47:27 -08:00
Andrey Konovalov
40dee1d96e
UPSTREAM: kasan: drop unnecessary GPL text from comment headers
...
[ Upstream commit 11f094e312 ]
Patch series "kasan: add hardware tag-based mode for arm64", v11.
This patchset adds a new hardware tag-based mode to KASAN [1]. The new
mode is similar to the existing software tag-based KASAN, but relies on
arm64 Memory Tagging Extension (MTE) [2] to perform memory and pointer
tagging (instead of shadow memory and compiler instrumentation).
This patchset is co-developed and tested by
Vincenzo Frascino <vincenzo.frascino@arm.com >.
This patchset is available here:
https://github.com/xairy/linux/tree/up-kasan-mte-v11
For testing in QEMU hardware tag-based KASAN requires:
1. QEMU built from master [4] (use "-machine virt,mte=on -cpu max" arguments
to run).
2. GCC version 10.
[1] https://www.kernel.org/doc/html/latest/dev-tools/kasan.html
[2] https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/enhancing-memory-safety
[3] git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux for-next/mte
[4] https://github.com/qemu/qemu
====== Overview
The underlying ideas of the approach used by hardware tag-based KASAN are:
1. By relying on the Top Byte Ignore (TBI) arm64 CPU feature, pointer tags
are stored in the top byte of each kernel pointer.
2. With the Memory Tagging Extension (MTE) arm64 CPU feature, memory tags
for kernel memory allocations are stored in a dedicated memory not
accessible via normal instuctions.
3. On each memory allocation, a random tag is generated, embedded it into
the returned pointer, and the corresponding memory is tagged with the
same tag value.
4. With MTE the CPU performs a check on each memory access to make sure
that the pointer tag matches the memory tag.
5. On a tag mismatch the CPU generates a tag fault, and a KASAN report is
printed.
Same as other KASAN modes, hardware tag-based KASAN is intended as a
debugging feature at this point.
====== Rationale
There are two main reasons for this new hardware tag-based mode:
1. Previously implemented software tag-based KASAN is being successfully
used on dogfood testing devices due to its low memory overhead (as
initially planned). The new hardware mode keeps the same low memory
overhead, and is expected to have significantly lower performance
impact, due to the tag checks being performed by the hardware.
Therefore the new mode can be used as a better alternative in dogfood
testing for hardware that supports MTE.
2. The new mode lays the groundwork for the planned in-kernel MTE-based
memory corruption mitigation to be used in production.
====== Technical details
Considering the implementation perspective, hardware tag-based KASAN is
almost identical to the software mode. The key difference is using MTE
for assigning and checking tags.
Compared to the software mode, the hardware mode uses 4 bits per tag, as
dictated by MTE. Pointer tags are stored in bits [56:60), the top 4 bits
have the normal value 0xF. Having less distict tags increases the
probablity of false negatives (from ~1/256 to ~1/16) in certain cases.
Only synchronous exceptions are set up and used by hardware tag-based KASAN.
====== Benchmarks
Note: all measurements have been performed with software emulation of Memory
Tagging Extension, performance numbers for hardware tag-based KASAN on the
actual hardware are expected to be better.
Boot time [1]:
* 2.8 sec for clean kernel
* 5.7 sec for hardware tag-based KASAN
* 11.8 sec for software tag-based KASAN
* 11.6 sec for generic KASAN
Slab memory usage after boot [2]:
* 7.0 kb for clean kernel
* 9.7 kb for hardware tag-based KASAN
* 9.7 kb for software tag-based KASAN
* 41.3 kb for generic KASAN
Measurements have been performed with:
* defconfig-based configs
* Manually built QEMU master
* QEMU arguments: -machine virt,mte=on -cpu max
* CONFIG_KASAN_STACK_ENABLE disabled
* CONFIG_KASAN_INLINE enabled
* clang-10 as the compiler and gcc-10 as the assembler
[1] Time before the ext4 driver is initialized.
[2] Measured as `cat /proc/meminfo | grep Slab`.
====== Notes
The cover letter for software tag-based KASAN patchset can be found here:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0116523cfffa62aeb5aa3b85ce7419f3dae0c1b8
===== Tags
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
This patch (of 41):
Don't mention "GNU General Public License version 2" text explicitly, as
it's already covered by the SPDX-License-Identifier.
Link: https://lkml.kernel.org/r/cover.1606161801.git.andreyknvl@google.com
Link: https://lkml.kernel.org/r/6ea9f5f4aa9dbbffa0d0c0a780b37699a4531034.1606161801.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Alexander Potapenko <glider@google.com >
Tested-by: Vincenzo Frascino <vincenzo.frascino@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.com >
Cc: Will Deacon <will.deacon@arm.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Evgenii Stepanov <eugenis@google.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Kevin Brodsky <kevin.brodsky@arm.com >
Cc: Vasily Gorbik <gor@linux.ibm.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I3426d56768d9dde6e4fcb312639cce6d4bda8bc1
2021-01-19 21:47:27 -08:00
Marco Elver
941faf832d
UPSTREAM: lkdtm: disable KASAN for rodata.o
...
[ Upstream commit 6d5a88cd0c ]
Building lkdtm with KASAN and Clang 11 or later results in the following
error when attempting to load the module:
kernel tried to execute NX-protected page - exploit attempt? (uid: 0)
BUG: unable to handle page fault for address: ffffffffc019cd70
#PF: supervisor instruction fetch in kernel mode
#PF: error_code(0x0011) - permissions violation
...
RIP: 0010:asan.module_ctor+0x0/0xffffffffffffa290 [lkdtm]
...
Call Trace:
do_init_module+0x17c/0x570
load_module+0xadee/0xd0b0
__x64_sys_finit_module+0x16c/0x1a0
do_syscall_64+0x34/0x50
entry_SYSCALL_64_after_hwframe+0x44/0xa9
The reason is that rodata.o generates a dummy function that lives in
.rodata to validate that .rodata can't be executed; however, Clang 11 adds
KASAN globals support by generating module constructors to initialize
globals redzones. When Clang 11 adds a module constructor to rodata.o, it
is also added to .rodata: any attempt to call it on initialization results
in the above error.
Therefore, disable KASAN instrumentation for rodata.o.
Link: https://lkml.kernel.org/r/20201214191413.3164796-1-elver@google.com
Signed-off-by: Marco Elver <elver@google.com >
Cc: Kees Cook <keescook@chromium.org >
Cc: Arnd Bergmann <arnd@arndb.de >
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
Cc: Andrey Konovalov <andreyknvl@google.com >
Cc: Dmitry Vyukov <dvyukov@google.com >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I0a3662322bac8961b0f87ab5e8e87acfb1ac3ec5
2021-01-19 21:47:27 -08:00
Walter Wu
dbf063d2c5
UPSTREAM: kasan: update documentation for generic kasan
...
[ Upstream commit 4784be284a ]
Generic KASAN also supports to record the last two workqueue stacks and
print them in KASAN report. So that need to update documentation.
Link: https://lkml.kernel.org/r/20201203023037.30792-1-walter-zh.wu@mediatek.com
Signed-off-by: Walter Wu <walter-zh.wu@mediatek.com >
Suggested-by: Marco Elver <elver@google.com >
Acked-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.com >
Reviewed-by: Andrey Konovalov <andreyknvl@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Jonathan Corbet <corbet@lwn.net >
Cc: Lai Jiangshan <jiangshanlai@gmail.com >
Cc: Matthias Brugger <matthias.bgg@gmail.com >
Cc: Tejun Heo <tj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: Iff2529dcd7055635bf7679491d50a07754f748b4
2021-01-19 21:47:27 -08:00
Walter Wu
a6aebdb05b
UPSTREAM: lib/test_kasan.c: add workqueue test case
...
[ Upstream commit 214c783d59 ]
Adds a test to verify workqueue stack recording and print it in
KASAN report.
The KASAN report was as follows(cleaned up slightly):
BUG: KASAN: use-after-free in kasan_workqueue_uaf
Freed by task 54:
kasan_save_stack+0x24/0x50
kasan_set_track+0x24/0x38
kasan_set_free_info+0x20/0x40
__kasan_slab_free+0x10c/0x170
kasan_slab_free+0x10/0x18
kfree+0x98/0x270
kasan_workqueue_work+0xc/0x18
Last potentially related work creation:
kasan_save_stack+0x24/0x50
kasan_record_wq_stack+0xa8/0xb8
insert_work+0x48/0x288
__queue_work+0x3e8/0xc40
queue_work_on+0xf4/0x118
kasan_workqueue_uaf+0xfc/0x190
Link: https://lkml.kernel.org/r/20201203022748.30681-1-walter-zh.wu@mediatek.com
Signed-off-by: Walter Wu <walter-zh.wu@mediatek.com >
Acked-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.com >
Reviewed-by: Andrey Konovalov <andreyknvl@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Matthias Brugger <matthias.bgg@gmail.com >
Cc: Jonathan Corbet <corbet@lwn.net >
Cc: Lai Jiangshan <jiangshanlai@gmail.com >
Cc: Tejun Heo <tj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I5f8c6aa60aa1922beb0ec45cc284636cb530e938
2021-01-19 21:47:26 -08:00
Walter Wu
69a4c41726
UPSTREAM: kasan: print workqueue stack
...
[ Upstream commit ef13346123 ]
The aux_stack[2] is reused to record the call_rcu() call stack and
enqueuing work call stacks. So that we need to change the auxiliary stack
title for common title, print them in KASAN report.
Link: https://lkml.kernel.org/r/20201203022715.30635-1-walter-zh.wu@mediatek.com
Signed-off-by: Walter Wu <walter-zh.wu@mediatek.com >
Suggested-by: Marco Elver <elver@google.com >
Acked-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.com >
Reviewed-by: Andrey Konovalov <andreyknvl@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Jonathan Corbet <corbet@lwn.net >
Cc: Lai Jiangshan <jiangshanlai@gmail.com >
Cc: Matthias Brugger <matthias.bgg@gmail.com >
Cc: Tejun Heo <tj@kernel.org >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I17bfab3a2e9858b5d9435c3df66f63ff7ebb5d29
2021-01-19 21:47:26 -08:00
Walter Wu
789956f2bc
UPSTREAM: workqueue: kasan: record workqueue stack
...
[ Upstream commit e89a85d63f ]
Patch series "kasan: add workqueue stack for generic KASAN", v5.
Syzbot reports many UAF issues for workqueue, see [1].
In some of these access/allocation happened in process_one_work(), we
see the free stack is useless in KASAN report, it doesn't help
programmers to solve UAF for workqueue issue.
This patchset improves KASAN reports by making them to have workqueue
queueing stack. It is useful for programmers to solve use-after-free or
double-free memory issue.
Generic KASAN also records the last two workqueue stacks and prints them
in KASAN report. It is only suitable for generic KASAN.
[1] https://groups.google.com/g/syzkaller-bugs/search?q=%22use-after-free%22+process_one_work
[2] https://bugzilla.kernel.org/show_bug.cgi?id=198437
This patch (of 4):
When analyzing use-after-free or double-free issue, recording the
enqueuing work stacks is helpful to preserve usage history which
potentially gives a hint about the affected code.
For workqueue it has turned out to be useful to record the enqueuing work
call stacks. Because user can see KASAN report to determine whether it is
root cause. They don't need to enable debugobjects, but they have a
chance to find out the root cause.
Link: https://lkml.kernel.org/r/20201203022148.29754-1-walter-zh.wu@mediatek.com
Link: https://lkml.kernel.org/r/20201203022442.30006-1-walter-zh.wu@mediatek.com
Signed-off-by: Walter Wu <walter-zh.wu@mediatek.com >
Suggested-by: Marco Elver <elver@google.com >
Acked-by: Marco Elver <elver@google.com >
Acked-by: Tejun Heo <tj@kernel.org >
Reviewed-by: Dmitry Vyukov <dvyukov@google.com >
Reviewed-by: Andrey Konovalov <andreyknvl@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Alexander Potapenko <glider@google.com >
Cc: Lai Jiangshan <jiangshanlai@gmail.com >
Cc: Marco Elver <elver@google.com >
Cc: Matthias Brugger <matthias.bgg@gmail.com >
Cc: Jonathan Corbet <corbet@lwn.net >
Signed-off-by: Andrew Morton <akpm@linux-foundation.org >
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I3a27e632eb744742bf09e24013f4fcc341fb867f
2021-01-19 21:47:26 -08:00
Szabolcs Nagy
a80a97e66a
UPSTREAM: Documentation: document /proc api for arm64 MTE vm flags
...
[ Upstream commit 868770c92b ]
Document that /proc/PID/smaps shows PROT_MTE settings in VmFlags.
Support for this was introduced in
commit 9f3419315f
arm64: mte: Add PROT_MTE support to mmap() and mprotect()
Signed-off-by: Szabolcs Nagy <szabolcs.nagy@arm.com >
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com >
Cc: linux-doc@vger.kernel.org
Link: https://lore.kernel.org/r/20201106101940.5777-1-szabolcs.nagy@arm.com
Signed-off-by: Jonathan Corbet <corbet@lwn.net >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I48b2c862198b358bca74fe72816e861474796b0b
2021-01-19 21:47:26 -08:00
Andrew Klychkov
0a51cb8c5a
UPSTREAM: Documentation: fix typos in dev-tools/kasan.rst
...
[ Upstream commit 1a37e18bd4 ]
Documentation: dev-tools: kasan.rst: fix typos
Signed-off-by: Andrew Klychkov <andrew.a.klyckov@gmail.com >
Link: https://lore.kernel.org/r/20201129192928.GA5692@ak-VirtualBox
Signed-off-by: Jonathan Corbet <corbet@lwn.net >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I0861dc9298ce4326fae032a0e062f95656a3e858
2021-01-19 21:47:26 -08:00
Peter Collingbourne
94a1374da0
UPSTREAM: kasan: arm64: set TCR_EL1.TBID1 when enabled
...
[ Upstream commit 49b3cf035e ]
On hardware supporting pointer authentication, we previously ended up
enabling TBI on instruction accesses when tag-based ASAN was enabled,
but this was costing us 8 bits of PAC entropy, which was unnecessary
since tag-based ASAN does not require TBI on instruction accesses. Get
them back by setting TCR_EL1.TBID1.
Signed-off-by: Peter Collingbourne <pcc@google.com >
Reviewed-by: Andrey Konovalov <andreyknvl@google.com >
Link: https://lore.kernel.org/r/20f64e26fc8a1309caa446fffcb1b4e2fe9e229f.1605952129.git.pcc@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com >
Bug: 172318110
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Change-Id: I610653f7fead6fea2a32fb7f90d8e604743bb981
2021-01-19 21:47:26 -08:00