Re: KVM: pvmmu breakage with gcc 4.3.0

Christian Borntraeger
2008-06-26T15:08:37Z

Am Donnerstag, 26. Juni 2008 schrieb Avi Kivity:
> I don't think "p" should force the contents into memory? Perhaps
> "m"(*(char *)buffer)?
>
> Anthony, I don't see why a memory clobber would tell gcc that the
> variables is actually used. The problem is with the void * -> unsigned
> long cast (__pa), once that happens gcc loses track. It's probably
> needed anyway since hypercalls _do_ clobber memory.

I I think about that again, the correct solution should be to use 2 input
constraints for parameters together with the memory clobber on hypercall.

I think something like the following covers all cases:

static inline long kvm_hypercall1(unsigned int nr, unsigned long p1)
{
long ret;
asm volatile(KVM_HYPERCALL
: "=a"(ret)
: "a"(nr), "b"(p1), "m"(*(char *) p1)
: "memory" );
return ret;
}

The address and the memory content of p1 (if it is a pointer) is not ommitted
by gcc. Furthermore, the memory clobbering nature of a hypercall is specified
as well.

Christian