x86: KVM guest: Add memory clobber to hypercalls
Hypercalls can modify arbitrary regions of memory. Make sure to indicate this in the clobber list. This fixes a hang when using KVM_GUEST kernel built with GCC 4.3.0. This was originally spotted and analyzed by Marcelo. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
b7279469d6
commit
ca3739327b
|
@ -71,7 +71,8 @@ static inline long kvm_hypercall0(unsigned int nr)
|
|||
long ret;
|
||||
asm volatile(KVM_HYPERCALL
|
||||
: "=a"(ret)
|
||||
: "a"(nr));
|
||||
: "a"(nr)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -80,7 +81,8 @@ static inline long kvm_hypercall1(unsigned int nr, unsigned long p1)
|
|||
long ret;
|
||||
asm volatile(KVM_HYPERCALL
|
||||
: "=a"(ret)
|
||||
: "a"(nr), "b"(p1));
|
||||
: "a"(nr), "b"(p1)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -90,7 +92,8 @@ static inline long kvm_hypercall2(unsigned int nr, unsigned long p1,
|
|||
long ret;
|
||||
asm volatile(KVM_HYPERCALL
|
||||
: "=a"(ret)
|
||||
: "a"(nr), "b"(p1), "c"(p2));
|
||||
: "a"(nr), "b"(p1), "c"(p2)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -100,7 +103,8 @@ static inline long kvm_hypercall3(unsigned int nr, unsigned long p1,
|
|||
long ret;
|
||||
asm volatile(KVM_HYPERCALL
|
||||
: "=a"(ret)
|
||||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3));
|
||||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -111,7 +115,8 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,
|
|||
long ret;
|
||||
asm volatile(KVM_HYPERCALL
|
||||
: "=a"(ret)
|
||||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4));
|
||||
: "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)
|
||||
: "memory");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue