Message ID | 20231121220155.1217090-10-iii@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | kmsan: Enable on s390 | expand |
On Tue, Nov 21, 2023 at 11:07 PM Ilya Leoshkevich <iii@linux.ibm.com> wrote: > > It is useful to manually copy metadata in order to describe the effects > of memmove()-like logic in uninstrumented code or inline asm. Introduce > kmsan_memmove_metadata() for this purpose. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > include/linux/kmsan-checks.h | 14 ++++++++++++++ > mm/kmsan/hooks.c | 11 +++++++++++ > 2 files changed, 25 insertions(+) > > diff --git a/include/linux/kmsan-checks.h b/include/linux/kmsan-checks.h > index c4cae333deec..5218973f0ad0 100644 > --- a/include/linux/kmsan-checks.h > +++ b/include/linux/kmsan-checks.h > @@ -61,6 +61,17 @@ void kmsan_check_memory(const void *address, size_t size); > void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy, > size_t left); > > +/** > + * kmsan_memmove_metadata() - Copy kernel memory range metadata. > + * @dst: start of the destination kernel memory range. > + * @src: start of the source kernel memory range. > + * @n: size of the memory ranges. > + * > + * KMSAN will treat the destination range as if its contents were memmove()d > + * from the source range. > + */ > +void kmsan_memmove_metadata(void *dst, const void *src, size_t n); As noted in patch 18/33, I am pretty sure we shouldn't need this function.
diff --git a/include/linux/kmsan-checks.h b/include/linux/kmsan-checks.h index c4cae333deec..5218973f0ad0 100644 --- a/include/linux/kmsan-checks.h +++ b/include/linux/kmsan-checks.h @@ -61,6 +61,17 @@ void kmsan_check_memory(const void *address, size_t size); void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy, size_t left); +/** + * kmsan_memmove_metadata() - Copy kernel memory range metadata. + * @dst: start of the destination kernel memory range. + * @src: start of the source kernel memory range. + * @n: size of the memory ranges. + * + * KMSAN will treat the destination range as if its contents were memmove()d + * from the source range. + */ +void kmsan_memmove_metadata(void *dst, const void *src, size_t n); + #else static inline void kmsan_poison_memory(const void *address, size_t size, @@ -77,6 +88,9 @@ static inline void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy, size_t left) { } +static inline void kmsan_memmove_metadata(void *dst, const void *src, size_t n) +{ +} #endif diff --git a/mm/kmsan/hooks.c b/mm/kmsan/hooks.c index eafc45f937eb..4d477a0a356c 100644 --- a/mm/kmsan/hooks.c +++ b/mm/kmsan/hooks.c @@ -286,6 +286,17 @@ void kmsan_copy_to_user(void __user *to, const void *from, size_t to_copy, } EXPORT_SYMBOL(kmsan_copy_to_user); +void kmsan_memmove_metadata(void *dst, const void *src, size_t n) +{ + if (!kmsan_enabled || kmsan_in_runtime()) + return; + + kmsan_enter_runtime(); + kmsan_internal_memmove_metadata(dst, (void *)src, n); + kmsan_leave_runtime(); +} +EXPORT_SYMBOL(kmsan_memmove_metadata); + /* Helper function to check an URB. */ void kmsan_handle_urb(const struct urb *urb, bool is_out) {
It is useful to manually copy metadata in order to describe the effects of memmove()-like logic in uninstrumented code or inline asm. Introduce kmsan_memmove_metadata() for this purpose. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- include/linux/kmsan-checks.h | 14 ++++++++++++++ mm/kmsan/hooks.c | 11 +++++++++++ 2 files changed, 25 insertions(+)