diff options
-rw-r--r-- | arch/x86/include/asm/page_64_types.h | 12 | ||||
-rw-r--r-- | arch/x86/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/x86/mm/kasan_init_64.c | 11 | ||||
-rw-r--r-- | include/linux/init_task.h | 8 | ||||
-rw-r--r-- | mm/kasan/kasan.h | 9 | ||||
-rw-r--r-- | mm/kasan/report.c | 6 | ||||
-rw-r--r-- | scripts/Makefile.kasan | 1 |
7 files changed, 44 insertions, 5 deletions
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index 75450b2c7be4..4edd53b79a81 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h | |||
@@ -1,17 +1,23 @@ | |||
1 | #ifndef _ASM_X86_PAGE_64_DEFS_H | 1 | #ifndef _ASM_X86_PAGE_64_DEFS_H |
2 | #define _ASM_X86_PAGE_64_DEFS_H | 2 | #define _ASM_X86_PAGE_64_DEFS_H |
3 | 3 | ||
4 | #define THREAD_SIZE_ORDER 2 | 4 | #ifdef CONFIG_KASAN |
5 | #define KASAN_STACK_ORDER 1 | ||
6 | #else | ||
7 | #define KASAN_STACK_ORDER 0 | ||
8 | #endif | ||
9 | |||
10 | #define THREAD_SIZE_ORDER (2 + KASAN_STACK_ORDER) | ||
5 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) | 11 | #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) |
6 | #define CURRENT_MASK (~(THREAD_SIZE - 1)) | 12 | #define CURRENT_MASK (~(THREAD_SIZE - 1)) |
7 | 13 | ||
8 | #define EXCEPTION_STACK_ORDER 0 | 14 | #define EXCEPTION_STACK_ORDER (0 + KASAN_STACK_ORDER) |
9 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) | 15 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) |
10 | 16 | ||
11 | #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) | 17 | #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) |
12 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) | 18 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) |
13 | 19 | ||
14 | #define IRQ_STACK_ORDER 2 | 20 | #define IRQ_STACK_ORDER (2 + KASAN_STACK_ORDER) |
15 | #define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER) | 21 | #define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER) |
16 | 22 | ||
17 | #define DOUBLEFAULT_STACK 1 | 23 | #define DOUBLEFAULT_STACK 1 |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index b13b70634124..cdb1b70ddad0 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -17,6 +17,8 @@ CFLAGS_REMOVE_early_printk.o = -pg | |||
17 | endif | 17 | endif |
18 | 18 | ||
19 | KASAN_SANITIZE_head$(BITS).o := n | 19 | KASAN_SANITIZE_head$(BITS).o := n |
20 | KASAN_SANITIZE_dumpstack.o := n | ||
21 | KASAN_SANITIZE_dumpstack_$(BITS).o := n | ||
20 | 22 | ||
21 | CFLAGS_irq.o := -I$(src)/../include/asm/trace | 23 | CFLAGS_irq.o := -I$(src)/../include/asm/trace |
22 | 24 | ||
diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c index 3e4d9a1a39fa..53508708b7aa 100644 --- a/arch/x86/mm/kasan_init_64.c +++ b/arch/x86/mm/kasan_init_64.c | |||
@@ -189,11 +189,18 @@ void __init kasan_init(void) | |||
189 | if (map_range(&pfn_mapped[i])) | 189 | if (map_range(&pfn_mapped[i])) |
190 | panic("kasan: unable to allocate shadow!"); | 190 | panic("kasan: unable to allocate shadow!"); |
191 | } | 191 | } |
192 | |||
193 | populate_zero_shadow(kasan_mem_to_shadow((void *)PAGE_OFFSET + MAXMEM), | 192 | populate_zero_shadow(kasan_mem_to_shadow((void *)PAGE_OFFSET + MAXMEM), |
194 | (void *)KASAN_SHADOW_END); | 193 | kasan_mem_to_shadow((void *)__START_KERNEL_map)); |
194 | |||
195 | vmemmap_populate((unsigned long)kasan_mem_to_shadow(_stext), | ||
196 | (unsigned long)kasan_mem_to_shadow(_end), | ||
197 | NUMA_NO_NODE); | ||
198 | |||
199 | populate_zero_shadow(kasan_mem_to_shadow((void *)MODULES_VADDR), | ||
200 | (void *)KASAN_SHADOW_END); | ||
195 | 201 | ||
196 | memset(kasan_zero_page, 0, PAGE_SIZE); | 202 | memset(kasan_zero_page, 0, PAGE_SIZE); |
197 | 203 | ||
198 | load_cr3(init_level4_pgt); | 204 | load_cr3(init_level4_pgt); |
205 | init_task.kasan_depth = 0; | ||
199 | } | 206 | } |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index d3d43ecf148c..696d22312b31 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -175,6 +175,13 @@ extern struct task_group root_task_group; | |||
175 | # define INIT_NUMA_BALANCING(tsk) | 175 | # define INIT_NUMA_BALANCING(tsk) |
176 | #endif | 176 | #endif |
177 | 177 | ||
178 | #ifdef CONFIG_KASAN | ||
179 | # define INIT_KASAN(tsk) \ | ||
180 | .kasan_depth = 1, | ||
181 | #else | ||
182 | # define INIT_KASAN(tsk) | ||
183 | #endif | ||
184 | |||
178 | /* | 185 | /* |
179 | * INIT_TASK is used to set up the first task table, touch at | 186 | * INIT_TASK is used to set up the first task table, touch at |
180 | * your own risk!. Base=0, limit=0x1fffff (=2MB) | 187 | * your own risk!. Base=0, limit=0x1fffff (=2MB) |
@@ -250,6 +257,7 @@ extern struct task_group root_task_group; | |||
250 | INIT_RT_MUTEXES(tsk) \ | 257 | INIT_RT_MUTEXES(tsk) \ |
251 | INIT_VTIME(tsk) \ | 258 | INIT_VTIME(tsk) \ |
252 | INIT_NUMA_BALANCING(tsk) \ | 259 | INIT_NUMA_BALANCING(tsk) \ |
260 | INIT_KASAN(tsk) \ | ||
253 | } | 261 | } |
254 | 262 | ||
255 | 263 | ||
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index 5b052ab40cf9..1fcc1d81a9cf 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h | |||
@@ -12,6 +12,15 @@ | |||
12 | #define KASAN_KMALLOC_REDZONE 0xFC /* redzone inside slub object */ | 12 | #define KASAN_KMALLOC_REDZONE 0xFC /* redzone inside slub object */ |
13 | #define KASAN_KMALLOC_FREE 0xFB /* object was freed (kmem_cache_free/kfree) */ | 13 | #define KASAN_KMALLOC_FREE 0xFB /* object was freed (kmem_cache_free/kfree) */ |
14 | 14 | ||
15 | /* | ||
16 | * Stack redzone shadow values | ||
17 | * (Those are compiler's ABI, don't change them) | ||
18 | */ | ||
19 | #define KASAN_STACK_LEFT 0xF1 | ||
20 | #define KASAN_STACK_MID 0xF2 | ||
21 | #define KASAN_STACK_RIGHT 0xF3 | ||
22 | #define KASAN_STACK_PARTIAL 0xF4 | ||
23 | |||
15 | 24 | ||
16 | struct kasan_access_info { | 25 | struct kasan_access_info { |
17 | const void *access_addr; | 26 | const void *access_addr; |
diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 2760edb4d0a8..866732ef3db3 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c | |||
@@ -64,6 +64,12 @@ static void print_error_description(struct kasan_access_info *info) | |||
64 | case 0 ... KASAN_SHADOW_SCALE_SIZE - 1: | 64 | case 0 ... KASAN_SHADOW_SCALE_SIZE - 1: |
65 | bug_type = "out of bounds access"; | 65 | bug_type = "out of bounds access"; |
66 | break; | 66 | break; |
67 | case KASAN_STACK_LEFT: | ||
68 | case KASAN_STACK_MID: | ||
69 | case KASAN_STACK_RIGHT: | ||
70 | case KASAN_STACK_PARTIAL: | ||
71 | bug_type = "out of bounds on stack"; | ||
72 | break; | ||
67 | } | 73 | } |
68 | 74 | ||
69 | pr_err("BUG: KASan: %s in %pS at addr %p\n", | 75 | pr_err("BUG: KASan: %s in %pS at addr %p\n", |
diff --git a/scripts/Makefile.kasan b/scripts/Makefile.kasan index 7acd6faa0335..2163b8cc446e 100644 --- a/scripts/Makefile.kasan +++ b/scripts/Makefile.kasan | |||
@@ -9,6 +9,7 @@ CFLAGS_KASAN_MINIMAL := -fsanitize=kernel-address | |||
9 | 9 | ||
10 | CFLAGS_KASAN := $(call cc-option, -fsanitize=kernel-address \ | 10 | CFLAGS_KASAN := $(call cc-option, -fsanitize=kernel-address \ |
11 | -fasan-shadow-offset=$(CONFIG_KASAN_SHADOW_OFFSET) \ | 11 | -fasan-shadow-offset=$(CONFIG_KASAN_SHADOW_OFFSET) \ |
12 | --param asan-stack=1 \ | ||
12 | --param asan-instrumentation-with-call-threshold=$(call_threshold)) | 13 | --param asan-instrumentation-with-call-threshold=$(call_threshold)) |
13 | 14 | ||
14 | ifeq ($(call cc-option, $(CFLAGS_KASAN_MINIMAL) -Werror),) | 15 | ifeq ($(call cc-option, $(CFLAGS_KASAN_MINIMAL) -Werror),) |