Anthony Liguori wrote:
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. Since v1, I've also added a "m" constraint for the inputs to the hypercall. This was suggested by Christian since it's not entirely clear whether a memory clobber will force the data to be in memory before the asm statement. In the very least, it helps to be more conservative. Signed-off-by: Anthony Liguori <[EMAIL PROTECTED]> @@ -80,7 +81,9 @@ 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), + "m"(*(char *)p1) + : "memory"); return ret; }
Those are physical addresses, not virtual, and on i386 the addresses are split across multiple registers.
However a small test program shows that the memory clobber does work with gcc 4.3, so I'll pick the earlier patch.
-- I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
