All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Potapenko <glider@google.com>
To: glider@google.com
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
	Andrew Morton <akpm@linux-foundation.org>,
	Andrey Konovalov <andreyknvl@google.com>,
	Andy Lutomirski <luto@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
	Borislav Petkov <bp@alien8.de>, Christoph Hellwig <hch@lst.de>,
	Christoph Lameter <cl@linux.com>,
	David Rientjes <rientjes@google.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Eric Dumazet <edumazet@google.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Herbert Xu <herbert@gondor.apana.org.au>,
	Ilya Leoshkevich <iii@linux.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Jens Axboe <axboe@kernel.dk>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Kees Cook <keescook@chromium.org>, Marco Elver <elver@google.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Matthew Wilcox <willy@infradead.org>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Pekka Enberg <penberg@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Petr Mladek <pmladek@suse.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Vegard Nossum <vegard.nossum@oracle.com>,
	Vlastimil Babka <vbabka@suse.cz>,
	kasan-dev@googlegroups.com, linux-mm@kvack.org,
	linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v3 27/46] kmsan: instrumentation.h: add instrumentation_begin_with_regs()
Date: Tue, 26 Apr 2022 18:42:56 +0200	[thread overview]
Message-ID: <20220426164315.625149-28-glider@google.com> (raw)
In-Reply-To: <20220426164315.625149-1-glider@google.com>

When calling KMSAN-instrumented functions from non-instrumented
functions, function parameters may not be initialized properly, leading
to false positive reports. In particular, this happens all the time when
calling interrupt handlers from `noinstr` IDT entries.

We introduce instrumentation_begin_with_regs(), which calls
instrumentation_begin() and notifies KMSAN about the beginning of the
potentially instrumented region by calling
kmsan_instrumentation_begin(), which:
 - wipes the current KMSAN state at the beginning of the region, ensuring
   that the first call of an instrumented function receives initialized
   parameters (this is a pretty good approximation of having all other
   instrumented functions receive initialized parameters);
 - unpoisons the `struct pt_regs` set up by the non-instrumented assembly
   code.

Signed-off-by: Alexander Potapenko <glider@google.com>
---
Link: https://linux-review.googlesource.com/id/I0f5e3372e00bd5fe25ddbf286f7260aae9011858
---
 include/linux/instrumentation.h |  6 ++++++
 include/linux/kmsan.h           | 11 +++++++++++
 mm/kmsan/hooks.c                | 16 ++++++++++++++++
 3 files changed, 33 insertions(+)

diff --git a/include/linux/instrumentation.h b/include/linux/instrumentation.h
index 24359b4a96053..3bbce9d556381 100644
--- a/include/linux/instrumentation.h
+++ b/include/linux/instrumentation.h
@@ -15,6 +15,11 @@
 })
 #define instrumentation_begin() __instrumentation_begin(__COUNTER__)
 
+#define instrumentation_begin_with_regs(regs) do {			\
+	__instrumentation_begin(__COUNTER__);				\
+	kmsan_instrumentation_begin(regs);				\
+} while (0)
+
 /*
  * Because instrumentation_{begin,end}() can nest, objtool validation considers
  * _begin() a +1 and _end() a -1 and computes a sum over the instructions.
@@ -55,6 +60,7 @@
 #define instrumentation_end() __instrumentation_end(__COUNTER__)
 #else
 # define instrumentation_begin()	do { } while(0)
+# define instrumentation_begin_with_regs(regs) kmsan_instrumentation_begin(regs)
 # define instrumentation_end()		do { } while(0)
 #endif
 
diff --git a/include/linux/kmsan.h b/include/linux/kmsan.h
index 55f976b721566..209a5a2192e22 100644
--- a/include/linux/kmsan.h
+++ b/include/linux/kmsan.h
@@ -247,6 +247,13 @@ void kmsan_handle_dma_sg(struct scatterlist *sg, int nents,
  */
 void kmsan_handle_urb(const struct urb *urb, bool is_out);
 
