Re: KVM: pvmmu breakage with gcc 4.3.0

Christian Borntraeger
2008-06-26T17:53:18Z

Am Donnerstag, 26. Juni 2008 schrieb Anthony Liguori:
> Christian Borntraeger wrote:
> > 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;
> > }
> >
>
> I don't know exactly what the rules are when you cast from pointer to
> unsigned long. What I'm concerned about is that if there are a few
> layers of indirection, GCC won't be able to propagate the liveness of
> the pointer p1. It has to be able to figure out that p1 here was really
> that point on the stack. From the perspective of being conservative, it
> certainly can't hurt, but I'm not sure it solves the problem by itself.
>
> This is why I think the "memory" constraint is really the right
> solution. That should force GCC to be very conservative about syncing
> everything to memory.

The thing is, that your patch has "memory" in the clobber list. I dont know
if clobber constraints give any guarantees about input constraints. Thats why
I think that "b" plus "m" as input constraints are better. Does gcc actually
accept "memory" as input contraint?

I think I have to ask our compiler developers, but in 5 minutes I will be
offline until monday...