| From 7206f9bf108eb9513d170c73f151367a1bdf3dbf Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Wed, 19 Jul 2017 14:53:02 +0200 |
| Subject: x86/io: Add "memory" clobber to insb/insw/insl/outsb/outsw/outsl |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit 7206f9bf108eb9513d170c73f151367a1bdf3dbf upstream. |
| |
| The x86 version of insb/insw/insl uses an inline assembly that does |
| not have the target buffer listed as an output. This can confuse |
| the compiler, leading it to think that a subsequent access of the |
| buffer is uninitialized: |
| |
| drivers/net/wireless/wl3501_cs.c: In function ‘wl3501_mgmt_scan_confirm’: |
| drivers/net/wireless/wl3501_cs.c:665:9: error: ‘sig.status’ is used uninitialized in this function [-Werror=uninitialized] |
| drivers/net/wireless/wl3501_cs.c:668:12: error: ‘sig.cap_info’ may be used uninitialized in this function [-Werror=maybe-uninitialized] |
| drivers/net/sb1000.c: In function 'sb1000_rx': |
| drivers/net/sb1000.c:775:9: error: 'st[0]' is used uninitialized in this function [-Werror=uninitialized] |
| drivers/net/sb1000.c:776:10: error: 'st[1]' may be used uninitialized in this function [-Werror=maybe-uninitialized] |
| drivers/net/sb1000.c:784:11: error: 'st[1]' may be used uninitialized in this function [-Werror=maybe-uninitialized] |
| |
| I tried to mark the exact input buffer as an output here, but couldn't |
| figure it out. As suggested by Linus, marking all memory as clobbered |
| however is good enough too. For the outs operations, I also add the |
| memory clobber, to force the input to be written to local variables. |
| This is probably already guaranteed by the "asm volatile", but it can't |
| hurt to do this for symmetry. |
| |
| Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Acked-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Borislav Petkov <bp@suse.de> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Tom Lendacky <thomas.lendacky@amd.com> |
| Link: http://lkml.kernel.org/r/20170719125310.2487451-5-arnd@arndb.de |
| Link: https://lkml.org/lkml/2017/7/12/605 |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/io.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/include/asm/io.h |
| +++ b/arch/x86/include/asm/io.h |
| @@ -304,13 +304,13 @@ static inline unsigned type in##bwl##_p( |
| static inline void outs##bwl(int port, const void *addr, unsigned long count) \ |
| { \ |
| asm volatile("rep; outs" #bwl \ |
| - : "+S"(addr), "+c"(count) : "d"(port)); \ |
| + : "+S"(addr), "+c"(count) : "d"(port) : "memory"); \ |
| } \ |
| \ |
| static inline void ins##bwl(int port, void *addr, unsigned long count) \ |
| { \ |
| asm volatile("rep; ins" #bwl \ |
| - : "+D"(addr), "+c"(count) : "d"(port)); \ |
| + : "+D"(addr), "+c"(count) : "d"(port) : "memory"); \ |
| } |
| |
| BUILDIO(b, b, char) |