From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Date: Tue, 29 Sep 2009 09:14:59 +0000 Subject: Re: [PATCH 26/27] Enable 32bit dirty log pointers on 64bit host Message-Id: <4AC1D013.9040600@redhat.com> List-Id: References: <1254212303-8737-27-git-send-email-agraf@suse.de> In-Reply-To: <1254212303-8737-27-git-send-email-agraf@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: kvm-ppc@vger.kernel.org On 09/29/2009 10:18 AM, Alexander Graf wrote: > With big endian userspace, we can't quite figure out if a pointer > is 32 bit (shifted>> 32) or 64 bit when we read a 64 bit pointer. > > This is what happens with dirty logging. To get the pointer interpreted > correctly, I just make it bounce twice, but admittedly that is not ideal. > > I'm open for suggestions here. > > How about adding a new union member to struct kvm_dirty_log: __u64 dirty_bitmap_virt; and deprecate dirty_bitmap. > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index e27b7a9..91c0225 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -720,6 +720,11 @@ int kvm_get_dirty_log(struct kvm *kvm, > > r = -EFAULT; > if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n)) > +#ifdef __BIG_ENDIAN > + /* Did we get a 32 bit pointer? */ > + if (copy_to_user((void*)((u64)log->dirty_bitmap>> 32), > + memslot->dirty_bitmap, n)) > +#endif > goto out; > > if (any) > -- error compiling committee.c: too many arguments to function