+/**
+ * kmsan_instrumentation_begin() - handle instrumentation_begin().
+ * @regs: pointer to struct pt_regs that non-instrumented code passes to
+ *        instrumented code.
+ */
+void kmsan_instrumentation_begin(struct pt_regs *regs);
+
 #else
 
 static inline void kmsan_init_shadow(void)
@@ -343,6 +350,10 @@ static inline void kmsan_handle_urb(const struct urb *urb, bool is_out)
 {
 }
 
+static inline void kmsan_instrumentation_begin(struct pt_regs *regs)
+{
+}
+
 #endif
 
 #endif /* _LINUX_KMSAN_H */
diff --git a/mm/kmsan/hooks.c b/mm/kmsan/hooks.c
index 9aecbf2825837..c20d105c143c1 100644
--- a/mm/kmsan/hooks.c
+++ b/mm/kmsan/hooks.c
@@ -366,3 +366,19 @@ void kmsan_check_memory(const void *addr, size_t size)
 					   REASON_ANY);
 }
 EXPORT_SYMBOL(kmsan_check_memory);
+
+void kmsan_instrumentation_begin(struct pt_regs *regs)
+{
+	struct kmsan_context_state *state = &kmsan_get_context()->cstate;
+
+	if (state)
+		__memset(state, 0, sizeof(struct kmsan_context_state));
+	if (!kmsan_enabled || !regs)
+		return;
+	/*
+	 * @regs may reside in cpu_entry_area, for which KMSAN does not allocate
+	 * metadata. Do not force an error in that case.
+	 */
+	kmsan_internal_unpoison_memory(regs, sizeof(*regs), /*checked*/ false);
+}
+EXPORT_SYMBOL(kmsan_instrumentation_begin);
-- 
2.36.0.rc2.479.g8af0fa9b8e-goog


  parent reply	other threads:[~2022-04-26 16:48 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-26 16:42 [PATCH v3 00/46] Add KernelMemorySanitizer infrastructure Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 01/46] x86: add missing include to sparsemem.h Alexander Potapenko
