linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Ilya Leoshkevich <iii@linux.ibm.com>
To: Alexander Gordeev <agordeev@linux.ibm.com>,
	Alexander Potapenko <glider@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Christoph Lameter <cl@linux.com>,
	David Rientjes <rientjes@google.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Marco Elver <elver@google.com>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Pekka Enberg <penberg@kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Vlastimil Babka <vbabka@suse.cz>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Hyeonggon Yoo <42.hyeyoo@gmail.com>,
	kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org, linux-s390@vger.kernel.org,
	linux-trace-kernel@vger.kernel.org,
	Mark Rutland <mark.rutland@arm.com>,
	Roman Gushchin <roman.gushchin@linux.dev>,
	Sven Schnelle <svens@linux.ibm.com>,
	Ilya Leoshkevich <iii@linux.ibm.com>
Subject: [PATCH v4 30/35] s390/string: Add KMSAN support
Date: Thu, 13 Jun 2024 17:34:32 +0200	[thread overview]
Message-ID: <20240613153924.961511-31-iii@linux.ibm.com> (raw)
In-Reply-To: <20240613153924.961511-1-iii@linux.ibm.com>

Add KMSAN support for the s390 implementations of the string functions.
Do this similar to how it's already done for KASAN, except that the
optimized memset{16,32,64}() functions need to be disabled: it's
important for KMSAN to know that they initialized something.

The way boot code is built with regard to string functions is
problematic, since most files think it's configured with sanitizers,
but boot/string.c doesn't. This creates various problems with the
memset64() definitions, depending on whether the code is built with
sanitizers or fortify. This should probably be streamlined, but in the
meantime resolve the issues by introducing the IN_BOOT_STRING_C macro,
similar to the existing IN_ARCH_STRING_C macro.

Reviewed-by: Alexander Potapenko <glider@google.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
 arch/s390/boot/string.c        | 16 ++++++++++++++++
 arch/s390/include/asm/string.h | 20 +++++++++++++++-----
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/arch/s390/boot/string.c b/arch/s390/boot/string.c
index faccb33b462c..f6b9b1df48a8 100644
--- a/arch/s390/boot/string.c
+++ b/arch/s390/boot/string.c
@@ -1,11 +1,18 @@
 // SPDX-License-Identifier: GPL-2.0
+#define IN_BOOT_STRING_C 1
 #include <linux/ctype.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #undef CONFIG_KASAN
 #undef CONFIG_KASAN_GENERIC
+#undef CONFIG_KMSAN
 #include "../lib/string.c"
 
+/*
+ * Duplicate some functions from the common lib/string.c
+ * instead of fully including it.
+ */
+
 int strncmp(const char *cs, const char *ct, size_t count)
 {
 	unsigned char c1, c2;
@@ -22,6 +29,15 @@ int strncmp(const char *cs, const char *ct, size_t count)
 	return 0;
 }
 
+void *memset64(uint64_t *s, uint64_t v, size_t count)
+{
+	uint64_t *xs = s;
+
+	while (count--)
+		*xs++ = v;
+	return s;
+}
+
 char *skip_spaces(const char *str)
 {
 	while (isspace(*str))
diff --git a/arch/s390/include/asm/string.h b/arch/s390/include/asm/string.h
index 351685de53d2..2ab868cbae6c 100644
--- a/arch/s390/include/asm/string.h
+++ b/arch/s390/include/asm/string.h
@@ -15,15 +15,12 @@
 #define __HAVE_ARCH_MEMCPY	/* gcc builtin & arch function */
 #define __HAVE_ARCH_MEMMOVE	/* gcc builtin & arch function */
 #define __HAVE_ARCH_MEMSET	/* gcc builtin & arch function */
-#define __HAVE_ARCH_MEMSET16	/* arch function */
-#define __HAVE_ARCH_MEMSET32	/* arch function */
-#define __HAVE_ARCH_MEMSET64	/* arch function */
 
 void *memcpy(void *dest, const void *src, size_t n);
 void *memset(void *s, int c, size_t n);
 void *memmove(void *dest, const void *src, size_t n);
 
-#ifndef CONFIG_KASAN
+#if !defined(CONFIG_KASAN) && !defined(CONFIG_KMSAN)
 #define __HAVE_ARCH_MEMCHR	/* inline & arch function */
 #define __HAVE_ARCH_MEMCMP	/* arch function */
 #define __HAVE_ARCH_MEMSCAN	/* inline & arch function */
@@ -36,6 +33,9 @@ void *memmove(void *dest, const void *src, size_t n);
 #define __HAVE_ARCH_STRNCPY	/* arch function */
 #define __HAVE_ARCH_STRNLEN	/* inline & arch function */
 #define __HAVE_ARCH_STRSTR	/* arch function */
+#define __HAVE_ARCH_MEMSET16	/* arch function */
+#define __HAVE_ARCH_MEMSET32	/* arch function */
+#define __HAVE_ARCH_MEMSET64	/* arch function */
 
 /* Prototypes for non-inlined arch strings functions. */
 int memcmp(const void *s1, const void *s2, size_t n);
@@ -44,7 +44,7 @@ size_t strlcat(char *dest, const char *src, size_t n);
 char *strncat(char *dest, const char *src, size_t n);
 char *strncpy(char *dest, const char *src, size_t n);
 char *strstr(const char *s1, const char *s2);
-#endif /* !CONFIG_KASAN */
+#endif /* !defined(CONFIG_KASAN) && !defined(CONFIG_KMSAN) */
 
 #undef __HAVE_ARCH_STRCHR
 #undef __HAVE_ARCH_STRNCHR
@@ -74,20 +74,30 @@ void *__memset16(uint16_t *s, uint16_t v, size_t count);
 void *__memset32(uint32_t *s, uint32_t v, size_t count);
 void *__memset64(uint64_t *s, uint64_t v, size_t count);
 
+#ifdef __HAVE_ARCH_MEMSET16
 static inline void *memset16(uint16_t *s, uint16_t v, size_t count)
 {
 	return __memset16(s, v, count * sizeof(v));
 }
+#endif
 
+#ifdef __HAVE_ARCH_MEMSET32
 static inline void *memset32(uint32_t *s, uint32_t v, size_t count)
 {
 	return __memset32(s, v, count * sizeof(v));
 }
+#endif
 
+#ifdef __HAVE_ARCH_MEMSET64
+#ifdef IN_BOOT_STRING_C
+void *memset64(uint64_t *s, uint64_t v, size_t count);
+#else
 static inline void *memset64(uint64_t *s, uint64_t v, size_t count)
 {
 	return __memset64(s, v, count * sizeof(v));
 }
+#endif
+#endif
 
 #if !defined(IN_ARCH_STRING_C) && (!defined(CONFIG_FORTIFY_SOURCE) || defined(__NO_FORTIFY))
 
-- 
2.45.1



  parent reply	other threads:[~2024-06-13 15:40 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-13 15:34 [PATCH v4 00/35] kmsan: Enable on s390 Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 01/35] ftrace: Unpoison ftrace_regs in ftrace_ops_list_func() Ilya Leoshkevich
2024-06-13 16:21   ` Steven Rostedt
2024-06-13 15:34 ` [PATCH v4 02/35] kmsan: Make the tests compatible with kmsan.panic=1 Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 03/35] kmsan: Disable KMSAN when DEFERRED_STRUCT_PAGE_INIT is enabled Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 04/35] kmsan: Increase the maximum store size to 4096 Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 07/35] kmsan: Remove a useless assignment from kmsan_vmap_pages_range_noflush() Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 08/35] kmsan: Remove an x86-specific #include from kmsan.h Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 09/35] kmsan: Expose kmsan_get_metadata() Ilya Leoshkevich
2024-06-18 15:35   ` Alexander Potapenko
2024-06-13 15:34 ` [PATCH v4 11/35] kmsan: Allow disabling KMSAN checks for the current task Ilya Leoshkevich
2024-06-18 12:22   ` Alexander Potapenko
2024-06-13 15:34 ` [PATCH v4 12/35] kmsan: Support SLAB_POISON Ilya Leoshkevich
2024-06-13 23:30   ` SeongJae Park
     [not found]     ` <5a8a3c85760c19be66965630418e09a820f79277.camel@linux.ibm.com>
