[SeaBIOS] [PATCH] x86: fix read{b,w,l} and write{b,w,l} functions
Ameya Palande
2ameya at gmail.com
Tue Feb 17 23:00:49 CET 2015
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 at gmail.com>
---
src/x86.h | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/x86.h b/src/x86.h
index 57773d2..570f2f6 100644
--- a/src/x86.h
+++ b/src/x86.h
@@ -176,22 +176,37 @@ 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;
+
+ val = *(volatile const u32 *)addr;
+ barrier();
+ return val;
}
static inline u16 readw(const void *addr) {
- return *(volatile const u16 *)addr;
+ u16 val;
+
+ val = *(volatile const u16 *)addr;
+ barrier();
+ return val;
}
static inline u8 readb(const void *addr) {
- return *(volatile const u8 *)addr;
+ u8 val;
+
+ val = *(volatile const u8 *)addr;
+ barrier();
+ return val;
}
// GDT bits
--
1.8.3.1
More information about the SeaBIOS
mailing list