40__KERNEL_RCSID(0,
"$NetBSD: subr_msan.c,v 1.14 2020/09/09 16:29:59 maxv Exp $");
49#include <sys/kernel.h>
50#include <sys/linker.h>
51#include <sys/malloc.h>
53#include <sys/memdesc.h>
57#include <sys/sysctl.h>
61#include <cam/cam_ccb.h>
66#include <machine/msan.h>
67#include <machine/stdarg.h>
83#define MSAN_PARAM_SIZE 800
84#define MSAN_RETVAL_SIZE 800
97#define MSAN_NCONTEXT 4
98#define MSAN_ORIG_MASK (~0x3)
111static uint8_t msan_dummy_shad[PAGE_SIZE]
__aligned(PAGE_SIZE);
112static uint8_t msan_dummy_write_shad[PAGE_SIZE]
__aligned(PAGE_SIZE);
113static uint8_t msan_dummy_orig[PAGE_SIZE]
__aligned(PAGE_SIZE);
122#define kmsan_panic(f, ...) do { \
123 kmsan_enabled = false; \
124 panic(f, __VA_ARGS__); \
127#define REPORT(f, ...) do { \
128 if (panic_on_violation) { \
129 kmsan_panic(f, __VA_ARGS__); \
134 printf(f "\n", __VA_ARGS__); \
135 stack_print_ddb(&st); \
141static SYSCTL_NODE(_debug, OID_AUTO, kmsan, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
147 "Panic if an invalid access is detected");
153static inline const char *
157 case KMSAN_TYPE_STACK:
159 case KMSAN_TYPE_KMEM:
161 case KMSAN_TYPE_MALLOC:
174 const char *
typename;
187 orig = (msan_orig_t *)kmsan_md_addr_to_orig((vm_offset_t)
addr);
191 REPORT(
"MSan: Uninitialized memory in %s, offset %zu",
196 kmsan_md_orig_decode(*orig, &
type, &ptr);
200 sizeof(
buf), &foff) == 0) {
201 REPORT(
"MSan: Uninitialized %s memory in %s, "
202 "offset %zu/%zu, addr %p, from %s+%#lx",
203 typename, hook, off, size,
addr,
buf, foff);
204 }
else if (__builtin_memcmp((
void *)ptr,
"----", 4) == 0) {
209 var = (
char *)ptr + 4;
210 strlcpy(
buf, var,
sizeof(
buf));
212 fn = strchr(
buf,
'@');
214 REPORT(
"MSan: Uninitialized %s memory in %s, offset %zu, "
215 "variable '%s' from %s",
typename, hook, off, var, fn);
217 REPORT(
"MSan: Uninitialized %s memory in %s, "
218 "offset %zu/%zu, addr %p, PC %p",
219 typename, hook, off, size,
addr, (
void *)ptr);
230 const char *
typename;
244 REPORT(
"MSan: uninitialized variable in %p", (
void *)pc);
248 kmsan_md_orig_decode(orig, &
type, &ptr);
252 sizeof(
buf), &foff) == 0) {
253 REPORT(
"MSan: Uninitialized %s memory from %s+%#lx",
254 typename,
buf, foff);
255 }
else if (__builtin_memcmp((
void *)ptr,
"----", 4) == 0) {
260 var = (
char *)ptr + 4;
261 strlcpy(
buf, var,
sizeof(
buf));
263 fn = strchr(
buf,
'@');
265 REPORT(
"MSan: Uninitialized variable '%s' from %s", var, fn);
267 REPORT(
"MSan: Uninitialized %s memory, origin %x",
283 if (__predict_false(!kmsan_enabled)) {
284 ret.
shad = write ? msan_dummy_write_shad : msan_dummy_shad;
285 ret.
orig = (msan_orig_t *)msan_dummy_orig;
286 }
else if (__predict_false(kmsan_md_unsupported((vm_offset_t)
addr))) {
287 ret.
shad = write ? msan_dummy_write_shad : msan_dummy_shad;
288 ret.
orig = (msan_orig_t *)msan_dummy_orig;
290 ret.
shad = (
void *)kmsan_md_addr_to_shad((vm_offset_t)
addr);
292 (msan_orig_t *)kmsan_md_addr_to_orig((vm_offset_t)
addr);
293 ret.
orig = (msan_orig_t *)((uintptr_t)ret.
orig &
306 if (__predict_false(!kmsan_enabled))
308 if (__predict_false(kmsan_md_unsupported((vm_offset_t)
addr)))
311 orig = (msan_orig_t *)kmsan_md_addr_to_orig((vm_offset_t)
addr);
312 size += ((uintptr_t)orig & (
sizeof(*orig) - 1));
315 for (i = 0; i < size; i += 4) {
325 if (__predict_false(!kmsan_enabled))
327 if (__predict_false(kmsan_md_unsupported(
addr)))
330 shad = (uint8_t *)kmsan_md_addr_to_shad(
addr);
331 __builtin_memset(shad, c, size);
337 uint8_t *orig_src, *orig_dst;
338 uint8_t *shad_src, *shad_dst;
339 msan_orig_t *_src, *_dst;
342 if (__predict_false(!kmsan_enabled))
344 if (__predict_false(kmsan_md_unsupported((vm_offset_t)dst)))
346 if (__predict_false(kmsan_md_unsupported((vm_offset_t)
src))) {
351 shad_src = (uint8_t *)kmsan_md_addr_to_shad((vm_offset_t)
src);
352 shad_dst = (uint8_t *)kmsan_md_addr_to_shad((vm_offset_t)dst);
353 __builtin_memmove(shad_dst, shad_src, size);
355 orig_src = (uint8_t *)kmsan_md_addr_to_orig((vm_offset_t)
src);
356 orig_dst = (uint8_t *)kmsan_md_addr_to_orig((vm_offset_t)dst);
357 for (i = 0; i < size; i++) {
372 if (__predict_false(!kmsan_enabled))
374 if (__predict_false(kmsan_md_unsupported(
addr)))
377 shad = (uint8_t *)kmsan_md_addr_to_shad(
addr);
378 for (i = 0; i < size; i++) {
379 if (__predict_true(shad[i] == 0))
392 if (__predict_false(!kmsan_enabled))
394 if (__predict_false(curthread == NULL))
396 mtd = curthread->td_kmsan;
398 __builtin_memset(arg, 0, n);
407 if (__predict_false(!kmsan_enabled))
409 if (__predict_false(curthread == NULL))
411 mtd = curthread->td_kmsan;
413 __builtin_memset(arg, 0, n);
423 if (__predict_false(!kmsan_enabled))
425 if (__predict_false(curthread == NULL))
427 mtd = curthread->td_kmsan;
430 for (i = 0; i < size; i++) {
431 if (__predict_true(arg[i] == 0))
451 mtd =
malloc(
sizeof(*mtd), M_KMSAN, M_WAITOK);
456 if (td->td_kstack != 0)
457 kmsan_mark((
void *)td->td_kstack, ptoa(td->td_kstack_pages),
470 if (__predict_false(td == curthread))
471 kmsan_panic(
"%s: freeing KMSAN TLS for curthread", __func__);
487 if (__predict_false(!kmsan_enabled))
490 mtd = curthread->td_kmsan;
501 if (__predict_false(!kmsan_enabled))
504 mtd = curthread->td_kmsan;
505 if (__predict_false(mtd->
ctx == 0))
518 MPASS(
addr % PAGE_SIZE == 0);
519 MPASS(size % PAGE_SIZE == 0);
526 va = kmsan_md_addr_to_shad(
addr);
527 for (i = 0; i < npages; i++) {
528 pmap_san_enter(va + ptoa(i));
531 va = kmsan_md_addr_to_orig(
addr);
532 for (i = 0; i < npages; i++) {
533 pmap_san_enter(va + ptoa(i));
542 orig = kmsan_md_orig_encode(
type, pc);
561 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_IN)
563 if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR)
566 switch (ccb->ccb_h.func_code) {
568 const struct ccb_scsiio *scsiio;
571 kmsan_mark(scsiio->data_ptr, scsiio->dxfer_len, c);
575 const struct ccb_ataio *ataio;
578 kmsan_mark(ataio->data_ptr, ataio->dxfer_len, c);
582 const struct ccb_nvmeio *nvmeio;
584 nvmeio = &ccb->nvmeio;
585 kmsan_mark(nvmeio->data_ptr, nvmeio->dxfer_len, c);
590 ccb->ccb_h.func_code);
598 if ((m->m_flags & M_EXTPG) == 0)
619 if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_OUT)
621 switch (ccb->ccb_h.func_code) {
623 const struct ccb_scsiio *scsiio;
626 kmsan_check(scsiio->data_ptr, scsiio->dxfer_len, descr);
630 const struct ccb_ataio *ataio;
633 kmsan_check(ataio->data_ptr, ataio->dxfer_len, descr);
637 const struct ccb_nvmeio *nvmeio;
639 nvmeio = &ccb->nvmeio;
640 kmsan_check(nvmeio->data_ptr, nvmeio->dxfer_len, descr);
645 ccb->ccb_h.func_code);
654 }
while ((m = m->m_next) != NULL);
663 TUNABLE_INT_FETCH(
"debug.kmsan.disabled", &disabled);
672 kmsan_enabled =
true;
692#define MSAN_META_FUNC(size) \
693 msan_meta_t __msan_metadata_ptr_for_load_##size(void *); \
694 msan_meta_t __msan_metadata_ptr_for_load_##size(void *addr) \
696 return (kmsan_meta_get(addr, size, false)); \
698 msan_meta_t __msan_metadata_ptr_for_store_##size(void *); \
699 msan_meta_t __msan_metadata_ptr_for_store_##size(void *addr) \
701 return (kmsan_meta_get(addr, size, true)); \
747 orig = kmsan_md_orig_encode(KMSAN_TYPE_STACK, (uintptr_t)descr);
761 if (__predict_false(!kmsan_enabled))
775 if (__predict_false(!kmsan_enabled || curthread == NULL))
777 mtd = curthread->td_kmsan;
778 return (&mtd->
tls[mtd->
ctx]);
793 if (__predict_true(len != 0)) {
796 return (__builtin_memcpy(dst,
src, len));
802 const uint8_t *_b1 = b1, *_b2 = b2;
809 for (i = 0; i < len; i++) {
815 return (*_b1 - *_b2);
829 return (__builtin_memset(dst, c, len));
836 if (__predict_true(len != 0)) {
840 return (__builtin_memmove(dst,
src, len));
850 const char *_src =
src;
873 const char *_s1 = s1, *_s2 = s2;
894 return (*(
const unsigned char *)s1 - *(
const unsigned char *)s2);
927 ret = copyin(uaddr, kaddr, len);
941 return (copyout(kaddr, uaddr, len));
951 sizeof(len) +
sizeof(done),
"copyinstr():args");
952 ret = copyinstr(uaddr, kaddr, len, &_done);
982 ret = fuword16(base);
993 ret = fueword(base, val);
1007 ret = fueword32(base, val);
1021 ret = fueword64(base, val);
1035 ret = subyte(base,
byte);
1046 ret = suword(base, word);
1057 ret = suword16(base, word);
1068 ret = suword32(base, word);
1079 ret = suword64(base, word);
1091 sizeof(newval),
"casueword32(): args");
1092 ret = casueword32(base, oldval, oldvalp, newval);
1106 sizeof(newval),
"casueword32(): args");
1107 ret = casueword(base, oldval, oldvalp, newval);
1116#include <machine/atomic.h>
1117#include <sys/atomic_san.h>
1119#define _MSAN_ATOMIC_FUNC_ADD(name, type) \
1120 void kmsan_atomic_add_##name(volatile type *ptr, type val) \
1122 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1123 "atomic_add_" #name "():args"); \
1124 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1125 "atomic_add_" #name "():ptr"); \
1126 atomic_add_##name(ptr, val); \
1129#define MSAN_ATOMIC_FUNC_ADD(name, type) \
1130 _MSAN_ATOMIC_FUNC_ADD(name, type) \
1131 _MSAN_ATOMIC_FUNC_ADD(acq_##name, type) \
1132 _MSAN_ATOMIC_FUNC_ADD(rel_##name, type)
1134#define _MSAN_ATOMIC_FUNC_SUBTRACT(name, type) \
1135 void kmsan_atomic_subtract_##name(volatile type *ptr, type val) \
1137 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1138 "atomic_subtract_" #name "():args"); \
1139 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1140 "atomic_subtract_" #name "():ptr"); \
1141 atomic_subtract_##name(ptr, val); \
1144#define MSAN_ATOMIC_FUNC_SUBTRACT(name, type) \
1145 _MSAN_ATOMIC_FUNC_SUBTRACT(name, type) \
1146 _MSAN_ATOMIC_FUNC_SUBTRACT(acq_##name, type) \
1147 _MSAN_ATOMIC_FUNC_SUBTRACT(rel_##name, type)
1149#define _MSAN_ATOMIC_FUNC_SET(name, type) \
1150 void kmsan_atomic_set_##name(volatile type *ptr, type val) \
1152 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1153 "atomic_set_" #name "():args"); \
1154 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1155 "atomic_set_" #name "():ptr"); \
1156 atomic_set_##name(ptr, val); \
1159#define MSAN_ATOMIC_FUNC_SET(name, type) \
1160 _MSAN_ATOMIC_FUNC_SET(name, type) \
1161 _MSAN_ATOMIC_FUNC_SET(acq_##name, type) \
1162 _MSAN_ATOMIC_FUNC_SET(rel_##name, type)
1164#define _MSAN_ATOMIC_FUNC_CLEAR(name, type) \
1165 void kmsan_atomic_clear_##name(volatile type *ptr, type val) \
1167 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1168 "atomic_clear_" #name "():args"); \
1169 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1170 "atomic_clear_" #name "():ptr"); \
1171 atomic_clear_##name(ptr, val); \
1174#define MSAN_ATOMIC_FUNC_CLEAR(name, type) \
1175 _MSAN_ATOMIC_FUNC_CLEAR(name, type) \
1176 _MSAN_ATOMIC_FUNC_CLEAR(acq_##name, type) \
1177 _MSAN_ATOMIC_FUNC_CLEAR(rel_##name, type)
1179#define MSAN_ATOMIC_FUNC_FETCHADD(name, type) \
1180 type kmsan_atomic_fetchadd_##name(volatile type *ptr, type val) \
1182 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1183 "atomic_fetchadd_" #name "():args"); \
1184 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1185 "atomic_fetchadd_" #name "():ptr"); \
1186 kmsan_init_ret(sizeof(type)); \
1187 return (atomic_fetchadd_##name(ptr, val)); \
1190#define MSAN_ATOMIC_FUNC_READANDCLEAR(name, type) \
1191 type kmsan_atomic_readandclear_##name(volatile type *ptr) \
1193 kmsan_check_arg(sizeof(ptr), \
1194 "atomic_readandclear_" #name "():args"); \
1195 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1196 "atomic_readandclear_" #name "():ptr"); \
1197 kmsan_init_ret(sizeof(type)); \
1198 return (atomic_readandclear_##name(ptr)); \
1201#define MSAN_ATOMIC_FUNC_TESTANDCLEAR(name, type) \
1202 int kmsan_atomic_testandclear_##name(volatile type *ptr, u_int v) \
1204 kmsan_check_arg(sizeof(ptr) + sizeof(v), \
1205 "atomic_testandclear_" #name "():args"); \
1206 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1207 "atomic_testandclear_" #name "():ptr"); \
1208 kmsan_init_ret(sizeof(int)); \
1209 return (atomic_testandclear_##name(ptr, v)); \
1212#define MSAN_ATOMIC_FUNC_TESTANDSET(name, type) \
1213 int kmsan_atomic_testandset_##name(volatile type *ptr, u_int v) \
1215 kmsan_check_arg(sizeof(ptr) + sizeof(v), \
1216 "atomic_testandset_" #name "():args"); \
1217 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1218 "atomic_testandset_" #name "():ptr"); \
1219 kmsan_init_ret(sizeof(int)); \
1220 return (atomic_testandset_##name(ptr, v)); \
1223#define MSAN_ATOMIC_FUNC_SWAP(name, type) \
1224 type kmsan_atomic_swap_##name(volatile type *ptr, type val) \
1226 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1227 "atomic_swap_" #name "():args"); \
1228 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1229 "atomic_swap_" #name "():ptr"); \
1230 kmsan_init_ret(sizeof(type)); \
1231 return (atomic_swap_##name(ptr, val)); \
1234#define _MSAN_ATOMIC_FUNC_CMPSET(name, type) \
1235 int kmsan_atomic_cmpset_##name(volatile type *ptr, type oval, \
1238 kmsan_check_arg(sizeof(ptr) + sizeof(oval) + \
1239 sizeof(nval), "atomic_cmpset_" #name "():args"); \
1240 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1241 "atomic_cmpset_" #name "():ptr"); \
1242 kmsan_init_ret(sizeof(int)); \
1243 return (atomic_cmpset_##name(ptr, oval, nval)); \
1246#define MSAN_ATOMIC_FUNC_CMPSET(name, type) \
1247 _MSAN_ATOMIC_FUNC_CMPSET(name, type) \
1248 _MSAN_ATOMIC_FUNC_CMPSET(acq_##name, type) \
1249 _MSAN_ATOMIC_FUNC_CMPSET(rel_##name, type)
1251#define _MSAN_ATOMIC_FUNC_FCMPSET(name, type) \
1252 int kmsan_atomic_fcmpset_##name(volatile type *ptr, type *oval, \
1255 kmsan_check_arg(sizeof(ptr) + sizeof(oval) + \
1256 sizeof(nval), "atomic_fcmpset_" #name "():args"); \
1257 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1258 "atomic_fcmpset_" #name "():ptr"); \
1259 kmsan_init_ret(sizeof(int)); \
1260 return (atomic_fcmpset_##name(ptr, oval, nval)); \
1263#define MSAN_ATOMIC_FUNC_FCMPSET(name, type) \
1264 _MSAN_ATOMIC_FUNC_FCMPSET(name, type) \
1265 _MSAN_ATOMIC_FUNC_FCMPSET(acq_##name, type) \
1266 _MSAN_ATOMIC_FUNC_FCMPSET(rel_##name, type)
1268#define MSAN_ATOMIC_FUNC_THREAD_FENCE(name) \
1269 void kmsan_atomic_thread_fence_##name(void) \
1271 atomic_thread_fence_##name(); \
1274#define _MSAN_ATOMIC_FUNC_LOAD(name, type) \
1275 type kmsan_atomic_load_##name(volatile type *ptr) \
1277 kmsan_check_arg(sizeof(ptr), \
1278 "atomic_load_" #name "():args"); \
1279 kmsan_shadow_check((uintptr_t)ptr, sizeof(type), \
1280 "atomic_load_" #name "():ptr"); \
1281 kmsan_init_ret(sizeof(type)); \
1282 return (atomic_load_##name(ptr)); \
1285#define MSAN_ATOMIC_FUNC_LOAD(name, type) \
1286 _MSAN_ATOMIC_FUNC_LOAD(name, type) \
1287 _MSAN_ATOMIC_FUNC_LOAD(acq_##name, type)
1289#define _MSAN_ATOMIC_FUNC_STORE(name, type) \
1290 void kmsan_atomic_store_##name(volatile type *ptr, type val) \
1292 kmsan_check_arg(sizeof(ptr) + sizeof(val), \
1293 "atomic_store_" #name "():args"); \
1294 kmsan_shadow_fill((uintptr_t)ptr, KMSAN_STATE_INITED, \
1296 atomic_store_##name(ptr, val); \
1299#define MSAN_ATOMIC_FUNC_STORE(name, type) \
1300 _MSAN_ATOMIC_FUNC_STORE(name, type) \
1301 _MSAN_ATOMIC_FUNC_STORE(rel_##name, type)
1406 atomic_interrupt_fence();
1412#include <machine/bus.h>
1413#include <sys/bus_san.h>
1417 int flags, bus_space_handle_t *handlep)
1419 return (bus_space_map(tag, hnd, size,
flags, handlep));
1426 bus_space_unmap(tag, hnd, size);
1431 bus_size_t offset, bus_size_t size, bus_space_handle_t *handlep)
1433 return (bus_space_subregion(tag, hnd, offset, size, handlep));
1440 bus_space_free(tag, hnd, size);
1445 bus_size_t offset, bus_size_t size,
int flags)
1447 bus_space_barrier(tag, hnd, offset, size,
flags);
1451#define MSAN_BUS_READ_FUNC(func, width, type) \
1452 type kmsan_bus_space_read##func##_##width(bus_space_tag_t tag, \
1453 bus_space_handle_t hnd, bus_size_t offset) \
1456 if ((tag) != X86_BUS_SPACE_IO) \
1457 kmsan_shadow_fill((uintptr_t)(hnd + offset), \
1458 KMSAN_STATE_INITED, (width)); \
1459 ret = bus_space_read##func##_##width(tag, hnd, offset); \
1460 kmsan_init_ret(sizeof(type)); \
1464#define MSAN_BUS_READ_PTR_FUNC(func, width, type) \
1465 void kmsan_bus_space_read_##func##_##width(bus_space_tag_t tag, \
1466 bus_space_handle_t hnd, bus_size_t size, type *buf, \
1469 kmsan_shadow_fill((uintptr_t)buf, KMSAN_STATE_INITED, \
1471 bus_space_read_##func##_##width(tag, hnd, size, buf, \
1498#define MSAN_BUS_WRITE_FUNC(func, width, type) \
1499 void kmsan_bus_space_write##func##_##width(bus_space_tag_t tag, \
1500 bus_space_handle_t hnd, bus_size_t offset, type value) \
1502 bus_space_write##func##_##width(tag, hnd, offset, value);\
1505#define MSAN_BUS_WRITE_PTR_FUNC(func, width, type) \
1506 void kmsan_bus_space_write_##func##_##width(bus_space_tag_t tag,\
1507 bus_space_handle_t hnd, bus_size_t size, const type *buf, \
1510 kmsan_shadow_check((uintptr_t)buf, sizeof(type) * count,\
1511 "bus_space_write()"); \
1512 bus_space_write_##func##_##width(tag, hnd, size, buf, \
1539#define MSAN_BUS_SET_FUNC(func, width, type) \
1540 void kmsan_bus_space_set_##func##_##width(bus_space_tag_t tag, \
1541 bus_space_handle_t hnd, bus_size_t offset, type value, \
1544 bus_space_set_##func##_##width(tag, hnd, offset, value, \
1574 if ((op & (BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE)) ==
1575 BUS_DMASYNC_PREWRITE) {
1576 switch (desc->md_type) {
1593 kmsan_panic(
"%s: unhandled memdesc type %d", __func__,
1597 if ((op & BUS_DMASYNC_POSTREAD) != 0) {
1598 switch (desc->md_type) {
1600 kmsan_mark(desc->u.md_vaddr, desc->md_opaque,
1601 KMSAN_STATE_INITED);
1615 kmsan_panic(
"%s: unhandled memdesc type %d", __func__,
device_property_type_t type
int linker_ddb_search_symbol_name(caddr_t value, char *buf, u_int buflen, long *offset)
void *() malloc(size_t size, struct malloc_type *mtp, int flags)
void free(void *addr, struct malloc_type *mtp)
struct intr_irqsrc ** src
msan_tls_t tls[MSAN_NCONTEXT]
msan_orig_t retval_origin
uint8_t param_shadow[MSAN_PARAM_SIZE]
uint64_t va_arg_overflow_size
uint8_t retval_shadow[MSAN_RETVAL_SIZE]
u_char __read_frequently kdb_active
void __msan_poison_alloca(const void *, uint64_t, const char *)
void * kmsan_memmove(void *dst, const void *src, size_t len)
void kmsan_thread_free(struct thread *td)
FEATURE(kmsan, "Kernel memory sanitizer")
void kmsan_thread_alloc(struct thread *td)
static void kmsan_report_inline(msan_orig_t orig, unsigned long pc)
void __msan_instrument_asm_store(const void *, size_t)
int kmsan_fueword32(volatile const void *base, int32_t *val)
void kmsan_check_bio(const struct bio *bp, const char *descr)
#define MSAN_ATOMIC_FUNC_THREAD_FENCE(name)
void kmsan_init_ret(size_t)
void kmsan_orig(const void *addr, size_t size, int type, uintptr_t pc)
char * kmsan_strcpy(char *dst, const char *src)
int kmsan_fueword64(volatile const void *base, int64_t *val)
static bool panic_on_violation
#define MSAN_ATOMIC_FUNC_FETCHADD(name, type)
void kmsan_check(const void *p, size_t sz, const char *descr)
#define MSAN_BUS_READ_PTR_FUNC(func, width, type)
#define MSAN_ATOMIC_FUNC_LOAD(name, type)
void kmsan_bus_space_unmap(bus_space_tag_t tag, bus_space_handle_t hnd, bus_size_t size)
#define MSAN_BUS_WRITE_PTR_FUNC(func, width, type)
void * kmsan_memcpy(void *dst, const void *src, size_t len)
static void kmsan_report_hook(const void *addr, size_t size, size_t off, const char *hook)
size_t kmsan_strlen(const char *str)
static void kmsan_shadow_fill(uintptr_t addr, uint8_t c, size_t size)
void kmsan_intr_leave(void)
#define MSAN_ATOMIC_FUNC_TESTANDSET(name, type)
static void kmsan_shadow_check(uintptr_t addr, size_t size, const char *hook)
static SYSCTL_NODE(_debug, OID_AUTO, kmsan, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "KMSAN options")
#define MSAN_ATOMIC_FUNC_STORE(name, type)
#define MSAN_BUS_READ_FUNC(func, width, type)
int kmsan_memcmp(const void *b1, const void *b2, size_t len)
msan_tls_t * __msan_get_context_state(void)
static msan_meta_t kmsan_meta_get(const void *addr, size_t size, const bool write)
#define MSAN_ATOMIC_FUNC_ADD(name, type)
#define MSAN_BUS_SET_FUNC(func, width, type)
int kmsan_suword(volatile void *base, long word)
int kmsan_suword32(volatile void *base, int32_t word)
void kmsan_shadow_map(vm_offset_t addr, size_t size)
int kmsan_copyin(const void *, void *, size_t)
int kmsan_casueword(volatile u_long *base, u_long oldval, u_long *oldvalp, u_long newval)
msan_meta_t __msan_metadata_ptr_for_store_n(void *, size_t)
int kmsan_suword64(volatile void *base, int64_t word)
static void kmsan_mark_ccb(const union ccb *ccb, uint8_t c)
struct kmsan_td msan_td_t
#define MSAN_ATOMIC_FUNC_TESTANDCLEAR(name, type)
static bool kmsan_reporting
#define MSAN_ATOMIC_FUNC_CMPSET(name, type)
static void kmsan_check_arg(size_t size, const char *hook)
#define MSAN_ATOMIC_FUNC_READANDCLEAR(name, type)
int kmsan_copyinstr(const void *, void *, size_t, size_t *)
void kmsan_atomic_interrupt_fence(void)
int kmsan_fueword(volatile const void *base, long *val)
#define MSAN_BUS_WRITE_FUNC(func, width, type)
msan_meta_t __msan_metadata_ptr_for_load_n(void *, size_t)
int kmsan_subyte(volatile void *base, int byte)
void kmsan_mark_bio(const struct bio *bp, uint8_t c)
void kmsan_mark_mbuf(const struct mbuf *m, uint8_t c)
void kmsan_bus_space_free(bus_space_tag_t tag, bus_space_handle_t hnd, bus_size_t size)
SYSCTL_BOOL(_debug_kmsan, OID_AUTO, panic_on_violation, CTLFLAG_RWTUN, &panic_on_violation, 0, "Panic if an invalid access is detected")
#define MSAN_ATOMIC_FUNC_SWAP(name, type)
static msan_td_t msan_thread0
void kmsan_bus_dmamap_sync(struct memdesc *desc, bus_dmasync_op_t op)
void kmsan_mark(const void *addr, size_t size, uint8_t c)
void __msan_unpoison_alloca(const void *, uint64_t)
void kmsan_check_mbuf(const struct mbuf *m, const char *descr)
static bool kmsan_enabled __read_mostly
int kmsan_fuword16(volatile const void *base)
#define MSAN_ATOMIC_FUNC_CLEAR(name, type)
int kmsan_strcmp(const char *s1, const char *s2)
static void kmsan_origin_fill(const void *addr, msan_orig_t o, size_t size)
__strong_reference(kmsan_memcpy, __msan_memcpy)
void * kmsan_memset(void *dst, int c, size_t len)
void kmsan_init_arg(size_t)
int kmsan_bus_space_map(bus_space_tag_t tag, bus_addr_t hnd, bus_size_t size, int flags, bus_space_handle_t *handlep)
static uint8_t msan_dummy_shad[PAGE_SIZE] __aligned(PAGE_SIZE)
int kmsan_fubyte(volatile const void *base)
int kmsan_suword16(volatile void *base, int word)
void kmsan_bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t hnd, bus_size_t offset, bus_size_t size, int flags)
void __msan_warning(msan_orig_t)
int kmsan_casueword32(volatile uint32_t *base, uint32_t oldval, uint32_t *oldvalp, uint32_t newval)
int kmsan_copyout(const void *, void *, size_t)
int kmsan_bus_space_subregion(bus_space_tag_t tag, bus_space_handle_t hnd, bus_size_t offset, bus_size_t size, bus_space_handle_t *handlep)
void kmsan_intr_enter(void)
void __msan_poison(const void *, size_t)
msan_orig_t __msan_chain_origin(msan_orig_t)
static msan_tls_t dummy_tls
#define MSAN_ATOMIC_FUNC_SUBTRACT(name, type)
static const char * kmsan_orig_name(int type)
void kmsan_check_ccb(const union ccb *ccb, const char *descr)
#define MSAN_ATOMIC_FUNC_SET(name, type)
static MALLOC_DEFINE(M_KMSAN, "kmsan", "Kernel memory sanitizer")
#define kmsan_panic(f,...)
static void kmsan_meta_copy(void *dst, const void *src, size_t size)
#define MSAN_ATOMIC_FUNC_FCMPSET(name, type)
#define MSAN_META_FUNC(size)
void __msan_unpoison(const void *, size_t)