Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Instrument ufetch/ustore in kMSan, these were the last r...



details:   https://anonhg.NetBSD.org/src/rev/110e3f089b89
branches:  trunk
changeset: 846409:110e3f089b89
user:      maxv <maxv%NetBSD.org@localhost>
date:      Fri Nov 15 12:18:46 2019 +0000

description:
Instrument ufetch/ustore in kMSan, these were the last remaining functions.

diffstat:

 sys/kern/subr_msan.c |  189 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 sys/sys/systm.h      |   39 ++++++++++-
 2 files changed, 225 insertions(+), 3 deletions(-)

diffs (277 lines):

diff -r 05cc2df4e0f7 -r 110e3f089b89 sys/kern/subr_msan.c
--- a/sys/kern/subr_msan.c      Fri Nov 15 09:50:01 2019 +0000
+++ b/sys/kern/subr_msan.c      Fri Nov 15 12:18:46 2019 +0000
@@ -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 @@
 
 /* -------------------------------------------------------------------------- */
 
+#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
diff -r 05cc2df4e0f7 -r 110e3f089b89 sys/sys/systm.h
--- a/sys/sys/systm.h   Fri Nov 15 09:50:01 2019 +0000
+++ b/sys/sys/systm.h   Fri Nov 15 12:18:46 2019 +0000
@@ -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 @@
 #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 @@
 #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 *);



Home | Main Index | Thread Index | Old Index