diff options
author | Mark Johnston <markj@FreeBSD.org> | 2021-07-19 20:09:42 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2021-07-30 01:13:32 +0000 |
commit | a90d053b84223a4e5cb65852a9b6193570ab1c7d (patch) | |
tree | c5df8f2fecf5adc97c33c7d93a9e168c85d0a940 /sys | |
parent | 419d406e4ee068644218fb881bc80f79f8191970 (diff) | |
download | src-a90d053b84223a4e5cb65852a9b6193570ab1c7d.tar.gz src-a90d053b84223a4e5cb65852a9b6193570ab1c7d.zip |
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/amd64/copyout.c | 8 | ||||
-rw-r--r-- | sys/amd64/include/atomic.h | 12 | ||||
-rw-r--r-- | sys/arm64/include/bus.h | 12 | ||||
-rw-r--r-- | sys/conf/kern.pre.mk | 6 | ||||
-rw-r--r-- | sys/kern/subr_asan.c | 2 | ||||
-rw-r--r-- | sys/kern/subr_csan.c | 2 | ||||
-rw-r--r-- | sys/sys/atomic_san.h | 10 | ||||
-rw-r--r-- | sys/sys/bus_san.h | 11 | ||||
-rw-r--r-- | sys/sys/libkern.h | 16 | ||||
-rw-r--r-- | sys/sys/systm.h | 34 | ||||
-rw-r--r-- | sys/x86/include/bus.h | 12 |
11 files changed, 45 insertions, 80 deletions
diff --git a/sys/amd64/amd64/copyout.c b/sys/amd64/amd64/copyout.c index 0e96944c4a23..36e817635694 100644 --- a/sys/amd64/amd64/copyout.c +++ b/sys/amd64/amd64/copyout.c @@ -32,6 +32,10 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#ifdef SAN_NEEDS_INTERCEPTORS +#define SAN_RUNTIME +#endif + #include <sys/param.h> #include <sys/systm.h> @@ -146,10 +150,6 @@ DEFINE_IFUNC(, int, casueword, (volatile u_long *, u_long, u_long *, u_long)) casueword_smap : casueword_nosmap); } -#undef copyinstr -#undef copyin -#undef copyout - int copyinstr_nosmap(const void *udaddr, void *kaddr, size_t len, size_t *lencopied); int copyinstr_smap(const void *udaddr, void *kaddr, size_t len, diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h index c821e77e5b8b..4a9095ca831b 100644 --- a/sys/amd64/include/atomic.h +++ b/sys/amd64/include/atomic.h @@ -68,15 +68,7 @@ #define OFFSETOF_MONITORBUF 0x100 #endif -#ifndef SAN_RUNTIME -#if defined(KASAN) -#define ATOMIC_SAN_PREFIX kasan -#elif defined(KCSAN) -#define ATOMIC_SAN_PREFIX kcsan -#endif -#endif - -#ifdef ATOMIC_SAN_PREFIX +#if defined(SAN_NEEDS_INTERCEPTORS) && !defined(SAN_RUNTIME) #include <sys/atomic_san.h> #else #include <sys/atomic_common.h> @@ -687,6 +679,6 @@ u_long atomic_swap_long(volatile u_long *p, u_long v); #endif /* !WANT_FUNCTIONS */ -#endif /* !ATOMIC_SAN_PREFIX */ +#endif /* !SAN_NEEDS_INTERCEPTORS || SAN_RUNTIME */ #endif /* !_MACHINE_ATOMIC_H_ */ diff --git a/sys/arm64/include/bus.h b/sys/arm64/include/bus.h index 61573b27728d..a87577b00f0c 100644 --- a/sys/arm64/include/bus.h +++ b/sys/arm64/include/bus.h @@ -92,15 +92,7 @@ #define BUS_SPACE_BARRIER_READ 0x01 #define BUS_SPACE_BARRIER_WRITE 0x02 -#ifndef SAN_RUNTIME -#if defined(KASAN) -#define BUS_SAN_PREFIX kasan -#elif defined(KCSAN) -#define BUS_SAN_PREFIX kcsan -#endif -#endif - -#ifdef BUS_SAN_PREFIX +#ifdef SAN_NEEDS_INTERCEPTORS #include <sys/bus_san.h> #else @@ -506,7 +498,7 @@ struct bus_space { #define bus_space_peek_4(t, h, o, vp) __bs_peek(4, (t), (h), (o), (vp)) #define bus_space_peek_8(t, h, o, vp) __bs_peek(8, (t), (h), (o), (vp)) -#endif +#endif /* !SAN_NEEDS_INTERCEPTORS */ #include <machine/bus_dma.h> diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk index 539605f60ca0..221c0aa22d9d 100644 --- a/sys/conf/kern.pre.mk +++ b/sys/conf/kern.pre.mk @@ -94,7 +94,8 @@ ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS} ${ASM_CFLAGS.${.IMPSRC:T}} KASAN_ENABLED!= grep KASAN opt_global.h || true ; echo .if !empty(KASAN_ENABLED) -SAN_CFLAGS+= -fsanitize=kernel-address \ +SAN_CFLAGS+= -DSAN_NEEDS_INTERCEPTORS -DSAN_INTERCEPTOR_PREFIX=kasan \ + -fsanitize=kernel-address \ -mllvm -asan-stack=true \ -mllvm -asan-instrument-dynamic-allocas=true \ -mllvm -asan-globals=true \ @@ -104,7 +105,8 @@ SAN_CFLAGS+= -fsanitize=kernel-address \ KCSAN_ENABLED!= grep KCSAN opt_global.h || true ; echo .if !empty(KCSAN_ENABLED) -SAN_CFLAGS+= -fsanitize=thread +SAN_CFLAGS+= -DSAN_NEEDS_INTERCEPTORS -DSAN_INTERCEPTOR_PREFIX=kcsan \ + -fsanitize=thread .endif KUBSAN_ENABLED!= grep KUBSAN opt_global.h || true ; echo diff --git a/sys/kern/subr_asan.c b/sys/kern/subr_asan.c index 825d7d4228c0..7083a8e64540 100644 --- a/sys/kern/subr_asan.c +++ b/sys/kern/subr_asan.c @@ -523,7 +523,6 @@ kasan_copyout(const void *kaddr, void *uaddr, size_t len) /* -------------------------------------------------------------------------- */ #include <machine/atomic.h> -#define ATOMIC_SAN_PREFIX kasan #include <sys/atomic_san.h> #define _ASAN_ATOMIC_FUNC_ADD(name, type) \ @@ -785,7 +784,6 @@ kasan_atomic_interrupt_fence(void) #include <sys/bus.h> #include <machine/bus.h> -#define BUS_SAN_PREFIX kasan #include <sys/bus_san.h> int diff --git a/sys/kern/subr_csan.c b/sys/kern/subr_csan.c index 56d2e59ff12c..7bed25076fa9 100644 --- a/sys/kern/subr_csan.c +++ b/sys/kern/subr_csan.c @@ -374,7 +374,6 @@ kcsan_copyout(const void *kaddr, void *uaddr, size_t len) /* -------------------------------------------------------------------------- */ #include <machine/atomic.h> -#define ATOMIC_SAN_PREFIX kcsan #include <sys/atomic_san.h> #define _CSAN_ATOMIC_FUNC_ADD(name, type) \ @@ -689,7 +688,6 @@ kcsan_atomic_interrupt_fence(void) #include <sys/bus.h> #include <machine/bus.h> -#define BUS_SAN_PREFIX kcsan #include <sys/bus_san.h> int diff --git a/sys/sys/atomic_san.h b/sys/sys/atomic_san.h index 5d10f58f7565..30bd01c97cf2 100644 --- a/sys/sys/atomic_san.h +++ b/sys/sys/atomic_san.h @@ -43,10 +43,6 @@ #error do not include this header, use machine/atomic.h #endif -#ifndef ATOMIC_SAN_PREFIX -#error No sanitizer prefix available -#endif - #define ATOMIC_SAN_FUNC_1(sp, op, name, type) \ void sp##_atomic_##op##_##name(volatile type *, type); \ void sp##_atomic_##op##_acq_##name(volatile type *, type); \ @@ -104,7 +100,7 @@ ATOMIC_SAN_THREAD_FENCE(sp); #define ATOMIC_SAN_FUNCS(name, type) \ - _ATOMIC_SAN_FUNCS(ATOMIC_SAN_PREFIX, name, type) + _ATOMIC_SAN_FUNCS(SAN_INTERCEPTOR_PREFIX, name, type) ATOMIC_SAN_FUNCS(char, uint8_t); ATOMIC_SAN_FUNCS(short, uint16_t); @@ -123,8 +119,8 @@ ATOMIC_SAN_FUNCS(64, uint64_t); * For instance, KASAN callers of atomic_add_char() will be redirected to * kasan_atomic_add_char(). */ -#define ATOMIC_SAN(func) \ - __CONCAT(ATOMIC_SAN_PREFIX, __CONCAT(_atomic_, func)) +#define ATOMIC_SAN(func) \ + __CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_atomic_, func)) #define atomic_add_char ATOMIC_SAN(add_char) #define atomic_add_acq_char ATOMIC_SAN(add_acq_char) diff --git a/sys/sys/bus_san.h b/sys/sys/bus_san.h index 05d5ecd4b844..fd3c4c803675 100644 --- a/sys/sys/bus_san.h +++ b/sys/sys/bus_san.h @@ -43,10 +43,6 @@ #error do not include this header, use machine/bus.h #endif -#ifndef BUS_SAN_PREFIX -#error No sanitizer prefix defined -#endif - #define BUS_SAN_MULTI(sp, rw, width, type) \ void sp##_bus_space_##rw##_multi_##width(bus_space_tag_t, \ bus_space_handle_t, bus_size_t, type *, bus_size_t); \ @@ -122,7 +118,7 @@ BUS_SAN_MISC(sp); #define BUS_SAN_FUNCS(width, type) \ - _BUS_SAN_FUNCS(BUS_SAN_PREFIX, width, type) + _BUS_SAN_FUNCS(SAN_INTERCEPTOR_PREFIX, width, type) BUS_SAN_FUNCS(1, uint8_t); BUS_SAN_FUNCS(2, uint16_t); @@ -131,7 +127,8 @@ BUS_SAN_FUNCS(8, uint64_t); #ifndef SAN_RUNTIME -#define BUS_SAN(func) __CONCAT(BUS_SAN_PREFIX, __CONCAT(_bus_space_, func)) +#define BUS_SAN(func) \ + __CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_bus_space_, func)) #define bus_space_map BUS_SAN(map) #define bus_space_unmap BUS_SAN(unmap) @@ -224,6 +221,6 @@ BUS_SAN_FUNCS(8, uint64_t); #define bus_space_poke_8 BUS_SAN(poke_8) #define bus_space_peek_8 BUS_SAN(peek_8) -#endif /* !KCSAN_RUNTIME */ +#endif /* !SAN_RUNTIME */ #endif /* !_SYS_BUS_SAN_H_ */ diff --git a/sys/sys/libkern.h b/sys/sys/libkern.h index d8d3dce1b705..147eba9bd1bd 100644 --- a/sys/sys/libkern.h +++ b/sys/sys/libkern.h @@ -193,7 +193,11 @@ size_t strspn(const char *, const char *); char *strstr(const char *, const char *); int strvalid(const char *, size_t); -#ifdef SAN_PREFIX +#ifdef SAN_NEEDS_INTERCEPTORS +#ifndef SAN_INTERCEPTOR +#define SAN_INTERCEPTOR(func) \ + __CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_, func)) +#endif char *SAN_INTERCEPTOR(strcpy)(char *, const char *); int SAN_INTERCEPTOR(strcmp)(const char *, const char *); size_t SAN_INTERCEPTOR(strlen)(const char *); @@ -202,11 +206,11 @@ size_t SAN_INTERCEPTOR(strlen)(const char *); #define strcmp(s1, s2) SAN_INTERCEPTOR(strcmp)((s1), (s2)) #define strlen(s) SAN_INTERCEPTOR(strlen)(s) #endif /* !SAN_RUNTIME */ -#else -#define strcpy(d, s) __builtin_strcpy((d), (s)) -#define strcmp(s1, s2) __builtin_strcmp((s1), (s2)) -#define strlen(s) __builtin_strlen((s)) -#endif /* SAN_PREFIX */ +#else /* !SAN_NEEDS_INTERCEPTORS */ +#define strcpy(d, s) __builtin_strcpy((d), (s)) +#define strcmp(s1, s2) __builtin_strcmp((s1), (s2)) +#define strlen(s) __builtin_strlen((s)) +#endif /* SAN_NEEDS_INTERCEPTORS */ static __inline char * index(const char *p, int ch) diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 8080f22266e2..671b5c2b8d38 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -351,15 +351,9 @@ void *memcpy(void * _Nonnull to, const void * _Nonnull from, size_t len); void *memmove(void * _Nonnull dest, const void * _Nonnull src, size_t n); int memcmp(const void *b1, const void *b2, size_t len); -#if defined(KASAN) -#define SAN_PREFIX kasan_ -#elif defined(KCSAN) -#define SAN_PREFIX kcsan_ -#endif - -#ifdef SAN_PREFIX -#define SAN_INTERCEPTOR(func) __CONCAT(SAN_PREFIX, func) - +#ifdef SAN_NEEDS_INTERCEPTORS +#define SAN_INTERCEPTOR(func) \ + __CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_, func)) void *SAN_INTERCEPTOR(memset)(void *, int, size_t); void *SAN_INTERCEPTOR(memcpy)(void *, const void *, size_t); void *SAN_INTERCEPTOR(memmove)(void *, const void *, size_t); @@ -373,15 +367,15 @@ int SAN_INTERCEPTOR(memcmp)(const void *, const void *, size_t); #define memmove(dest, src, n) SAN_INTERCEPTOR(memmove)((dest), (src), (n)) #define memcmp(b1, b2, len) SAN_INTERCEPTOR(memcmp)((b1), (b2), (len)) #endif /* !SAN_RUNTIME */ -#else -#define bcopy(from, to, len) __builtin_memmove((to), (from), (len)) -#define bzero(buf, len) __builtin_memset((buf), 0, (len)) -#define bcmp(b1, b2, len) __builtin_memcmp((b1), (b2), (len)) -#define memset(buf, c, len) __builtin_memset((buf), (c), (len)) -#define memcpy(to, from, len) __builtin_memcpy((to), (from), (len)) -#define memmove(dest, src, n) __builtin_memmove((dest), (src), (n)) -#define memcmp(b1, b2, len) __builtin_memcmp((b1), (b2), (len)) -#endif /* !SAN_PREFIX */ +#else /* !SAN_NEEDS_INTERCEPTORS */ +#define bcopy(from, to, len) __builtin_memmove((to), (from), (len)) +#define bzero(buf, len) __builtin_memset((buf), 0, (len)) +#define bcmp(b1, b2, len) __builtin_memcmp((b1), (b2), (len)) +#define memset(buf, c, len) __builtin_memset((buf), (c), (len)) +#define memcpy(to, from, len) __builtin_memcpy((to), (from), (len)) +#define memmove(dest, src, n) __builtin_memmove((dest), (src), (n)) +#define memcmp(b1, b2, len) __builtin_memcmp((b1), (b2), (len)) +#endif /* SAN_NEEDS_INTERCEPTORS */ void *memset_early(void * _Nonnull buf, int c, size_t len); #define bzero_early(buf, len) memset_early((buf), 0, (len)) @@ -412,7 +406,7 @@ int copyout(const void * _Nonnull __restrict kaddr, int copyout_nofault(const void * _Nonnull __restrict kaddr, void * __restrict udaddr, size_t len); -#ifdef SAN_PREFIX +#ifdef SAN_NEEDS_INTERCEPTORS int SAN_INTERCEPTOR(copyin)(const void *, void *, size_t); int SAN_INTERCEPTOR(copyinstr)(const void *, void *, size_t, size_t *); int SAN_INTERCEPTOR(copyout)(const void *, void *, size_t); @@ -421,7 +415,7 @@ int SAN_INTERCEPTOR(copyout)(const void *, void *, size_t); #define copyinstr(u, k, l, lc) SAN_INTERCEPTOR(copyinstr)((u), (k), (l), (lc)) #define copyout(k, u, l) SAN_INTERCEPTOR(copyout)((k), (u), (l)) #endif /* !SAN_RUNTIME */ -#endif /* SAN_PREFIX */ +#endif /* SAN_NEEDS_INTERCEPTORS */ int fubyte(volatile const void *base); long fuword(volatile const void *base); diff --git a/sys/x86/include/bus.h b/sys/x86/include/bus.h index 0ba68e250b3d..9522e5db7c78 100644 --- a/sys/x86/include/bus.h +++ b/sys/x86/include/bus.h @@ -135,15 +135,7 @@ #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ #define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ -#ifndef SAN_RUNTIME -#if defined(KASAN) -#define BUS_SAN_PREFIX kasan -#elif defined(KCSAN) -#define BUS_SAN_PREFIX kcsan -#endif -#endif - -#ifdef BUS_SAN_PREFIX +#if defined(SAN_NEEDS_INTERCEPTORS) && !defined(SAN_RUNTIME) #include <sys/bus_san.h> #else @@ -1129,6 +1121,6 @@ BUS_POKE_FUNC(4, uint32_t) BUS_POKE_FUNC(8, uint64_t) #endif -#endif /* !BUS_SAN_PREFIX */ +#endif /* !SAN_NEEDS_INTERCEPTORS && SAN_RUNTIME */ #endif /* !_MACHINE_BUS_H_ */ |