Fix gcc inline assembler operand constraints for syscall -- as pushl modifies %esp...
authorBenedikt Huber <benedikt.huber@gmail.com>
Wed, 29 Feb 2012 14:17:04 +0000 (15:17 +0100)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 1 Mar 2012 05:22:46 +0000 (21:22 -0800)
Without this patch, gcc-4.6.1-9ubuntu3 miscompiles the read syscall to:
  000000b6 <read>:
    b6:   ff 74 24 0c             pushl  0xc(%esp)
    ba:   ff 74 24 08             pushl  0x8(%esp)  ; [!]
    be:   ff 74 24 04             pushl  0x4(%esp)  ; [!]
    ...

src/lib/user/syscall.c

index a9c5bc8500c517f58169a52c1dee5f1b78a3edff..c8385bc3364b1eabc57e68bae885fe458537b42a 100644 (file)
@@ -38,8 +38,8 @@
              "pushl %[number]; int $0x30; addl $12, %%esp"      \
                : "=a" (retval)                                  \
                : [number] "i" (NUMBER),                         \
              "pushl %[number]; int $0x30; addl $12, %%esp"      \
                : "=a" (retval)                                  \
                : [number] "i" (NUMBER),                         \
-                 [arg0] "g" (ARG0),                             \
-                 [arg1] "g" (ARG1)                              \
+                 [arg0] "r" (ARG0),                             \
+                 [arg1] "r" (ARG1)                              \
                : "memory");                                     \
           retval;                                               \
         })
                : "memory");                                     \
           retval;                                               \
         })
@@ -54,9 +54,9 @@
              "pushl %[number]; int $0x30; addl $16, %%esp"      \
                : "=a" (retval)                                  \
                : [number] "i" (NUMBER),                         \
              "pushl %[number]; int $0x30; addl $16, %%esp"      \
                : "=a" (retval)                                  \
                : [number] "i" (NUMBER),                         \
-                 [arg0] "g" (ARG0),                             \
-                 [arg1] "g" (ARG1),                             \
-                 [arg2] "g" (ARG2)                              \
+                 [arg0] "r" (ARG0),                             \
+                 [arg1] "r" (ARG1),                             \
+                 [arg2] "r" (ARG2)                              \
                : "memory");                                     \
           retval;                                               \
         })
                : "memory");                                     \
           retval;                                               \
         })