Module Name: src Committed By: maxv Date: Fri Nov 15 12:18:46 UTC 2019
Modified Files: src/sys/kern: subr_msan.c src/sys/sys: systm.h Log Message: Instrument ufetch/ustore in kMSan, these were the last remaining functions. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/kern/subr_msan.c cvs rdiff -u -r1.290 -r1.291 src/sys/sys/systm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_msan.c diff -u src/sys/kern/subr_msan.c:1.1 src/sys/kern/subr_msan.c:1.2 --- src/sys/kern/subr_msan.c:1.1 Thu Nov 14 16:23:52 2019 +++ src/sys/kern/subr_msan.c Fri Nov 15 12:18:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_msan.c,v 1.1 2019/11/14 16:23:52 maxv Exp $ */ +/* $NetBSD: subr_msan.c,v 1.2 2019/11/15 12:18:46 maxv Exp $ */ /* * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #define KMSAN_NO_INST #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.1 2019/11/14 16:23:52 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.2 2019/11/15 12:18:46 maxv Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -870,6 +870,191 @@ kmsan_copyoutstr(const void *kaddr, void /* -------------------------------------------------------------------------- */ +#undef _ucas_32 +#undef _ucas_32_mp +#undef _ucas_64 +#undef _ucas_64_mp +#undef _ufetch_8 +#undef _ufetch_16 +#undef _ufetch_32 +#undef _ufetch_64 +#undef _ustore_8 +#undef _ustore_16 +#undef _ustore_32 +#undef _ustore_64 + +int _ucas_32(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +int kmsan__ucas_32(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +int +kmsan__ucas_32(volatile uint32_t *uaddr, uint32_t old, uint32_t new, + uint32_t *ret) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(old) + + sizeof(new) + sizeof(ret), "ucas_32"); + _ret = _ucas_32(uaddr, old, new, ret); + if (_ret == 0) + kmsan_shadow_fill(ret, KMSAN_STATE_INITED, sizeof(*ret)); + kmsan_init_ret(sizeof(int)); + return _ret; +} + +#ifdef __HAVE_UCAS_MP +int _ucas_32_mp(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +int kmsan__ucas_32_mp(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +int +kmsan__ucas_32_mp(volatile uint32_t *uaddr, uint32_t old, uint32_t new, + uint32_t *ret) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(old) + + sizeof(new) + sizeof(ret), "ucas_32_mp"); + _ret = _ucas_32_mp(uaddr, old, new, ret); + if (_ret == 0) + kmsan_shadow_fill(ret, KMSAN_STATE_INITED, sizeof(*ret)); + kmsan_init_ret(sizeof(int)); + return _ret; +} +#endif + +#ifdef _LP64 +int _ucas_64(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +int kmsan__ucas_64(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +int +kmsan__ucas_64(volatile uint64_t *uaddr, uint64_t old, uint64_t new, + uint64_t *ret) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(old) + + sizeof(new) + sizeof(ret), "ucas_64"); + _ret = _ucas_64(uaddr, old, new, ret); + if (_ret == 0) + kmsan_shadow_fill(ret, KMSAN_STATE_INITED, sizeof(*ret)); + kmsan_init_ret(sizeof(int)); + return _ret; +} + +#ifdef __HAVE_UCAS_MP +int _ucas_64_mp(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +int kmsan__ucas_64_mp(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +int +kmsan__ucas_64_mp(volatile uint64_t *uaddr, uint64_t old, uint64_t new, + uint64_t *ret) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(old) + + sizeof(new) + sizeof(ret), "ucas_64_mp"); + _ret = _ucas_64_mp(uaddr, old, new, ret); + if (_ret == 0) + kmsan_shadow_fill(ret, KMSAN_STATE_INITED, sizeof(*ret)); + kmsan_init_ret(sizeof(int)); + return _ret; +} +#endif +#endif + +int _ufetch_8(const uint8_t *, uint8_t *); +int kmsan__ufetch_8(const uint8_t *, uint8_t *); +int +kmsan__ufetch_8(const uint8_t *uaddr, uint8_t *valp) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(valp), "ufetch_8"); + _ret = _ufetch_8(uaddr, valp); + if (_ret == 0) + kmsan_shadow_fill(valp, KMSAN_STATE_INITED, sizeof(*valp)); + kmsan_init_ret(sizeof(int)); + return _ret; +} + +int _ufetch_16(const uint16_t *, uint16_t *); +int kmsan__ufetch_16(const uint16_t *, uint16_t *); +int +kmsan__ufetch_16(const uint16_t *uaddr, uint16_t *valp) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(valp), "ufetch_16"); + _ret = _ufetch_16(uaddr, valp); + if (_ret == 0) + kmsan_shadow_fill(valp, KMSAN_STATE_INITED, sizeof(*valp)); + kmsan_init_ret(sizeof(int)); + return _ret; +} + +int _ufetch_32(const uint32_t *, uint32_t *); +int kmsan__ufetch_32(const uint32_t *, uint32_t *); +int +kmsan__ufetch_32(const uint32_t *uaddr, uint32_t *valp) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(valp), "ufetch_32"); + _ret = _ufetch_32(uaddr, valp); + if (_ret == 0) + kmsan_shadow_fill(valp, KMSAN_STATE_INITED, sizeof(*valp)); + kmsan_init_ret(sizeof(int)); + return _ret; +} + +#ifdef _LP64 +int _ufetch_64(const uint64_t *, uint64_t *); +int kmsan__ufetch_64(const uint64_t *, uint64_t *); +int +kmsan__ufetch_64(const uint64_t *uaddr, uint64_t *valp) +{ + int _ret; + kmsan_check_arg(sizeof(uaddr) + sizeof(valp), "ufetch_64"); + _ret = _ufetch_64(uaddr, valp); + if (_ret == 0) + kmsan_shadow_fill(valp, KMSAN_STATE_INITED, sizeof(*valp)); + kmsan_init_ret(sizeof(int)); + return _ret; +} +#endif + +int _ustore_8(uint8_t *, uint8_t); +int kmsan__ustore_8(uint8_t *, uint8_t); +int +kmsan__ustore_8(uint8_t *uaddr, uint8_t val) +{ + kmsan_check_arg(sizeof(uaddr) + sizeof(val), "ustore_8"); + kmsan_init_ret(sizeof(int)); + return _ustore_8(uaddr, val); +} + +int _ustore_16(uint16_t *, uint16_t); +int kmsan__ustore_16(uint16_t *, uint16_t); +int +kmsan__ustore_16(uint16_t *uaddr, uint16_t val) +{ + kmsan_check_arg(sizeof(uaddr) + sizeof(val), "ustore_16"); + kmsan_init_ret(sizeof(int)); + return _ustore_16(uaddr, val); +} + +int _ustore_32(uint32_t *, uint32_t); +int kmsan__ustore_32(uint32_t *, uint32_t); +int +kmsan__ustore_32(uint32_t *uaddr, uint32_t val) +{ + kmsan_check_arg(sizeof(uaddr) + sizeof(val), "ustore_32"); + kmsan_init_ret(sizeof(int)); + return _ustore_32(uaddr, val); +} + +#ifdef _LP64 +int _ustore_64(uint64_t *, uint64_t); +int kmsan__ustore_64(uint64_t *, uint64_t); +int +kmsan__ustore_64(uint64_t *uaddr, uint64_t val) +{ + kmsan_check_arg(sizeof(uaddr) + sizeof(val), "ustore_64"); + kmsan_init_ret(sizeof(int)); + return _ustore_64(uaddr, val); +} +#endif + +/* -------------------------------------------------------------------------- */ + #undef atomic_add_32 #undef atomic_add_int #undef atomic_add_long Index: src/sys/sys/systm.h diff -u src/sys/sys/systm.h:1.290 src/sys/sys/systm.h:1.291 --- src/sys/sys/systm.h:1.290 Fri Nov 15 08:11:36 2019 +++ src/sys/sys/systm.h Fri Nov 15 12:18:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: systm.h,v 1.290 2019/11/15 08:11:36 maxv Exp $ */ +/* $NetBSD: systm.h,v 1.291 2019/11/15 12:18:46 maxv Exp $ */ /*- * Copyright (c) 1982, 1988, 1991, 1993 @@ -46,6 +46,7 @@ #include "opt_kasan.h" #include "opt_kcsan.h" #include "opt_kleak.h" +#include "opt_kmsan.h" #include "opt_wsdisplay_compat.h" #endif #if !defined(_KERNEL) && !defined(_STANDALONE) @@ -397,6 +398,21 @@ int kasan__ucas_64_mp(volatile uint64_t #define _ucas_32_mp kasan__ucas_32_mp #define _ucas_64 kasan__ucas_64 #define _ucas_64_mp kasan__ucas_64_mp +#elif defined(KMSAN) +int kmsan__ucas_32(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +#ifdef __HAVE_UCAS_MP +int kmsan__ucas_32_mp(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); +#endif /* __HAVE_UCAS_MP */ +#ifdef _LP64 +int kmsan__ucas_64(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +#ifdef __HAVE_UCAS_MP +int kmsan__ucas_64_mp(volatile uint64_t *, uint64_t, uint64_t, uint64_t *); +#endif /* __HAVE_UCAS_MP */ +#endif /* _LP64 */ +#define _ucas_32 kmsan__ucas_32 +#define _ucas_32_mp kmsan__ucas_32_mp +#define _ucas_64 kmsan__ucas_64 +#define _ucas_64_mp kmsan__ucas_64_mp #else int _ucas_32(volatile uint32_t *, uint32_t, uint32_t, uint32_t *); #ifdef __HAVE_UCAS_MP @@ -431,6 +447,27 @@ int _ustore_64(uint64_t *, uint64_t); #define _ufetch_16 kasan__ufetch_16 #define _ufetch_32 kasan__ufetch_32 #define _ufetch_64 kasan__ufetch_64 +#elif defined(KMSAN) +int kmsan__ufetch_8(const uint8_t *, uint8_t *); +int kmsan__ufetch_16(const uint16_t *, uint16_t *); +int kmsan__ufetch_32(const uint32_t *, uint32_t *); +#ifdef _LP64 +int kmsan__ufetch_64(const uint64_t *, uint64_t *); +#endif +int kmsan__ustore_8(uint8_t *, uint8_t); +int kmsan__ustore_16(uint16_t *, uint16_t); +int kmsan__ustore_32(uint32_t *, uint32_t); +#ifdef _LP64 +int kmsan__ustore_64(uint64_t *, uint64_t); +#endif +#define _ufetch_8 kmsan__ufetch_8 +#define _ufetch_16 kmsan__ufetch_16 +#define _ufetch_32 kmsan__ufetch_32 +#define _ufetch_64 kmsan__ufetch_64 +#define _ustore_8 kmsan__ustore_8 +#define _ustore_16 kmsan__ustore_16 +#define _ustore_32 kmsan__ustore_32 +#define _ustore_64 kmsan__ustore_64 #else int _ufetch_8(const uint8_t *, uint8_t *); int _ufetch_16(const uint16_t *, uint16_t *);