From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37117) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ad7tk-0003VX-II for qemu-devel@nongnu.org; Mon, 07 Mar 2016 22:01:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ad7tg-0002UG-6r for qemu-devel@nongnu.org; Mon, 07 Mar 2016 22:01:24 -0500 Received: from mail-pa0-x22e.google.com ([2607:f8b0:400e:c03::22e]:33868) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ad7tf-0002Tn-NI for qemu-devel@nongnu.org; Mon, 07 Mar 2016 22:01:20 -0500 Received: by mail-pa0-x22e.google.com with SMTP id fy10so2336605pac.1 for ; Mon, 07 Mar 2016 19:01:19 -0800 (PST) References: <1457317586-15122-1-git-send-email-david@gibson.dropbear.id.au> <1457317586-15122-2-git-send-email-david@gibson.dropbear.id.au> <20160308003702.GQ22546@voom.fritz.box> From: Alexey Kardashevskiy Message-ID: <56DE4078.3050809@ozlabs.ru> Date: Tue, 8 Mar 2016 14:01:12 +1100 MIME-Version: 1.0 In-Reply-To: <20160308003702.GQ22546@voom.fritz.box> Content-Type: text/plain; charset=koi8-r; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCHv2 1/3] target-ppc: Split out SREGS get/put functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: David Gibson , gkurz@linux.vnet.ibm.com Cc: lvivier@redhat.com, thuth@redhat.com, qemu-ppc@nongnu.org, agraf@suse.de, qemu-devel@nongnu.org On 03/08/2016 11:37 AM, David Gibson wrote: > On Mon, Mar 07, 2016 at 01:26:24PM +1100, David Gibson wrote: >> Currently the getting and setting of Power MMU registers (sregs) take up >> large inline chunks of the kvm_arch_get_registers() and >> kvm_arch_put_registers() functions. Especially since there are two >> variants (for Book-E and Book-S CPUs), only one of which will be used in >> practice, this is pretty hard to read. >> >> This patch splits these out into helper functions for clarity. No >> functional change is expected. >> >> Signed-off-by: David Gibson > > Greg, or Alexey, can I can an R-b for this one as well? Well, the patch itself is quite alright but you could do BookE and BookS changes in separate patches. And some more comments below. > >> --- >> target-ppc/kvm.c | 421 ++++++++++++++++++++++++++++++------------------------- >> 1 file changed, 228 insertions(+), 193 deletions(-) >> >> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c >> index d67c169..8a762e8 100644 >> --- a/target-ppc/kvm.c >> +++ b/target-ppc/kvm.c >> @@ -867,6 +867,44 @@ static int kvm_put_vpa(CPUState *cs) >> } >> #endif /* TARGET_PPC64 */ >> >> +static int kvmppc_put_books_sregs(PowerPCCPU *cpu) >> +{ >> + CPUPPCState *env = &cpu->env; >> + struct kvm_sregs sregs; >> + int i; >> + >> + sregs.pvr = env->spr[SPR_PVR]; >> + >> + sregs.u.s.sdr1 = env->spr[SPR_SDR1]; >> + >> + /* Sync SLB */ >> +#ifdef TARGET_PPC64 >> + for (i = 0; i < ARRAY_SIZE(env->slb); i++) { >> + sregs.u.s.ppc64.slb[i].slbe = env->slb[i].esid; >> + if (env->slb[i].esid & SLB_ESID_V) { >> + sregs.u.s.ppc64.slb[i].slbe |= i; >> + } >> + sregs.u.s.ppc64.slb[i].slbv = env->slb[i].vsid; >> + } >> +#endif >> + >> + /* Sync SRs */ >> + for (i = 0; i < 16; i++) { >> + sregs.u.s.ppc32.sr[i] = env->sr[i]; >> + } >> + >> + /* Sync BATs */ >> + for (i = 0; i < 8; i++) { >> + /* Beware. We have to swap upper and lower bits here */ >> + sregs.u.s.ppc32.dbat[i] = ((uint64_t)env->DBAT[0][i] << 32) >> + | env->DBAT[1][i]; >> + sregs.u.s.ppc32.ibat[i] = ((uint64_t)env->IBAT[0][i] << 32) >> + | env->IBAT[1][i]; >> + } >> + >> + return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs); >> +} >> + >> int kvm_arch_put_registers(CPUState *cs, int level) >> { >> PowerPCCPU *cpu = POWERPC_CPU(cs); >> @@ -920,39 +958,8 @@ int kvm_arch_put_registers(CPUState *cs, int level) >> } >> >> if (cap_segstate && (level >= KVM_PUT_RESET_STATE)) { >> - struct kvm_sregs sregs; >> - >> - sregs.pvr = env->spr[SPR_PVR]; >> - >> - sregs.u.s.sdr1 = env->spr[SPR_SDR1]; >> - >> - /* Sync SLB */ >> -#ifdef TARGET_PPC64 >> - for (i = 0; i < ARRAY_SIZE(env->slb); i++) { >> - sregs.u.s.ppc64.slb[i].slbe = env->slb[i].esid; >> - if (env->slb[i].esid & SLB_ESID_V) { >> - sregs.u.s.ppc64.slb[i].slbe |= i; >> - } >> - sregs.u.s.ppc64.slb[i].slbv = env->slb[i].vsid; >> - } >> -#endif >> - >> - /* Sync SRs */ >> - for (i = 0; i < 16; i++) { >> - sregs.u.s.ppc32.sr[i] = env->sr[i]; >> - } >> - >> - /* Sync BATs */ >> - for (i = 0; i < 8; i++) { >> - /* Beware. We have to swap upper and lower bits here */ >> - sregs.u.s.ppc32.dbat[i] = ((uint64_t)env->DBAT[0][i] << 32) >> - | env->DBAT[1][i]; >> - sregs.u.s.ppc32.ibat[i] = ((uint64_t)env->IBAT[0][i] << 32) >> - | env->IBAT[1][i]; >> - } >> - >> - ret = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs); >> - if (ret) { >> + ret = kvmppc_put_books_sregs(cpu); >> + if (ret < 0) { >> return ret; >> } >> } >> @@ -1014,12 +1021,197 @@ static void kvm_sync_excp(CPUPPCState *env, int vector, int ivor) >> env->excp_vectors[vector] = env->spr[ivor] + env->spr[SPR_BOOKE_IVPR]; >> } >> >> +static int kvmppc_get_booke_sregs(PowerPCCPU *cpu) I found it confusing that the patch is not adding kvmppc_put_booke_sregs... Not a problem of this patch though but if the commit log for booke-only patch has mentioned it, I would not have to have a look in QEMU tree :) >> +{ >> + CPUPPCState *env = &cpu->env; >> + struct kvm_sregs sregs; >> + int ret; >> + >> + ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS, &sregs); >> + if (ret < 0) { >> + return ret; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_BASE) { >> + env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0; >> + env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1; >> + env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr; >> + env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear; >> + env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr; >> + env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr; >> + env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr; >> + env->spr[SPR_DECR] = sregs.u.e.dec; >> + env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff; >> + env->spr[SPR_TBU] = sregs.u.e.tb >> 32; >> + env->spr[SPR_VRSAVE] = sregs.u.e.vrsave; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_ARCH206) { >> + env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir; >> + env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0; >> + env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1; >> + env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar; >> + env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_64) { >> + env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_SPRG8) { >> + env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_IVOR) { >> + env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0]; >> + kvm_sync_excp(env, POWERPC_EXCP_CRITICAL, SPR_BOOKE_IVOR0); >> + env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1]; >> + kvm_sync_excp(env, POWERPC_EXCP_MCHECK, SPR_BOOKE_IVOR1); >> + env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2]; >> + kvm_sync_excp(env, POWERPC_EXCP_DSI, SPR_BOOKE_IVOR2); >> + env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3]; >> + kvm_sync_excp(env, POWERPC_EXCP_ISI, SPR_BOOKE_IVOR3); >> + env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4]; >> + kvm_sync_excp(env, POWERPC_EXCP_EXTERNAL, SPR_BOOKE_IVOR4); >> + env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5]; >> + kvm_sync_excp(env, POWERPC_EXCP_ALIGN, SPR_BOOKE_IVOR5); >> + env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6]; >> + kvm_sync_excp(env, POWERPC_EXCP_PROGRAM, SPR_BOOKE_IVOR6); >> + env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7]; >> + kvm_sync_excp(env, POWERPC_EXCP_FPU, SPR_BOOKE_IVOR7); >> + env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8]; >> + kvm_sync_excp(env, POWERPC_EXCP_SYSCALL, SPR_BOOKE_IVOR8); >> + env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9]; >> + kvm_sync_excp(env, POWERPC_EXCP_APU, SPR_BOOKE_IVOR9); >> + env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10]; >> + kvm_sync_excp(env, POWERPC_EXCP_DECR, SPR_BOOKE_IVOR10); >> + env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11]; >> + kvm_sync_excp(env, POWERPC_EXCP_FIT, SPR_BOOKE_IVOR11); >> + env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12]; >> + kvm_sync_excp(env, POWERPC_EXCP_WDT, SPR_BOOKE_IVOR12); >> + env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13]; >> + kvm_sync_excp(env, POWERPC_EXCP_DTLB, SPR_BOOKE_IVOR13); >> + env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14]; >> + kvm_sync_excp(env, POWERPC_EXCP_ITLB, SPR_BOOKE_IVOR14); >> + env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15]; >> + kvm_sync_excp(env, POWERPC_EXCP_DEBUG, SPR_BOOKE_IVOR15); >> + >> + if (sregs.u.e.features & KVM_SREGS_E_SPE) { >> + env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0]; >> + kvm_sync_excp(env, POWERPC_EXCP_SPEU, SPR_BOOKE_IVOR32); >> + env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1]; >> + kvm_sync_excp(env, POWERPC_EXCP_EFPDI, SPR_BOOKE_IVOR33); >> + env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2]; >> + kvm_sync_excp(env, POWERPC_EXCP_EFPRI, SPR_BOOKE_IVOR34); >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_PM) { >> + env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3]; >> + kvm_sync_excp(env, POWERPC_EXCP_EPERFM, SPR_BOOKE_IVOR35); >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_PC) { >> + env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4]; >> + kvm_sync_excp(env, POWERPC_EXCP_DOORI, SPR_BOOKE_IVOR36); >> + env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5]; >> + kvm_sync_excp(env, POWERPC_EXCP_DOORCI, SPR_BOOKE_IVOR37); >> + } >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_ARCH206_MMU) { >> + env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0; >> + env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1; >> + env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2; >> + env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff; >> + env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4; >> + env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6; >> + env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32; >> + env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg; >> + env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0]; >> + env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1]; >> + } Wrong indend. >> + >> + if (sregs.u.e.features & KVM_SREGS_EXP) { >> + env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr; >> + } >> + >> + if (sregs.u.e.features & KVM_SREGS_E_PD) { >> + env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc; >> + env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc; >> + } >> + >> + if (sregs.u.e.impl_id == KVM_SREGS_E_IMPL_FSL) { >> + env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr; >> + env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar; >> + env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0; >> + >> + if (sregs.u.e.impl.fsl.features & KVM_SREGS_E_FSL_PIDn) { >> + env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1; >> + env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2; >> + } >> + } >> + >> + return 0; >> +} >> + >> +static int kvmppc_get_books_sregs(PowerPCCPU *cpu) >> +{ >> + CPUPPCState *env = &cpu->env; >> + struct kvm_sregs sregs; >> + int ret; >> + int i; >> + >> + ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS, &sregs); >> + if (ret < 0) { >> + return ret; >> + } >> + >> + if (!env->external_htab) { >> + ppc_store_sdr1(env, sregs.u.s.sdr1); >> + } >> + >> + /* Sync SLB */ >> +#ifdef TARGET_PPC64 >> + /* >> + * The packed SLB array we get from KVM_GET_SREGS only contains >> + * information about valid entries. So we flush our internal copy >> + * to get rid of stale ones, then put all valid SLB entries back >> + * in. >> + */ >> + memset(env->slb, 0, sizeof(env->slb)); >> + for (i = 0; i < ARRAY_SIZE(env->slb); i++) { >> + target_ulong rb = sregs.u.s.ppc64.slb[i].slbe; >> + target_ulong rs = sregs.u.s.ppc64.slb[i].slbv; >> + /* >> + * Only restore valid entries >> + */ >> + if (rb & SLB_ESID_V) { >> + ppc_store_slb(cpu, rb & 0xfff, rb & ~0xfffULL, rs); >> + } >> + } >> +#endif >> + >> + /* Sync SRs */ >> + for (i = 0; i < 16; i++) { >> + env->sr[i] = sregs.u.s.ppc32.sr[i]; >> + } >> + >> + /* Sync BATs */ >> + for (i = 0; i < 8; i++) { >> + env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff; >> + env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32; >> + env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff; >> + env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32; >> + } >> + >> + return 0; >> +} >> + >> int kvm_arch_get_registers(CPUState *cs) >> { >> PowerPCCPU *cpu = POWERPC_CPU(cs); >> CPUPPCState *env = &cpu->env; >> struct kvm_regs regs; >> - struct kvm_sregs sregs; >> uint32_t cr; >> int i, ret; >> >> @@ -1059,174 +1251,17 @@ int kvm_arch_get_registers(CPUState *cs) >> kvm_get_fp(cs); >> >> if (cap_booke_sregs) { >> - ret = kvm_vcpu_ioctl(cs, KVM_GET_SREGS, &sregs); >> + ret = kvmppc_get_booke_sregs(cpu); >> if (ret < 0) { >> return ret; >> } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_BASE) { >> - env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0; >> - env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1; >> - env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr; >> - env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear; >> - env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr; >> - env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr; >> - env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr; >> - env->spr[SPR_DECR] = sregs.u.e.dec; >> - env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff; >> - env->spr[SPR_TBU] = sregs.u.e.tb >> 32; >> - env->spr[SPR_VRSAVE] = sregs.u.e.vrsave; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_ARCH206) { >> - env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir; >> - env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0; >> - env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1; >> - env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar; >> - env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_64) { >> - env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_SPRG8) { >> - env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_IVOR) { >> - env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0]; >> - kvm_sync_excp(env, POWERPC_EXCP_CRITICAL, SPR_BOOKE_IVOR0); >> - env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1]; >> - kvm_sync_excp(env, POWERPC_EXCP_MCHECK, SPR_BOOKE_IVOR1); >> - env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2]; >> - kvm_sync_excp(env, POWERPC_EXCP_DSI, SPR_BOOKE_IVOR2); >> - env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3]; >> - kvm_sync_excp(env, POWERPC_EXCP_ISI, SPR_BOOKE_IVOR3); >> - env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4]; >> - kvm_sync_excp(env, POWERPC_EXCP_EXTERNAL, SPR_BOOKE_IVOR4); >> - env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5]; >> - kvm_sync_excp(env, POWERPC_EXCP_ALIGN, SPR_BOOKE_IVOR5); >> - env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6]; >> - kvm_sync_excp(env, POWERPC_EXCP_PROGRAM, SPR_BOOKE_IVOR6); >> - env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7]; >> - kvm_sync_excp(env, POWERPC_EXCP_FPU, SPR_BOOKE_IVOR7); >> - env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8]; >> - kvm_sync_excp(env, POWERPC_EXCP_SYSCALL, SPR_BOOKE_IVOR8); >> - env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9]; >> - kvm_sync_excp(env, POWERPC_EXCP_APU, SPR_BOOKE_IVOR9); >> - env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10]; >> - kvm_sync_excp(env, POWERPC_EXCP_DECR, SPR_BOOKE_IVOR10); >> - env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11]; >> - kvm_sync_excp(env, POWERPC_EXCP_FIT, SPR_BOOKE_IVOR11); >> - env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12]; >> - kvm_sync_excp(env, POWERPC_EXCP_WDT, SPR_BOOKE_IVOR12); >> - env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13]; >> - kvm_sync_excp(env, POWERPC_EXCP_DTLB, SPR_BOOKE_IVOR13); >> - env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14]; >> - kvm_sync_excp(env, POWERPC_EXCP_ITLB, SPR_BOOKE_IVOR14); >> - env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15]; >> - kvm_sync_excp(env, POWERPC_EXCP_DEBUG, SPR_BOOKE_IVOR15); >> - >> - if (sregs.u.e.features & KVM_SREGS_E_SPE) { >> - env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0]; >> - kvm_sync_excp(env, POWERPC_EXCP_SPEU, SPR_BOOKE_IVOR32); >> - env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1]; >> - kvm_sync_excp(env, POWERPC_EXCP_EFPDI, SPR_BOOKE_IVOR33); >> - env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2]; >> - kvm_sync_excp(env, POWERPC_EXCP_EFPRI, SPR_BOOKE_IVOR34); >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_PM) { >> - env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3]; >> - kvm_sync_excp(env, POWERPC_EXCP_EPERFM, SPR_BOOKE_IVOR35); >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_PC) { >> - env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4]; >> - kvm_sync_excp(env, POWERPC_EXCP_DOORI, SPR_BOOKE_IVOR36); >> - env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5]; >> - kvm_sync_excp(env, POWERPC_EXCP_DOORCI, SPR_BOOKE_IVOR37); >> - } >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_ARCH206_MMU) { >> - env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0; >> - env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1; >> - env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2; >> - env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff; >> - env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4; >> - env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6; >> - env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32; >> - env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg; >> - env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0]; >> - env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1]; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_EXP) { >> - env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr; >> - } >> - >> - if (sregs.u.e.features & KVM_SREGS_E_PD) { >> - env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc; >> - env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc; >> - } >> - >> - if (sregs.u.e.impl_id == KVM_SREGS_E_IMPL_FSL) { >> - env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr; >> - env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar; >> - env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0; >> - >> - if (sregs.u.e.impl.fsl.features & KVM_SREGS_E_FSL_PIDn) { >> - env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1; >> - env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2; >> - } >> - } >> } >> >> if (cap_segstate) { >> - ret = kvm_vcpu_ioctl(cs, KVM_GET_SREGS, &sregs); >> + ret = kvmppc_get_books_sregs(cpu); s/kvmppc_get_books_sregs/kvmppc_get_books_segstate_sregs/ or fold "if (cap_hior)" (at the end of this chunk) into kvmppc_get_books_sregs(). >> if (ret < 0) { >> return ret; >> } >> - >> - if (!env->external_htab) { >> - ppc_store_sdr1(env, sregs.u.s.sdr1); >> - } >> - >> - /* Sync SLB */ >> -#ifdef TARGET_PPC64 >> - /* >> - * The packed SLB array we get from KVM_GET_SREGS only contains >> - * information about valid entries. So we flush our internal >> - * copy to get rid of stale ones, then put all valid SLB entries >> - * back in. >> - */ >> - memset(env->slb, 0, sizeof(env->slb)); >> - for (i = 0; i < ARRAY_SIZE(env->slb); i++) { >> - target_ulong rb = sregs.u.s.ppc64.slb[i].slbe; >> - target_ulong rs = sregs.u.s.ppc64.slb[i].slbv; >> - /* >> - * Only restore valid entries >> - */ >> - if (rb & SLB_ESID_V) { >> - ppc_store_slb(cpu, rb & 0xfff, rb & ~0xfffULL, rs); >> - } >> - } >> -#endif >> - >> - /* Sync SRs */ >> - for (i = 0; i < 16; i++) { >> - env->sr[i] = sregs.u.s.ppc32.sr[i]; >> - } >> - >> - /* Sync BATs */ >> - for (i = 0; i < 8; i++) { >> - env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff; >> - env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32; >> - env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff; >> - env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32; >> - } >> } >> >> if (cap_hior) { > -- Alexey