From patchwork Tue Sep 4 07:36:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Kardashevskiy X-Patchwork-Id: 181510 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id 152FA2C04D9 for ; Tue, 4 Sep 2012 17:37:11 +1000 (EST) Received: from mail-iy0-f179.google.com (mail-iy0-f179.google.com [209.85.210.179]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 01B002C0426 for ; Tue, 4 Sep 2012 17:36:35 +1000 (EST) Received: by iage36 with SMTP id e36so8145055iag.38 for ; Tue, 04 Sep 2012 00:36:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=3qJpCWqqTjVbeElZwCwApUpf2YYWuXeblYSxLwBYhzE=; b=jPOOeGL9ifNiZe4b/N2vT3jQnB4tVyWQFwzuS+n7a/0kh7CwdaOCV5/hMGRX4uONg2 sQ6jaFv2y2SpJoh6Iee1KrORkjdkGq4/zHbJ13Fk1wMYWRuAhjdTWuScEtDT/Y0A2fWV Hg3BE8YtwJngGf+7UZVIstiH9TMzDVDAbIB1d6f+24Z4G/aLzmokDMFbTsBecNnEsq7x OKryE0/AvoBqkBrmUzinkFK8ytElHSMQY/ogGk/FcS4b5dOPehNq/0s8Hv2IspjOeqzr h3MBjcGdiMJ5qQ6z0JyrGVGQRtQtJmxwjFuY7njer8OLSr4FfgMGnEQWrg4F8nssujDk +Kog== Received: by 10.50.209.99 with SMTP id ml3mr13178066igc.31.1346744193349; Tue, 04 Sep 2012 00:36:33 -0700 (PDT) Received: from ka1.ozlabs.ibm.com (ibmaus65.lnk.telstra.net. [165.228.126.9]) by mx.google.com with ESMTPS id p5sm11564505igm.13.2012.09.04.00.36.30 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 04 Sep 2012 00:36:33 -0700 (PDT) From: Alexey Kardashevskiy To: Benjamin Herrenschmidt Subject: [PATCH] powerpc-kvm: fixing page alignment for TCE Date: Tue, 4 Sep 2012 17:36:27 +1000 Message-Id: <1346744187-31226-1-git-send-email-aik@ozlabs.ru> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1346744035-31154-1-git-send-email-aik@ozlabs.ru> References: <1346744035-31154-1-git-send-email-aik@ozlabs.ru> X-Gm-Message-State: ALoCoQl/ncn0NYJuFbSJBl9rdzP/jQ5RJ5xB+ys4iNPEg4ZB7HSWjOJ2TiLMkFggyr0lSWHma7XI Cc: Alexey Kardashevskiy , linuxppc-dev@lists.ozlabs.org, Paul Mackerras , kvm-ppc@vger.kernel.org, David Gibson X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" From: Paul Mackerras TODO: ask Paul to make a proper message. This is the fix for a host kernel compiled with a page size other than 4K (TCE page size). In the case of a 64K page size, the host used to lose address bits in hpte_rpn(). The patch fixes it. Signed-off-by: Alexey Kardashevskiy --- arch/powerpc/kvm/book3s_64_mmu_hv.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c index 80a5775..a41f11b 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c @@ -503,7 +503,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, struct kvm *kvm = vcpu->kvm; unsigned long *hptep, hpte[3], r; unsigned long mmu_seq, psize, pte_size; - unsigned long gfn, hva, pfn; + unsigned long gpa, gfn, hva, pfn; struct kvm_memory_slot *memslot; unsigned long *rmap; struct revmap_entry *rev; @@ -541,15 +541,14 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu, /* Translate the logical address and get the page */ psize = hpte_page_size(hpte[0], r); - gfn = hpte_rpn(r, psize); + gpa = (r & HPTE_R_RPN & ~(psize - 1)) | (ea & (psize - 1)); + gfn = gpa >> PAGE_SHIFT; memslot = gfn_to_memslot(kvm, gfn); /* No memslot means it's an emulated MMIO region */ - if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) { - unsigned long gpa = (gfn << PAGE_SHIFT) | (ea & (psize - 1)); + if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea, dsisr & DSISR_ISSTORE); - } if (!kvm->arch.using_mmu_notifiers) return -EFAULT; /* should never get here */