| From: Alexander Potapenko <glider@google.com> |
| Subject: x86: kmsan: handle open-coded assembly in lib/iomem.c |
| Date: Thu, 15 Sep 2022 17:04:08 +0200 |
| |
| KMSAN cannot intercept memory accesses within asm() statements. That's |
| why we add kmsan_unpoison_memory() and kmsan_check_memory() to hint it how |
| to handle memory copied from/to I/O memory. |
| |
| Link: https://lkml.kernel.org/r/20220915150417.722975-35-glider@google.com |
| Signed-off-by: Alexander Potapenko <glider@google.com> |
| Cc: Alexander Viro <viro@zeniv.linux.org.uk> |
| Cc: Alexei Starovoitov <ast@kernel.org> |
| Cc: Andrey Konovalov <andreyknvl@gmail.com> |
| Cc: Andrey Konovalov <andreyknvl@google.com> |
| Cc: Andy Lutomirski <luto@kernel.org> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Christoph Hellwig <hch@lst.de> |
| Cc: Christoph Lameter <cl@linux.com> |
| Cc: David Rientjes <rientjes@google.com> |
| Cc: Dmitry Vyukov <dvyukov@google.com> |
| Cc: Eric Biggers <ebiggers@google.com> |
| Cc: Eric Biggers <ebiggers@kernel.org> |
| Cc: Eric Dumazet <edumazet@google.com> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Herbert Xu <herbert@gondor.apana.org.au> |
| Cc: Ilya Leoshkevich <iii@linux.ibm.com> |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> |
| Cc: Kees Cook <keescook@chromium.org> |
| Cc: Marco Elver <elver@google.com> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Michael S. Tsirkin <mst@redhat.com> |
| Cc: Pekka Enberg <penberg@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Petr Mladek <pmladek@suse.com> |
| Cc: Stephen Rothwell <sfr@canb.auug.org.au> |
| Cc: Steven Rostedt <rostedt@goodmis.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Vasily Gorbik <gor@linux.ibm.com> |
| Cc: Vegard Nossum <vegard.nossum@oracle.com> |
| Cc: Vlastimil Babka <vbabka@suse.cz> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| arch/x86/lib/iomem.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/arch/x86/lib/iomem.c~x86-kmsan-handle-open-coded-assembly-in-lib-iomemc |
| +++ a/arch/x86/lib/iomem.c |
| @@ -1,6 +1,7 @@ |
| #include <linux/string.h> |
| #include <linux/module.h> |
| #include <linux/io.h> |
| +#include <linux/kmsan-checks.h> |
| |
| #define movs(type,to,from) \ |
| asm volatile("movs" type:"=&D" (to), "=&S" (from):"0" (to), "1" (from):"memory") |
| @@ -37,6 +38,8 @@ static void string_memcpy_fromio(void *t |
| n-=2; |
| } |
| rep_movs(to, (const void *)from, n); |
| + /* KMSAN must treat values read from devices as initialized. */ |
| + kmsan_unpoison_memory(to, n); |
| } |
| |
| static void string_memcpy_toio(volatile void __iomem *to, const void *from, size_t n) |
| @@ -44,6 +47,8 @@ static void string_memcpy_toio(volatile |
| if (unlikely(!n)) |
| return; |
| |
| + /* Make sure uninitialized memory isn't copied to devices. */ |
| + kmsan_check_memory(from, n); |
| /* Align any unaligned destination IO */ |
| if (unlikely(1 & (unsigned long)to)) { |
| movs("b", to, from); |
| _ |