aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2026-02-13 15:42:19 +0000
committerMark Johnston <markj@FreeBSD.org>2026-02-13 15:42:19 +0000
commitbf149f2e88cb3836e02ddabd9944eb58650a72ae (patch)
treed6d34f20f6a59de6474f78fccc0eed0d8056f1e2
parent394201ce5b4e2f84f1e39a7ce8bdc3f5a5ef8390 (diff)
kmsan: Implement __msan_test_shadow()
This is needed when building OpenZFS with KMSAN enabled, as the bundled zstd uses it. MFC after: 1 week
-rw-r--r--sys/kern/subr_msan.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/kern/subr_msan.c b/sys/kern/subr_msan.c
index 883dbd2b7604..dd69375f4ed1 100644
--- a/sys/kern/subr_msan.c
+++ b/sys/kern/subr_msan.c
@@ -662,6 +662,7 @@ void __msan_poison_alloca(const void *, uint64_t, const char *);
void __msan_unpoison_alloca(const void *, uint64_t);
void __msan_warning(msan_orig_t);
msan_tls_t *__msan_get_context_state(void);
+intptr_t __msan_test_shadow(const void *, size_t);
void
__msan_instrument_asm_store(const void *addr, size_t size)
@@ -726,6 +727,23 @@ __msan_get_context_state(void)
return (&mtd->tls[mtd->ctx]);
}
+intptr_t
+__msan_test_shadow(const void *addr, size_t len)
+{
+ uint8_t *shad;
+
+ if (__predict_false(!kmsan_enabled))
+ return (-1);
+ if (__predict_false(kmsan_md_unsupported((vm_offset_t)addr)))
+ return (-1);
+
+ shad = (uint8_t *)kmsan_md_addr_to_shad((vm_offset_t)addr);
+ for (size_t i = 0; i < len; i++)
+ if (shad[i] != 0)
+ return (i);
+ return (-1);
+}
+
/* -------------------------------------------------------------------------- */
/*