| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: subr_msan.c,v 1.9 2020/04/03 18:26:14 maxv Exp $ */ | | 1 | /* $NetBSD: subr_msan.c,v 1.10 2020/04/15 16:28:28 maxv Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2019-2020 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2019-2020 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Maxime Villard. | | 8 | * by Maxime Villard. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -20,46 +20,49 @@ | | | @@ -20,46 +20,49 @@ |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #include <sys/cdefs.h> | | 32 | #include <sys/cdefs.h> |
33 | __KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.9 2020/04/03 18:26:14 maxv Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: subr_msan.c,v 1.10 2020/04/15 16:28:28 maxv Exp $"); |
34 | | | 34 | |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/device.h> | | 36 | #include <sys/device.h> |
37 | #include <sys/kernel.h> | | 37 | #include <sys/kernel.h> |
38 | #include <sys/param.h> | | 38 | #include <sys/param.h> |
39 | #include <sys/conf.h> | | 39 | #include <sys/conf.h> |
40 | #include <sys/systm.h> | | 40 | #include <sys/systm.h> |
41 | #include <sys/types.h> | | 41 | #include <sys/types.h> |
42 | #include <sys/kprintf.h> | | 42 | #include <sys/kprintf.h> |
43 | #include <sys/kmem.h> | | 43 | #include <sys/kmem.h> |
44 | #include <sys/mbuf.h> | | 44 | #include <sys/mbuf.h> |
45 | #include <sys/buf.h> | | 45 | #include <sys/buf.h> |
46 | #include <sys/cpu.h> | | 46 | #include <sys/cpu.h> |
47 | #include <sys/msan.h> | | 47 | #include <sys/msan.h> |
48 | | | 48 | |
49 | #include <uvm/uvm.h> | | 49 | #include <uvm/uvm.h> |
50 | | | 50 | |
51 | static void kmsan_printf(const char *, ...); | | 51 | static void kmsan_printf(const char *, ...); |
52 | | | 52 | |
| | | 53 | void kmsan_init_arg(size_t); |
| | | 54 | void kmsan_init_ret(size_t); |
| | | 55 | |
53 | #ifdef KMSAN_PANIC | | 56 | #ifdef KMSAN_PANIC |
54 | #define REPORT panic | | 57 | #define REPORT panic |
55 | #else | | 58 | #else |
56 | #define REPORT kmsan_printf | | 59 | #define REPORT kmsan_printf |
57 | #endif | | 60 | #endif |
58 | | | 61 | |
59 | /* -------------------------------------------------------------------------- */ | | 62 | /* -------------------------------------------------------------------------- */ |
60 | | | 63 | |
61 | /* | | 64 | /* |
62 | * Part of the compiler ABI. | | 65 | * Part of the compiler ABI. |
63 | */ | | 66 | */ |
64 | | | 67 | |
65 | typedef uint32_t msan_orig_t; | | 68 | typedef uint32_t msan_orig_t; |
| @@ -346,29 +349,26 @@ kmsan_shadow_check(const void *addr, siz | | | @@ -346,29 +349,26 @@ kmsan_shadow_check(const void *addr, siz |
346 | return; | | 349 | return; |
347 | if (__predict_false(kmsan_md_unsupported((vaddr_t)addr))) | | 350 | if (__predict_false(kmsan_md_unsupported((vaddr_t)addr))) |
348 | return; | | 351 | return; |
349 | | | 352 | |
350 | shad = kmsan_md_addr_to_shad(addr); | | 353 | shad = kmsan_md_addr_to_shad(addr); |
351 | for (i = 0; i < size; i++) { | | 354 | for (i = 0; i < size; i++) { |
352 | if (__predict_true(shad[i] == 0)) | | 355 | if (__predict_true(shad[i] == 0)) |
353 | continue; | | 356 | continue; |
354 | kmsan_report_hook((const char *)addr + i, size, i, hook); | | 357 | kmsan_report_hook((const char *)addr + i, size, i, hook); |
355 | break; | | 358 | break; |
356 | } | | 359 | } |
357 | } | | 360 | } |
358 | | | 361 | |
359 | void kmsan_init_arg(size_t); | | | |
360 | void kmsan_init_ret(size_t); | | | |
361 | | | | |
362 | void | | 362 | void |
363 | kmsan_init_arg(size_t n) | | 363 | kmsan_init_arg(size_t n) |
364 | { | | 364 | { |
365 | msan_lwp_t *lwp; | | 365 | msan_lwp_t *lwp; |
366 | uint8_t *arg; | | 366 | uint8_t *arg; |
367 | | | 367 | |
368 | if (__predict_false(!kmsan_enabled)) | | 368 | if (__predict_false(!kmsan_enabled)) |
369 | return; | | 369 | return; |
370 | lwp = curlwp->l_kmsan; | | 370 | lwp = curlwp->l_kmsan; |
371 | arg = lwp->tls[lwp->ctx].param; | | 371 | arg = lwp->tls[lwp->ctx].param; |
372 | __builtin_memset(arg, 0, n); | | 372 | __builtin_memset(arg, 0, n); |
373 | } | | 373 | } |
374 | | | 374 | |