summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2018-12-28 03:29:53 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2018-12-28 15:11:43 -0500
commit2bd926b439b4cb6b9ed240a9781cd01958b53d85 (patch)
treebfdd9f2a3f0111b3a3510032aabdc6f90ce73ed4 /include
parentb938fcf42739de8270e6ea41593722929c8a7dd0 (diff)
kasan: add CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS
This commit splits the current CONFIG_KASAN config option into two: 1. CONFIG_KASAN_GENERIC, that enables the generic KASAN mode (the one that exists now); 2. CONFIG_KASAN_SW_TAGS, that enables the software tag-based KASAN mode. The name CONFIG_KASAN_SW_TAGS is chosen as in the future we will have another hardware tag-based KASAN mode, that will rely on hardware memory tagging support in arm64. With CONFIG_KASAN_SW_TAGS enabled, compiler options are changed to instrument kernel files with -fsantize=kernel-hwaddress (except the ones for which KASAN_SANITIZE := n is set). Both CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS support both CONFIG_KASAN_INLINE and CONFIG_KASAN_OUTLINE instrumentation modes. This commit also adds empty placeholder (for now) implementation of tag-based KASAN specific hooks inserted by the compiler and adjusts common hooks implementation. While this commit adds the CONFIG_KASAN_SW_TAGS config option, this option is not selectable, as it depends on HAVE_ARCH_KASAN_SW_TAGS, which we will enable once all the infrastracture code has been added. Link: http://lkml.kernel.org/r/b2550106eb8a68b10fefbabce820910b115aa853.1544099024.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Andrey Ryabinin <aryabinin@virtuozzo.com> Reviewed-by: Dmitry Vyukov <dvyukov@google.com> Cc: Christoph Lameter <cl@linux.com> Cc: Mark Rutland <mark.rutland@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>
Diffstat (limited to 'include')
-rw-r--r--include/linux/compiler-clang.h6
-rw-r--r--include/linux/compiler-gcc.h6
-rw-r--r--include/linux/compiler_attributes.h13
-rw-r--r--include/linux/kasan.h16
4 files changed, 23 insertions, 18 deletions
diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
index 3e7dafb3ea80..39f668d5066b 100644
--- a/include/linux/compiler-clang.h
+++ b/include/linux/compiler-clang.h
@@ -16,9 +16,13 @@
16/* all clang versions usable with the kernel support KASAN ABI version 5 */ 16/* all clang versions usable with the kernel support KASAN ABI version 5 */
17#define KASAN_ABI_VERSION 5 17#define KASAN_ABI_VERSION 5
18 18
19#if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer)
19/* emulate gcc's __SANITIZE_ADDRESS__ flag */ 20/* emulate gcc's __SANITIZE_ADDRESS__ flag */
20#if __has_feature(address_sanitizer)
21#define __SANITIZE_ADDRESS__ 21#define __SANITIZE_ADDRESS__
22#define __no_sanitize_address \
23 __attribute__((no_sanitize("address", "hwaddress")))
24#else
25#define __no_sanitize_address
22#endif 26#endif
23 27
24/* 28/*
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 2010493e1040..5776da43da97 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -143,6 +143,12 @@
143#define KASAN_ABI_VERSION 3 143#define KASAN_ABI_VERSION 3
144#endif 144#endif
145 145
146#if __has_attribute(__no_sanitize_address__)
147#define __no_sanitize_address __attribute__((no_sanitize_address))
148#else
149#define __no_sanitize_address
150#endif
151
146#if GCC_VERSION >= 50100 152#if GCC_VERSION >= 50100
147#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 153#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
148#endif 154#endif
diff --git a/include/linux/compiler_attributes.h b/include/linux/compiler_attributes.h
index fe07b680dd4a..19f32b0c29af 100644
--- a/include/linux/compiler_attributes.h
+++ b/include/linux/compiler_attributes.h
@@ -200,19 +200,6 @@
200#define __noreturn __attribute__((__noreturn__)) 200#define __noreturn __attribute__((__noreturn__))
201 201
202/* 202/*
203 * Optional: only supported since gcc >= 4.8
204 * Optional: not supported by icc
205 *
206 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fsanitize_005faddress-function-attribute
207 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-sanitize-address-no-address-safety-analysis
208 */
209#if __has_attribute(__no_sanitize_address__)
210# define __no_sanitize_address __attribute__((__no_sanitize_address__))
211#else
212# define __no_sanitize_address
213#endif
214
215/*
216 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute 203 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute
217 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute 204 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute
218 */ 205 */
diff --git a/include/linux/kasan.h b/include/linux/kasan.h
index 52c86a568a4e..b66fdf5ea7ab 100644
--- a/include/linux/kasan.h
+++ b/include/linux/kasan.h
@@ -45,8 +45,6 @@ void kasan_free_pages(struct page *page, unsigned int order);
45 45
46void kasan_cache_create(struct kmem_cache *cache, unsigned int *size, 46void kasan_cache_create(struct kmem_cache *cache, unsigned int *size,
47 slab_flags_t *flags); 47 slab_flags_t *flags);
48void kasan_cache_shrink(struct kmem_cache *cache);
49void kasan_cache_shutdown(struct kmem_cache *cache);
50 48
51void kasan_poison_slab(struct page *page); 49void kasan_poison_slab(struct page *page);
52void kasan_unpoison_object_data(struct kmem_cache *cache, void *object); 50void kasan_unpoison_object_data(struct kmem_cache *cache, void *object);
@@ -97,8 +95,6 @@ static inline void kasan_free_pages(struct page *page, unsigned int order) {}
97static inline void kasan_cache_create(struct kmem_cache *cache, 95static inline void kasan_cache_create(struct kmem_cache *cache,
98 unsigned int *size, 96 unsigned int *size,
99 slab_flags_t *flags) {} 97 slab_flags_t *flags) {}
100static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
101static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
102 98
103static inline void kasan_poison_slab(struct page *page) {} 99static inline void kasan_poison_slab(struct page *page) {}
104static inline void kasan_unpoison_object_data(struct kmem_cache *cache, 100static inline void kasan_unpoison_object_data(struct kmem_cache *cache,
@@ -155,4 +151,16 @@ static inline size_t kasan_metadata_size(struct kmem_cache *cache) { return 0; }
155 151
156#endif /* CONFIG_KASAN */ 152#endif /* CONFIG_KASAN */
157 153
154#ifdef CONFIG_KASAN_GENERIC
155
156void kasan_cache_shrink(struct kmem_cache *cache);
157void kasan_cache_shutdown(struct kmem_cache *cache);
158
159#else /* CONFIG_KASAN_GENERIC */
160
161static inline void kasan_cache_shrink(struct kmem_cache *cache) {}
162static inline void kasan_cache_shutdown(struct kmem_cache *cache) {}
163
164#endif /* CONFIG_KASAN_GENERIC */
165
158#endif /* LINUX_KASAN_H */ 166#endif /* LINUX_KASAN_H */