Andrey Konovalov
26038d5d9d
UPSTREAM: kasan: update documentation
...
[ Upstream commit 625d867347 ]
This change updates KASAN documentation to reflect the addition of boot
parameters and also reworks and clarifies some of the existing sections,
in particular: defines what a memory granule is, mentions quarantine,
makes Kunit section more readable.
Link: https://lkml.kernel.org/r/748daf013e17d925b0fe00c1c3b5dce726dd2430.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I1a5c740910bba813ebd9ba055c6ff248387d872e
2021-01-19 21:47:32 -08:00
Andrey Konovalov
6d847f846e
UPSTREAM: kasan, mm: allow cache merging with no metadata
...
[ Upstream commit e86f8b09f2 ]
The reason cache merging is disabled with KASAN is because KASAN puts its
metadata right after the allocated object. When the merged caches have
slightly different sizes, the metadata ends up in different places, which
KASAN doesn't support.
It might be possible to adjust the metadata allocation algorithm and make
it friendly to the cache merging code. Instead this change takes a simpler
approach and allows merging caches when no metadata is present. Which is
the case for hardware tag-based KASAN with kasan.mode=prod.
Link: https://lkml.kernel.org/r/37497e940bfd4b32c0a93a702a9ae4cf061d5392.1606162397.git.andreyknvl@google.com
Co-developed-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com >
Signed-off-by: Vincenzo Frascino <Vincenzo.Frascino@arm.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I11e722c583fbaa6d08bb726f2da684106859b86e
2021-01-19 21:47:32 -08:00
Andrey Konovalov
c5eb933f68
UPSTREAM: kasan: sanitize objects when metadata doesn't fit
...
[ Upstream commit 97593cad00 ]
KASAN marks caches that are sanitized with the SLAB_KASAN cache flag.
Currently if the metadata that is appended after the object (stores e.g.
stack trace ids) doesn't fit into KMALLOC_MAX_SIZE (can only happen with
SLAB, see the comment in the patch), KASAN turns off sanitization
completely.
With this change sanitization of the object data is always enabled.
However the metadata is only stored when it fits. Instead of checking for
SLAB_KASAN flag accross the code to find out whether the metadata is
there, use cache->kasan_info.alloc/free_meta_offset. As 0 can be a valid
value for free_meta_offset, introduce KASAN_NO_FREE_META as an indicator
that the free metadata is missing.
Without this change all sanitized KASAN objects would be put into
quarantine with generic KASAN. With this change, only the objects that
have metadata (i.e. when it fits) are put into quarantine, the rest is
freed right away.
Along the way rework __kasan_cache_create() and add claryfying comments.
Link: https://lkml.kernel.org/r/aee34b87a5e4afe586c2ac6a0b32db8dc4dcc2dc.1606162397.git.andreyknvl@google.com
Co-developed-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com >
Signed-off-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.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: 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: I7b795bb1b84bf216a722e9250e63a89805835ead
2021-01-19 21:47:32 -08:00
Andrey Konovalov
36c5b4d631
UPSTREAM: kasan: clarify comment in __kasan_kfree_large
...
[ Upstream commit 3933c17571 ]
Currently it says that the memory gets poisoned by page_alloc code.
Clarify this by mentioning the specific callback that poisons the memory.
Link: https://lkml.kernel.org/r/1c8380fe0332a3bcc720fe29f1e0bef2e2974416.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I370123e69ce735ad0226866fbde266f555475b75
2021-01-19 21:47:31 -08:00
Andrey Konovalov
ac067eb9c0
UPSTREAM: kasan: simplify assign_tag and set_tag calls
...
[ Upstream commit 1ef3133bd3 ]
set_tag() already ignores the tag for the generic mode, so just call it
as is. Add a check for the generic mode to assign_tag(), and simplify its
call in ____kasan_kmalloc().
Link: https://lkml.kernel.org/r/121eeab245f98555862b289d2ba9269c868fbbcf.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I6e983b20213f0d66696882bd2ed389ed637ec93a
2021-01-19 21:47:31 -08:00
Andrey Konovalov
c761aed906
UPSTREAM: kasan: don't round_up too much
...
[ Upstream commit d99f6a10c1 ]
For hardware tag-based mode kasan_poison_memory() already rounds up the
size. Do the same for software modes and remove round_up() from the common
code.
Link: https://lkml.kernel.org/r/47b232474f1f89dc072aeda0fa58daa6efade377.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: Ibeef44ca27cf2c84f3c42ba238067502e5f2aea0
2021-01-19 21:47:31 -08:00
Andrey Konovalov
1d986f3458
UPSTREAM: kasan, mm: rename kasan_poison_kfree
...
[ Upstream commit eeb3160c24 ]
Rename kasan_poison_kfree() to kasan_slab_free_mempool() as it better
reflects what this annotation does. Also add a comment that explains the
PageSlab() check.
No functional changes.
Link: https://lkml.kernel.org/r/141675fb493555e984c5dca555e9d9f768c7bbaa.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.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: 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: I5d8c84899fe81aaebe67fdd5985418d8ecaf56c9
2021-01-19 21:47:31 -08:00
Andrey Konovalov
4e35a81bd8
UPSTREAM: kasan, mm: check kasan_enabled in annotations
...
[ Upstream commit 34303244f2 ]
Declare the kasan_enabled static key in include/linux/kasan.h and in
include/linux/mm.h and check it in all kasan annotations. This allows to
avoid any slowdown caused by function calls when kasan_enabled is
disabled.
Link: https://lkml.kernel.org/r/9f90e3c0aa840dbb4833367c2335193299f69023.1606162397.git.andreyknvl@google.com
Co-developed-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com >
Signed-off-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com >
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: Catalin Marinas <catalin.marinas@arm.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: I2fd783303872cb87b447dbcc97d5654b293fa080
2021-01-19 21:47:31 -08:00
Andrey Konovalov
604db99647
UPSTREAM: kasan: add and integrate kasan boot parameters
...
[ Upstream commit 8028caaca7 ]
Hardware tag-based KASAN mode 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 change adds a few boot parameters for hardware tag-based KASAN that
allow to disable or otherwise control particular KASAN features.
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.
With this change a new boot parameter 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 alloc/free stack 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 [1].
[1] https://source.android.com/devices/architecture/kernel/generic-kernel-image
[andreyknvl@google.com: don't use read-only static keys]
Link: https://lkml.kernel.org/r/f2ded589eba1597f7360a972226083de9afd86e2.1607537948.git.andreyknvl@google.com
Link: https://lkml.kernel.org/r/cb093613879d8d8841173f090133eddeb4c35f1f.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: Catalin Marinas <catalin.marinas@arm.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: I7c7b0f8f67bd27f9a9de5ede95dd6c74ee827994
2021-01-19 21:47:31 -08:00
Andrey Konovalov
c9e9df3264
UPSTREAM: kasan: inline (un)poison_range and check_invalid_free
...
[ Upstream commit 57345fa68a ]
Using (un)poison_range() or check_invalid_free() currently results in
function calls. Move their definitions to mm/kasan/kasan.h and turn them
into static inline functions for hardware tag-based mode to avoid
unneeded function calls.
Link: https://lkml.kernel.org/r/7007955b69eb31b5376a7dc1e0f4ac49138504f2.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.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: 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: I5db5530f619160bb858f2a88c9ddc6280c04b0b3
2021-01-19 21:47:31 -08:00
Andrey Konovalov
a060305363
UPSTREAM: kasan: open-code kasan_unpoison_slab
...
[ Upstream commit bffe690708 ]
There's the external annotation kasan_unpoison_slab() that is currently
defined as static inline and uses kasan_unpoison_range(). Open-code this
function in mempool.c. Otherwise with an upcoming change this function
will result in an unnecessary function call.
Link: https://lkml.kernel.org/r/131a6694a978a9a8b150187e539eecc8bcbf759b.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.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: 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: Ifa2f5726be869c90101f44baad4b90b1e6ff1249
2021-01-19 21:47:31 -08:00
Andrey Konovalov
42a780b89a
UPSTREAM: kasan: inline random_tag for HW_TAGS
...
[ Upstream commit d8dd397120 ]
Using random_tag() currently results in a function call. Move its
definition to mm/kasan/kasan.h and turn it into a static inline function
for hardware tag-based mode to avoid uneeded function calls.
Link: https://lkml.kernel.org/r/be438471690e351e1d792e6bb432e8c03ccb15d3.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: Catalin Marinas <catalin.marinas@arm.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: Ibd6c5381c57cfebd851c6070d92bf421fe62c5c3
2021-01-19 21:47:31 -08:00
Andrey Konovalov
1e8a05e3c0
UPSTREAM: kasan: inline kasan_reset_tag for tag-based modes
...
[ Upstream commit c0054c565a ]
Using kasan_reset_tag() currently results in a function call. As it's
called quite often from the allocator code, this leads to a noticeable
slowdown. Move it to include/linux/kasan.h and turn it into a static
inline function. Also remove the now unneeded reset_tag() internal KASAN
macro and use kasan_reset_tag() instead.
Link: https://lkml.kernel.org/r/6940383a3a9dfb416134d338d8fac97a9ebb8686.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: Catalin Marinas <catalin.marinas@arm.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: I714a464d99cbd6b5a9b25c041310e730ec7da5e2
2021-01-19 21:47:31 -08:00
Andrey Konovalov
9655455b9e
UPSTREAM: kasan: remove __kasan_unpoison_stack
...
[ Upstream commit 77f57c9830 ]
There's no need for __kasan_unpoison_stack() helper, as it's only
currently used in a single place. Removing it also removes unneeded
arithmetic.
No functional changes.
Link: https://lkml.kernel.org/r/93e78948704a42ea92f6248ff8a725613d721161.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I2e9435e4517ad3c6600f18a2da7c29f00b889706
2021-01-19 21:47:31 -08:00
Andrey Konovalov
f3a6301925
UPSTREAM: kasan: allow VMAP_STACK for HW_TAGS mode
...
[ Upstream commit 38dd767dae ]
Even though hardware tag-based mode currently doesn't support checking
vmalloc allocations, it doesn't use shadow memory and works with
VMAP_STACK as is. Change VMAP_STACK definition accordingly.
Link: https://lkml.kernel.org/r/ecdb2a1658ebd88eb276dee2493518ac0e82de41.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Acked-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: 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: If249b8cae30451eaf52e22c489fdf81b807f3aa1
2021-01-19 21:47:31 -08:00
Andrey Konovalov
36c15efc62
UPSTREAM: kasan, arm64: unpoison stack only with CONFIG_KASAN_STACK
...
[ Upstream commit d56a9ef84b ]
There's a config option CONFIG_KASAN_STACK that has to be enabled for
KASAN to use stack instrumentation and perform validity checks for
stack variables.
There's no need to unpoison stack when CONFIG_KASAN_STACK is not enabled.
Only call kasan_unpoison_task_stack[_below]() when CONFIG_KASAN_STACK is
enabled.
Note, that CONFIG_KASAN_STACK is an option that is currently always
defined when CONFIG_KASAN is enabled, and therefore has to be tested
with #if instead of #ifdef.
Link: https://lkml.kernel.org/r/d09dd3f8abb388da397fd11598c5edeaa83fe559.1606162397.git.andreyknvl@google.com
Signed-off-by: Andrey Konovalov <andreyknvl@google.com >
Reviewed-by: Marco Elver <elver@google.com >
Acked-by: Catalin Marinas <catalin.marinas@arm.com >
Reviewed-by: Dmitry Vyukov <dvyukov@google.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: 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: I776d0e42a0b7238e1c810838f37d549a07af4582
2021-01-19 21:47:31 -08:00
Andrey Konovalov
2dbb829143
UPSTREAM: kasan: introduce set_alloc_info
...
[ Upstream commit 8bb0009b19 ]
Add set_alloc_info() helper and move kasan_set_track() into it. This will
simplify the code for one of the upcoming changes.
No functional changes.
Link: https://lkml.kernel.org/r/b2393e8f1e311a70fc3aaa2196461b6acdee7d21.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I53a1611acaf239fae63caa8e043039f9e56801b6
2021-01-19 21:47:30 -08:00
Andrey Konovalov
54597d5563
UPSTREAM: kasan: rename get_alloc/free_info
...
[ Upstream commit 6476792f10 ]
Rename get_alloc_info() and get_free_info() to kasan_get_alloc_meta() and
kasan_get_free_meta() to better reflect what those do and avoid confusion
with kasan_set_free_info().
No functional changes.
Link: https://lkml.kernel.org/r/27b7c036b754af15a2839e945f6d8bfce32b4c2f.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: Alexander Potapenko <glider@google.com >
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com >
Cc: Branislav Rankov <Branislav.Rankov@arm.com >
Cc: Catalin Marinas <catalin.marinas@arm.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: I772cab3faf6396314d4cb9f7df5d908df992588e
2021-01-19 21:47:30 -08:00
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