mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 04:25:27 +08:00
[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: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
9aa3909c0e
commit
5593eaa854
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user