Commit 5593eaa8 authored by H. Peter Anvin's avatar H. Peter Anvin

[x86 setup] Fix assembly constraints

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: default avatarH. Peter Anvin <hpa@zytor.com>
parent 9aa3909c
...@@ -56,7 +56,7 @@ static inline u16 inw(u16 port) ...@@ -56,7 +56,7 @@ static inline u16 inw(u16 port)
static inline void outl(u32 v, 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) static inline u32 inl(u32 port)
{ {
......
...@@ -115,8 +115,8 @@ static int has_eflag(u32 mask) ...@@ -115,8 +115,8 @@ static int has_eflag(u32 mask)
"pushfl ; " "pushfl ; "
"popl %1 ; " "popl %1 ; "
"popfl" "popfl"
: "=r" (f0), "=r" (f1) : "=&r" (f0), "=&r" (f1)
: "g" (mask)); : "ri" (mask));
return !!((f0^f1) & mask); return !!((f0^f1) & mask);
} }
......
...@@ -26,7 +26,7 @@ int query_mca(void) ...@@ -26,7 +26,7 @@ int query_mca(void)
"setc %0 ; " "setc %0 ; "
"movw %%es, %1 ; " "movw %%es, %1 ; "
"popw %%es" "popw %%es"
: "=acdSDm" (err), "=acdSDm" (es), "=b" (bx) : "=acd" (err), "=acdSD" (es), "=b" (bx)
: "a" (0xc000)); : "a" (0xc000));
if (err) if (err)
......
...@@ -65,7 +65,7 @@ static void move_kernel_around(void) ...@@ -65,7 +65,7 @@ static void move_kernel_around(void)
"popw %%ds ; " "popw %%ds ; "
"popw %%es" "popw %%es"
: "+c" (dwords) : "+c" (dwords)
: "rm" (dst_seg), "rm" (src_seg) : "r" (dst_seg), "r" (src_seg)
: "esi", "edi"); : "esi", "edi");
syssize -= paras; syssize -= paras;
......
...@@ -411,7 +411,7 @@ static void restore_screen(void) ...@@ -411,7 +411,7 @@ static void restore_screen(void)
"1: rep;stosl ; " "1: rep;stosl ; "
"popw %%es" "popw %%es"
: "+D" (dst), "+c" (npad) : "+D" (dst), "+c" (npad)
: "bdSm" (video_segment), : "bdS" (video_segment),
"a" (0x07200720)); "a" (0x07200720));
} }
......
...@@ -32,7 +32,7 @@ int query_voyager(void) ...@@ -32,7 +32,7 @@ int query_voyager(void)
"setc %0 ; " "setc %0 ; "
"movw %%es, %1 ; " "movw %%es, %1 ; "
"popw %%es" "popw %%es"
: "=qm" (err), "=rm" (es), "=D" (di) : "=q" (err), "=r" (es), "=D" (di)
: "a" (0xffc0)); : "a" (0xffc0));
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment