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 *);

Reply via email to