Module Name: src Committed By: maxv Date: Sat Oct 27 06:35:54 UTC 2018
Modified Files: src/sys/arch/amd64/amd64: asan.c Log Message: Rename kasan_shadow_fill, remove one check in it, and inline it. Remove the use-after-scope code for now, because our GCC does not support that and when it does we will want to test the feature for real rather than letting a potentially broken code compile. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/amd64/amd64/asan.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/amd64/amd64/asan.c diff -u src/sys/arch/amd64/amd64/asan.c:1.9 src/sys/arch/amd64/amd64/asan.c:1.10 --- src/sys/arch/amd64/amd64/asan.c:1.9 Sat Oct 27 06:06:31 2018 +++ src/sys/arch/amd64/amd64/asan.c Sat Oct 27 06:35:54 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: asan.c,v 1.9 2018/10/27 06:06:31 maxv Exp $ */ +/* $NetBSD: asan.c,v 1.10 2018/10/27 06:35:54 maxv Exp $ */ /* * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: asan.c,v 1.9 2018/10/27 06:06:31 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: asan.c,v 1.10 2018/10/27 06:35:54 maxv Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -330,13 +330,20 @@ kasan_report(unsigned long addr, size_t #define KASAN_STACK_PARTIAL 0xF4 #define KASAN_USE_AFTER_SCOPE 0xF8 -static void -kasan_shadow_fill(const void *addr, size_t size, uint8_t val) +static __always_inline void +kasan_shadow_1byte_markvalid(unsigned long addr) +{ + int8_t *byte = kasan_addr_to_shad((void *)addr); + int8_t last = (addr & KASAN_SHADOW_MASK) + 1; + + *byte = last; +} + +static __always_inline void +kasan_shadow_Nbyte_fill(const void *addr, size_t size, uint8_t val) { void *shad; - if (__predict_false(!kasan_enabled)) - return; if (__predict_false(size == 0)) return; if (__predict_false(kasan_unsupported((vaddr_t)addr))) @@ -351,15 +358,6 @@ kasan_shadow_fill(const void *addr, size __builtin_memset(shad, val, size); } -static __always_inline void -kasan_shadow_1byte_markvalid(unsigned long addr) -{ - int8_t *byte = kasan_addr_to_shad((void *)addr); - int8_t last = (addr & KASAN_SHADOW_MASK) + 1; - - *byte = last; -} - void kasan_add_redzone(size_t *size) { @@ -380,7 +378,7 @@ kasan_markmem(const void *addr, size_t s } } else { KASSERT(size % KASAN_SHADOW_SCALE_SIZE == 0); - kasan_shadow_fill(addr, size, KASAN_MEMORY_REDZONE); + kasan_shadow_Nbyte_fill(addr, size, KASAN_MEMORY_REDZONE); } } @@ -389,7 +387,7 @@ kasan_softint(struct lwp *l) { const void *stk = (const void *)uvm_lwp_getuarea(l); - kasan_shadow_fill(stk, USPACE, 0); + kasan_shadow_Nbyte_fill(stk, USPACE, 0); } void @@ -681,8 +679,6 @@ void __asan_loadN_noabort(unsigned long, void __asan_storeN(unsigned long, size_t); void __asan_storeN_noabort(unsigned long, size_t); void __asan_handle_no_return(void); -void __asan_poison_stack_memory(const void *, size_t); -void __asan_unpoison_stack_memory(const void *, size_t); void __asan_loadN(unsigned long addr, size_t size) @@ -714,20 +710,6 @@ __asan_handle_no_return(void) /* nothing */ } -void -__asan_poison_stack_memory(const void *addr, size_t size) -{ - KASSERT((vaddr_t)addr % KASAN_SHADOW_SCALE_SIZE == 0); - kasan_shadow_fill(addr, size, KASAN_USE_AFTER_SCOPE); -} - -void -__asan_unpoison_stack_memory(const void *addr, size_t size) -{ - KASSERT((vaddr_t)addr % KASAN_SHADOW_SCALE_SIZE == 0); - kasan_shadow_fill(addr, size, 0); -} - #define ASAN_SET_SHADOW(byte) \ void __asan_set_shadow_##byte(void *, size_t); \ void __asan_set_shadow_##byte(void *addr, size_t size) \