Fix asm dependencies on segment based writes.
authorKevin O'Connor <kevin@koconnor.net>
Sat, 12 Apr 2008 13:03:34 +0000 (09:03 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 12 Apr 2008 13:03:34 +0000 (09:03 -0400)
The variable was marked as an input instead of an output.
This could cause gcc bugs - it also forced the asm to be volatile.

src/farptr.h

index 6a37460f203132f16d435b1d66e0edb247aacc31..56219d290134678c1e955aeab87e4842c6921add 100644 (file)
@@ -29,14 +29,14 @@ extern u16 __segment_ES, __segment_CS, __segment_DS, __segment_SS;
             : "m"(var), "m"(__segment_ ## SEG));        \
     __value; })
 #define WRITE8_SEG(SEG, var, value)                             \
-    __asm__("movb %b0, %%" #SEG ":%1" :                         \
-            : "Q"(value), "m"(var), "m"(__segment_ ## SEG))
+    __asm__("movb %b1, %%" #SEG ":%0" : "=m"(var)               \
+            : "Q"(value), "m"(__segment_ ## SEG))
 #define WRITE16_SEG(SEG, var, value)                            \
-    __asm__("movw %w0, %%" #SEG ":%1" :                         \
-            : "r"(value), "m"(var), "m"(__segment_ ## SEG))
+    __asm__("movw %w1, %%" #SEG ":%0" : "=m"(var)               \
+            : "r"(value), "m"(__segment_ ## SEG))
 #define WRITE32_SEG(SEG, var, value)                            \
-    __asm__("movl %0, %%" #SEG ":%1" :                          \
-            : "r"(value), "m"(var), "m"(__segment_ ## SEG))
+    __asm__("movl %1, %%" #SEG ":%0" : "=m"(var)                \
+            : "r"(value), "m"(__segment_ ## SEG))
 
 // Low level macros for getting/setting a segment register.
 #define __SET_SEG(SEG, value)                                   \