From: Ameya Palande <2ameya@gmail.com> Date: Tue, 17 Feb 2015 22:00:49 +0000 (-0800) Subject: x86: add barrier to read{b,w,l} and write{b,w,l} functions X-Git-Tag: rel-1.8.1~3 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=94c9a7ca9c962f8664e60ed6b5c523f6fe16b5c8;p=seabios.git x86: add barrier to read{b,w,l} and write{b,w,l} functions Use barrier() for memory mapped IO functions. This fixes pvscsi driver to boot on QEMU's pvscsi controller. Test command: qemu -m 512 --enable-kvm -device pvscsi,id=pvscsi0 -device scsi-disk,bus=pvscsi0.0,drive=drive0 -drive id=drive0,if=none,file=ubuntu1410.img,if=none -bios seabios/out/bios.bin Signed-off-by: Ameya Palande <2ameya@gmail.com> Signed-off-by: Kevin O'Connor (cherry picked from commit bc82fa431ef3a0791f637c54fc8065b3fbc13772) --- diff --git a/src/x86.h b/src/x86.h index 57773d2..7798b1c 100644 --- a/src/x86.h +++ b/src/x86.h @@ -176,22 +176,31 @@ static inline void outsl(u16 port, u32 *data, u32 count) { } static inline void writel(void *addr, u32 val) { + barrier(); *(volatile u32 *)addr = val; } static inline void writew(void *addr, u16 val) { + barrier(); *(volatile u16 *)addr = val; } static inline void writeb(void *addr, u8 val) { + barrier(); *(volatile u8 *)addr = val; } static inline u32 readl(const void *addr) { - return *(volatile const u32 *)addr; + u32 val = *(volatile const u32 *)addr; + barrier(); + return val; } static inline u16 readw(const void *addr) { - return *(volatile const u16 *)addr; + u16 val = *(volatile const u16 *)addr; + barrier(); + return val; } static inline u8 readb(const void *addr) { - return *(volatile const u8 *)addr; + u8 val = *(volatile const u8 *)addr; + barrier(); + return val; } // GDT bits