2022-04-27 13:22   ` Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 02/46] stackdepot: reserve 5 extra bits in depot_stack_handle_t Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 03/46] kasan: common: adapt to the new prototype of __stack_depot_save() Alexander Potapenko
2022-04-27 12:47   ` Marco Elver
2022-04-26 16:42 ` [PATCH v3 04/46] instrumented.h: allow instrumenting both sides of copy_from_user() Alexander Potapenko
2022-04-27  4:36   ` kernel test robot
2022-06-01 17:09     ` Alexander Potapenko
2022-06-01 17:09       ` Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 05/46] x86: asm: instrument usercopy in get_user() and __put_user_size() Alexander Potapenko
2022-04-27  3:45   ` kernel test robot
2022-04-27  6:58   ` kernel test robot
2022-04-27  7:14   ` Arnd Bergmann
2022-06-02 11:20     ` Alexander Potapenko
2022-04-27 14:24   ` kernel test robot
2022-04-28  1:59   ` kernel test robot
2022-04-30 10:16   ` [x86] d216de19c8: kernel-selftests.x86.ioperm_32.fail kernel test robot
2022-04-30 10:16     ` kernel test robot
2022-04-26 16:42 ` [PATCH v3 06/46] asm-generic: instrument usercopy in cacheflush.h Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 07/46] kmsan: add ReST documentation Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 08/46] kmsan: introduce __no_sanitize_memory and __no_kmsan_checks Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 09/46] kmsan: mark noinstr as __no_sanitize_memory Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 10/46] x86: kmsan: pgtable: reduce vmalloc space Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 11/46] libnvdimm/pfn_dev: increase MAX_STRUCT_PAGE_SIZE Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 12/46] kmsan: add KMSAN runtime core Alexander Potapenko
2022-04-27  9:12   ` kernel test robot
2022-04-27 14:09   ` Marco Elver
2022-05-31 11:08     ` Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 13/46] kmsan: implement kmsan_init(), initialize READ_ONCE_NOCHECK() Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 14/46] kmsan: disable instrumentation of unsupported common kernel code Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 15/46] MAINTAINERS: add entry for KMSAN Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 16/46] kmsan: mm: maintain KMSAN metadata for page operations Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 17/46] kmsan: mm: call KMSAN hooks from SLUB code Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 18/46] kmsan: handle task creation and exiting Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 19/46] kmsan: init: call KMSAN initialization routines Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 20/46] instrumented.h: add KMSAN support Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 21/46] kmsan: unpoison @tlb in arch_tlb_gather_mmu() Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 22/46] kmsan: add iomap support Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 23/46] Input: libps2: mark data received in __ps2_command() as initialized Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 24/46] kmsan: dma: unpoison DMA mappings Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 25/46] kmsan: virtio: check/unpoison scatterlist in vring_map_one_sg() Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 26/46] kmsan: handle memory sent to/from USB Alexander Potapenko
2022-04-26 16:42 ` Alexander Potapenko [this message]
2022-04-27 13:28   ` [PATCH v3 27/46] kmsan: instrumentation.h: add instrumentation_begin_with_regs() Thomas Gleixner
2022-05-16 11:49     ` Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 28/46] kmsan: entry: handle register passing from uninstrumented code Alexander Potapenko
2022-04-27 13:32   ` Thomas Gleixner
2022-05-02 17:00     ` Alexander Potapenko
2022-05-02 22:00       ` Thomas Gleixner
2022-05-05 18:04         ` Alexander Potapenko
2022-05-05 21:56           ` Thomas Gleixner
2022-05-06 14:52             ` Alexander Potapenko
2022-05-06 16:14               ` Thomas Gleixner
2022-05-06 17:41                 ` Alexander Potapenko
2022-05-06 18:41                   ` Thomas Gleixner
2022-05-09 16:50                     ` Alexander Potapenko
2022-05-09 16:51                       ` Alexander Potapenko
2022-05-09 19:09                       ` Thomas Gleixner
2022-05-12 12:24                         ` Alexander Potapenko
2022-05-12 16:17                           ` Thomas Gleixner
2022-05-12 16:48                             ` Thomas Gleixner
2022-06-01 11:27                               ` Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 29/46] kmsan: add tests for KMSAN Alexander Potapenko
2022-04-26 16:42 ` [PATCH v3 30/46] kmsan: disable strscpy() optimization under KMSAN Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 31/46] crypto: kmsan: disable accelerated configs " Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 32/46] kmsan: disable physical page merging in biovec Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 33/46] kmsan: block: skip bio block merging logic for KMSAN Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 34/46] kmsan: kcov: unpoison area->list in kcov_remote_area_put() Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 35/46] security: kmsan: fix interoperability with auto-initialization Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 36/46] objtool: kmsan: list KMSAN API functions as uaccess-safe Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 37/46] x86: kmsan: make READ_ONCE_TASK_STACK() return initialized values Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 38/46] x86: kmsan: disable instrumentation of unsupported code Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 39/46] x86: kmsan: skip shadow checks in __switch_to() Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 40/46] x86: kmsan: handle open-coded assembly in lib/iomem.c Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 41/46] x86: kmsan: use __msan_ string functions where possible Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 42/46] x86: kmsan: sync metadata pages on page fault Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 43/46] x86: kasan: kmsan: support CONFIG_GENERIC_CSUM on x86, enable it for KASAN/KMSAN Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 44/46] x86: fs: kmsan: disable CONFIG_DCACHE_WORD_ACCESS Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 45/46] x86: kmsan: handle register passing from uninstrumented code Alexander Potapenko
2022-04-26 16:43 ` [PATCH v3 46/46] x86: kmsan: enable KMSAN builds for x86 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=20220426164315.625149-28-glider@google.com \
    --to=glider@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@google.com \
    --cc=arnd@arndb.de \
    --cc=axboe@kernel.dk \
    --cc=bp@alien8.de \
    --cc=cl@linux.com \
    --cc=dvyukov@google.com \
    --cc=edumazet@google.com \
    --cc=elver@google.com \
    --cc=gor@linux.ibm.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hch@lst.de \
    --cc=herbert@gondor.apana.org.au \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=iii@linux.ibm.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=keescook@chromium.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=luto@kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=mst@redhat.com \
    --cc=penberg@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pmladek@suse.com \
    --cc=rientjes@google.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=vbabka@suse.cz \
    --cc=vegard.nossum@oracle.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.