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

Reply via email to