]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
x86: add barrier to read{b,w,l} and write{b,w,l} functions
authorAmeya Palande <2ameya@gmail.com>
Tue, 17 Feb 2015 22:00:49 +0000 (14:00 -0800)
committerGerd Hoffmann <kraxel@redhat.com>
Thu, 12 Mar 2015 07:16:59 +0000 (08:16 +0100)
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 <kevin@koconnor.net>
(cherry picked from commit bc82fa431ef3a0791f637c54fc8065b3fbc13772)

src/x86.h

index 57773d247d0408dafa57dac423485e7ffeb2483f..7798b1c17c3d3d0fe91310cf0ba2d843a91a506a 100644 (file)
--- 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