Message ID | 20231213233605.661251-26-iii@linux.ibm.com (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | kmsan: Enable on s390 | expand |
On Thu, Dec 14, 2023 at 12:24:45AM +0100, Ilya Leoshkevich wrote: > Diagnose 224 stores 4k bytes, which cannot be deduced from the inline > assembly constraints. This leads to KMSAN false positives. > > Unpoison the output buffer manually with kmsan_unpoison_memory(). > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > arch/s390/kernel/diag.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/s390/kernel/diag.c b/arch/s390/kernel/diag.c > index 92fdc35f028c..fb83a21014d0 100644 > --- a/arch/s390/kernel/diag.c > +++ b/arch/s390/kernel/diag.c > @@ -9,6 +9,7 @@ > #include <linux/export.h> > #include <linux/init.h> > #include <linux/cpu.h> > +#include <linux/kmsan-checks.h> > #include <linux/seq_file.h> > #include <linux/debugfs.h> > #include <linux/vmalloc.h> > @@ -255,6 +256,7 @@ int diag224(void *ptr) > "1:\n" > EX_TABLE(0b,1b) > : "+d" (rc) :"d" (0), "d" (addr) : "memory"); > + kmsan_unpoison_memory(ptr, PAGE_SIZE); Wouldn't it be better to adjust the inline assembly instead? Something like this: diff --git a/arch/s390/kernel/diag.c b/arch/s390/kernel/diag.c index 92fdc35f028c..b1b0acda50c6 100644 --- a/arch/s390/kernel/diag.c +++ b/arch/s390/kernel/diag.c @@ -247,14 +247,18 @@ int diag224(void *ptr) { unsigned long addr = __pa(ptr); int rc = -EOPNOTSUPP; + struct _d { + char _d[4096]; + }; diag_stat_inc(DIAG_STAT_X224); - asm volatile( - " diag %1,%2,0x224\n" - "0: lhi %0,0x0\n" + asm volatile("\n" + " diag %[type],%[addr],0x224\n" + "0: lhi %[rc],0\n" "1:\n" EX_TABLE(0b,1b) - : "+d" (rc) :"d" (0), "d" (addr) : "memory"); + : [rc] "+d" (rc), "=m" (*(struct _d *)ptr) + : [type] "d" (0), [addr] "d" (addr)); return rc; } EXPORT_SYMBOL(diag224);
diff --git a/arch/s390/kernel/diag.c b/arch/s390/kernel/diag.c index 92fdc35f028c..fb83a21014d0 100644 --- a/arch/s390/kernel/diag.c +++ b/arch/s390/kernel/diag.c @@ -9,6 +9,7 @@ #include <linux/export.h> #include <linux/init.h> #include <linux/cpu.h> +#include <linux/kmsan-checks.h> #include <linux/seq_file.h> #include <linux/debugfs.h> #include <linux/vmalloc.h> @@ -255,6 +256,7 @@ int diag224(void *ptr) "1:\n" EX_TABLE(0b,1b) : "+d" (rc) :"d" (0), "d" (addr) : "memory"); + kmsan_unpoison_memory(ptr, PAGE_SIZE); return rc; } EXPORT_SYMBOL(diag224);
Diagnose 224 stores 4k bytes, which cannot be deduced from the inline assembly constraints. This leads to KMSAN false positives. Unpoison the output buffer manually with kmsan_unpoison_memory(). Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- arch/s390/kernel/diag.c | 2 ++ 1 file changed, 2 insertions(+)