[x86 setup] Fix assembly constraints
authorH. Peter Anvin <hpa@zytor.com>
Sat, 14 Jul 2007 23:47:13 +0000 (16:47 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 18 Jul 2007 18:36:17 +0000 (11:36 -0700)
Fix incorrect assembly constraints.  In particular, fix memory
constraints used inside push..pop, which can cause invalid operation
since gcc may generate %esp-relative references.

Additionally:

outl() should have "dN" not "dn".

query_mca() shouldn't listen 16/32-bit registers in an 8-bit only
context.

has_eflag(): the "mask" is only used well after both the stack pointer
and the output registers have been touched; this requires the output
registers to be earlyclobbers (=&) and the input to exclude memory (so
"ri", not "g").

Thanks to Etienne Lorrain and Chuck Ebbert for prompting this review.

Cc: Etienne Lorrain <etienne_lorrain@yahoo.fr>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/i386/boot/boot.h
arch/i386/boot/cpucheck.c
arch/i386/boot/mca.c
arch/i386/boot/pm.c
arch/i386/boot/video.c
arch/i386/boot/voyager.c

index 0329c4fe4f88956b4a423f41c61e7d96b5a5a649..dec70c9b6050073ebdfc50dd7be9f6ed08d08efb 100644 (file)
@@ -56,7 +56,7 @@ static inline u16 inw(u16 port)
 
 static inline void outl(u32 v, u16 port)
 {
-       asm volatile("outl %0,%1" : : "a" (v), "dn" (port));
+       asm volatile("outl %0,%1" : : "a" (v), "dN" (port));
 }
 static inline u32 inl(u32 port)
 {
index 8b0f4473b083efac607796179248a5bf98a35f52..991e8ceae1de3c296a0f456fe7aa86c08d763814 100644 (file)
@@ -115,8 +115,8 @@ static int has_eflag(u32 mask)
            "pushfl ; "
            "popl %1 ; "
            "popfl"
-           : "=r" (f0), "=r" (f1)
-           : "g" (mask));
+           : "=&r" (f0), "=&r" (f1)
+           : "ri" (mask));
 
        return !!((f0^f1) & mask);
 }
index 9b68bd1aef19d35c2ae5c75a790a2fd7dc93ba33..68222f2d4b670479fd7656f4036c848bfed7e5e8 100644 (file)
@@ -26,7 +26,7 @@ int query_mca(void)
            "setc %0 ; "
            "movw %%es, %1 ; "
            "popw %%es"
-           : "=acdSDm" (err), "=acdSDm" (es), "=b" (bx)
+           : "=acd" (err), "=acdSD" (es), "=b" (bx)
            : "a" (0xc000));
 
        if (err)
index 3fa53e15ed776e334921f7d54d7006ffff3faa90..1df025c732613fde1b8f79e20e740103e8433e1b 100644 (file)
@@ -65,7 +65,7 @@ static void move_kernel_around(void)
                             "popw %%ds ; "
                             "popw %%es"
                             : "+c" (dwords)
-                            : "rm" (dst_seg), "rm" (src_seg)
+                            : "r" (dst_seg), "r" (src_seg)
                             : "esi", "edi");
 
                syssize -= paras;
index 3bb3573cd6a15ad07b34a5324634f516bd726b71..027a2c90300bc5f35e8a6ad416cf9042bef28298 100644 (file)
@@ -411,7 +411,7 @@ static void restore_screen(void)
                             "1: rep;stosl ; "
                             "popw %%es"
                             : "+D" (dst), "+c" (npad)
-                            : "bdSm" (video_segment),
+                            : "bdS" (video_segment),
                               "a" (0x07200720));
        }
 
index 9221614d0db8cd1c2c82cb1002cc7671f03729c4..61c8fe0453be5e08773e6334d7361edddcb5c78c 100644 (file)
@@ -32,7 +32,7 @@ int query_voyager(void)
            "setc %0 ; "
            "movw %%es, %1 ; "
            "popw %%es"
-           : "=qm" (err), "=rm" (es), "=D" (di)
+           : "=q" (err), "=r" (es), "=D" (di)
            : "a" (0xffc0));
 
        if (err)