From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34355) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vv9E6-00088u-W4 for qemu-devel@nongnu.org; Mon, 23 Dec 2013 12:23:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Vv9Dw-0000Fn-5s for qemu-devel@nongnu.org; Mon, 23 Dec 2013 12:23:34 -0500 Received: from e28smtp01.in.ibm.com ([122.248.162.1]:44382) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vv9Dv-0000F9-Gp for qemu-devel@nongnu.org; Mon, 23 Dec 2013 12:23:24 -0500 Received: from /spool/local by e28smtp01.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 23 Dec 2013 22:53:21 +0530 From: "Aneesh Kumar K.V" Date: Mon, 23 Dec 2013 22:52:59 +0530 Message-Id: <1387819381-26354-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH -V8 1/3] target-ppc: Fix htab_mask calculation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: agraf@suse.de, paulus@samba.org Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org, "Aneesh Kumar K.V" From: "Aneesh Kumar K.V" Correctly update the htab_mask using the return value of KVM_PPC_ALLOCATE_HTAB ioctl. Also we don't update sdr1 on GET_SREGS for HV. So don't update htab_mask if sdr1 is found to be zero. Fix the pte index calculation to be same as that found in the kernel Signed-off-by: Aneesh Kumar K.V --- hw/ppc/spapr.c | 8 +++++++- target-ppc/cpu.h | 1 + target-ppc/mmu_helper.c | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 267a47d6cc4d..e99a66170661 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -731,7 +731,13 @@ static void spapr_cpu_reset(void *opaque) env->external_htab = (uint8_t *)spapr->htab; env->htab_base = -1; - env->htab_mask = HTAB_SIZE(spapr) - 1; + /* + * htab_mask is the mask used to normalize hash value to PTEG index. + * htab_shift is log2 of hash table size. + * We have 8 hpte per group, and each hpte is 16 bytes. + * ie have 128 bytes per hpte entry. + */ + env->htab_mask = (1ULL << ((spapr)->htab_shift - 7)) - 1; env->spr[SPR_SDR1] = (target_ulong)(uintptr_t)spapr->htab | (spapr->htab_shift - 18); } diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 26acdba847fa..82db9a442be5 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -955,6 +955,7 @@ struct CPUPPCState { #endif /* segment registers */ hwaddr htab_base; + /* mask used to normalize hash value to PTEG index */ hwaddr htab_mask; target_ulong sr[32]; /* externally stored hash table */ diff --git a/target-ppc/mmu_helper.c b/target-ppc/mmu_helper.c index 04a840b01697..c39cb7b89ee0 100644 --- a/target-ppc/mmu_helper.c +++ b/target-ppc/mmu_helper.c @@ -2025,7 +2025,9 @@ void ppc_store_sdr1(CPUPPCState *env, target_ulong value) " stored in SDR1\n", htabsize); htabsize = 28; } - env->htab_mask = (1ULL << (htabsize + 18)) - 1; + if (htabsize) { + env->htab_mask = (1ULL << (htabsize + 18 - 7)) - 1; + } env->htab_base = value & SDR_64_HTABORG; } else #endif /* defined(TARGET_PPC64) */ -- 1.8.3.2