From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: KVM: pvmmu breakage with gcc 4.3.0 Date: Sun, 29 Jun 2008 13:16:55 +0300 Message-ID: <48676117.4060006@qumranet.com> References: <20080626021047.GA10263@dmt.cnet> <486380DB.9070905@qumranet.com> <200806261708.09579.borntraeger@de.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , Anthony Liguori , Alexandre Oliva , kvm-devel To: Christian Borntraeger Return-path: Received: from il.qumranet.com ([212.179.150.194]:42280 "EHLO il.qumranet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753330AbYF2KQ4 (ORCPT ); Sun, 29 Jun 2008 06:16:56 -0400 In-Reply-To: <200806261708.09579.borntraeger@de.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: 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; > } > > > 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. > That only works if p1 is a virtual address. x86 (and ppc) hypercalls use physical addresses. -- error compiling committee.c: too many arguments to function