2024-06-18 15:05       ` Alexander Potapenko
2024-06-13 15:34 ` [PATCH v4 13/35] kmsan: Use ALIGN_DOWN() in kmsan_get_metadata() Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 15/35] mm: slub: Let KMSAN access metadata Ilya Leoshkevich
2024-06-18 14:21   ` Alexander Potapenko
2024-06-13 15:34 ` [PATCH v4 17/35] mm: kfence: Disable KMSAN when checking the canary Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 18/35] lib/zlib: Unpoison DFLTCC output buffers Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 19/35] kmsan: Accept ranges starting with 0 on s390 Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 20/35] s390/boot: Turn off KMSAN Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 21/35] s390: Use a larger stack for KMSAN Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 22/35] s390/boot: Add the KMSAN runtime stub Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 23/35] s390/checksum: Add a KMSAN check Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 25/35] s390/cpumf: Unpoison STCCTM output buffer Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 26/35] s390/diag: Unpoison diag224() " Ilya Leoshkevich
2024-06-18  9:26   ` Alexander Potapenko
2024-06-13 15:34 ` [PATCH v4 27/35] s390/ftrace: Unpoison ftrace_regs in kprobe_ftrace_handler() Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 28/35] s390/irqflags: Do not instrument arch_local_irq_*() with KMSAN Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 29/35] s390/mm: Define KMSAN metadata for vmalloc and modules Ilya Leoshkevich
2024-06-13 15:34 ` Ilya Leoshkevich [this message]
2024-06-13 15:34 ` [PATCH v4 33/35] s390/unwind: Disable KMSAN checks Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 34/35] s390: Implement the architecture-specific KMSAN functions Ilya Leoshkevich
2024-06-13 15:34 ` [PATCH v4 35/35] kmsan: Enable on s390 Ilya Leoshkevich
2024-06-18 15:36   ` Alexander Potapenko
     [not found] ` <20240613153924.961511-33-iii@linux.ibm.com>
2024-06-18  9:24   ` [PATCH v4 32/35] s390/uaccess: Add KMSAN support to put_user() and get_user() Alexander Potapenko
     [not found]     ` <e91768f518876ec9b53ffa8069b798107434d0dd.camel@linux.ibm.com>
2024-06-18  9:52       ` Alexander Potapenko
     [not found] ` <20240613153924.961511-15-iii@linux.ibm.com>
2024-06-18 14:37   ` [PATCH v4 14/35] kmsan: Do not round up pg_data_t size Alexander Potapenko
     [not found] ` <20240613153924.961511-17-iii@linux.ibm.com>
2024-06-18 14:38   ` [PATCH v4 16/35] mm: slub: Unpoison the memchr_inv() return value Alexander Potapenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240613153924.961511-31-iii@linux.ibm.com \
    --to=iii@linux.ibm.com \
    --cc=42.hyeyoo@gmail.com \
    --cc=agordeev@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=borntraeger@linux.ibm.com \
    --cc=cl@linux.com \
    --cc=dvyukov@google.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mhiramat@kernel.org \
    --cc=penberg@kernel.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=svens@linux.ibm.com \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox