Message ID | 20200224233724.46415-13-david@gibson.dropbear.id.au (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v6,01/18] pseries: Update SLOF firmware image | expand |
David Gibson <david@gibson.dropbear.id.au> writes: > Currently, we construct the SLBE used for VRMA translations when the LPCR > is written (which controls some bits in the SLBE), then use it later for > translations. > > This is a bit complex and confusing - simplify it by simply constructing > the SLBE directly from the LPCR when we need it. > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> > --- > target/ppc/cpu.h | 3 --- > target/ppc/mmu-hash64.c | 28 ++++++---------------------- > 2 files changed, 6 insertions(+), 25 deletions(-) > > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index f9871b1233..5a55fb02bd 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -1044,9 +1044,6 @@ struct CPUPPCState { > uint32_t flags; > uint64_t insns_flags; > uint64_t insns_flags2; > -#if defined(TARGET_PPC64) > - ppc_slb_t vrma_slb; > -#endif > > int error_code; > uint32_t pending_interrupts; > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c > index ac21c14f68..f8bf92aa2e 100644 > --- a/target/ppc/mmu-hash64.c > +++ b/target/ppc/mmu-hash64.c > @@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, > { > CPUState *cs = CPU(cpu); > CPUPPCState *env = &cpu->env; > + ppc_slb_t vrma_slbe; > ppc_slb_t *slb; > unsigned apshift; > hwaddr ptex; > @@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, > } > } else if (ppc_hash64_use_vrma(env)) { > /* Emulated VRMA mode */ > - slb = &env->vrma_slb; > - if (!slb->sps) { > + slb = &vrma_slbe; > + if (build_vrma_slbe(cpu, slb) != 0) { > /* Invalid VRMA setup, machine check */ > cs->exception_index = POWERPC_EXCP_MCHECK; > env->error_code = 0; > @@ -1012,6 +1013,7 @@ skip_slb_search: > hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) > { > CPUPPCState *env = &cpu->env; > + ppc_slb_t vrma_slbe; > ppc_slb_t *slb; > hwaddr ptex, raddr; > ppc_hash_pte64_t pte; > @@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) > return raddr | env->spr[SPR_HRMOR]; > } else if (ppc_hash64_use_vrma(env)) { > /* Emulated VRMA mode */ > - slb = &env->vrma_slb; > - if (!slb->sps) { > + slb = &vrma_slbe; > + if (build_vrma_slbe(cpu, slb) != 0) { > return -1; > } > } else { > @@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex, > cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH; > } > > -static void ppc_hash64_update_vrma(PowerPCCPU *cpu) > -{ > - CPUPPCState *env = &cpu->env; > - ppc_slb_t *slb = &env->vrma_slb; > - > - /* Is VRMA enabled ? */ > - if (ppc_hash64_use_vrma(env)) { > - if (build_vrma_slbe(cpu, slb) == 0) { > - return; > - } > - } > - > - /* Otherwise, clear it to indicate error */ > - slb->esid = slb->vsid = 0; > - slb->sps = NULL; > -} > - > void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) > { > PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); > CPUPPCState *env = &cpu->env; > > env->spr[SPR_LPCR] = val & pcc->lpcr_mask; > - ppc_hash64_update_vrma(cpu); > } > > void helper_store_lpcr(CPUPPCState *env, target_ulong val)
On Tue, 25 Feb 2020 10:37:18 +1100 David Gibson <david@gibson.dropbear.id.au> wrote: > Currently, we construct the SLBE used for VRMA translations when the LPCR > is written (which controls some bits in the SLBE), then use it later for > translations. > > This is a bit complex and confusing - simplify it by simply constructing > the SLBE directly from the LPCR when we need it. > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> > --- Reviewed-by: Greg Kurz <groug@kaod.org> > target/ppc/cpu.h | 3 --- > target/ppc/mmu-hash64.c | 28 ++++++---------------------- > 2 files changed, 6 insertions(+), 25 deletions(-) > > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index f9871b1233..5a55fb02bd 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -1044,9 +1044,6 @@ struct CPUPPCState { > uint32_t flags; > uint64_t insns_flags; > uint64_t insns_flags2; > -#if defined(TARGET_PPC64) > - ppc_slb_t vrma_slb; > -#endif > > int error_code; > uint32_t pending_interrupts; > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c > index ac21c14f68..f8bf92aa2e 100644 > --- a/target/ppc/mmu-hash64.c > +++ b/target/ppc/mmu-hash64.c > @@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, > { > CPUState *cs = CPU(cpu); > CPUPPCState *env = &cpu->env; > + ppc_slb_t vrma_slbe; > ppc_slb_t *slb; > unsigned apshift; > hwaddr ptex; > @@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, > } > } else if (ppc_hash64_use_vrma(env)) { > /* Emulated VRMA mode */ > - slb = &env->vrma_slb; > - if (!slb->sps) { > + slb = &vrma_slbe; > + if (build_vrma_slbe(cpu, slb) != 0) { > /* Invalid VRMA setup, machine check */ > cs->exception_index = POWERPC_EXCP_MCHECK; > env->error_code = 0; > @@ -1012,6 +1013,7 @@ skip_slb_search: > hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) > { > CPUPPCState *env = &cpu->env; > + ppc_slb_t vrma_slbe; > ppc_slb_t *slb; > hwaddr ptex, raddr; > ppc_hash_pte64_t pte; > @@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) > return raddr | env->spr[SPR_HRMOR]; > } else if (ppc_hash64_use_vrma(env)) { > /* Emulated VRMA mode */ > - slb = &env->vrma_slb; > - if (!slb->sps) { > + slb = &vrma_slbe; > + if (build_vrma_slbe(cpu, slb) != 0) { > return -1; > } > } else { > @@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex, > cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH; > } > > -static void ppc_hash64_update_vrma(PowerPCCPU *cpu) > -{ > - CPUPPCState *env = &cpu->env; > - ppc_slb_t *slb = &env->vrma_slb; > - > - /* Is VRMA enabled ? */ > - if (ppc_hash64_use_vrma(env)) { > - if (build_vrma_slbe(cpu, slb) == 0) { > - return; > - } > - } > - > - /* Otherwise, clear it to indicate error */ > - slb->esid = slb->vsid = 0; > - slb->sps = NULL; > -} > - > void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) > { > PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); > CPUPPCState *env = &cpu->env; > > env->spr[SPR_LPCR] = val & pcc->lpcr_mask; > - ppc_hash64_update_vrma(cpu); > } > > void helper_store_lpcr(CPUPPCState *env, target_ulong val)
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index f9871b1233..5a55fb02bd 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1044,9 +1044,6 @@ struct CPUPPCState { uint32_t flags; uint64_t insns_flags; uint64_t insns_flags2; -#if defined(TARGET_PPC64) - ppc_slb_t vrma_slb; -#endif int error_code; uint32_t pending_interrupts; diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index ac21c14f68..f8bf92aa2e 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; + ppc_slb_t vrma_slbe; ppc_slb_t *slb; unsigned apshift; hwaddr ptex; @@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr, } } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ - slb = &env->vrma_slb; - if (!slb->sps) { + slb = &vrma_slbe; + if (build_vrma_slbe(cpu, slb) != 0) { /* Invalid VRMA setup, machine check */ cs->exception_index = POWERPC_EXCP_MCHECK; env->error_code = 0; @@ -1012,6 +1013,7 @@ skip_slb_search: hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) { CPUPPCState *env = &cpu->env; + ppc_slb_t vrma_slbe; ppc_slb_t *slb; hwaddr ptex, raddr; ppc_hash_pte64_t pte; @@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr) return raddr | env->spr[SPR_HRMOR]; } else if (ppc_hash64_use_vrma(env)) { /* Emulated VRMA mode */ - slb = &env->vrma_slb; - if (!slb->sps) { + slb = &vrma_slbe; + if (build_vrma_slbe(cpu, slb) != 0) { return -1; } } else { @@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex, cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH; } -static void ppc_hash64_update_vrma(PowerPCCPU *cpu) -{ - CPUPPCState *env = &cpu->env; - ppc_slb_t *slb = &env->vrma_slb; - - /* Is VRMA enabled ? */ - if (ppc_hash64_use_vrma(env)) { - if (build_vrma_slbe(cpu, slb) == 0) { - return; - } - } - - /* Otherwise, clear it to indicate error */ - slb->esid = slb->vsid = 0; - slb->sps = NULL; -} - void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) { PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); CPUPPCState *env = &cpu->env; env->spr[SPR_LPCR] = val & pcc->lpcr_mask; - ppc_hash64_update_vrma(cpu); } void helper_store_lpcr(CPUPPCState *env, target_ulong val)
Currently, we construct the SLBE used for VRMA translations when the LPCR is written (which controls some bits in the SLBE), then use it later for translations. This is a bit complex and confusing - simplify it by simply constructing the SLBE directly from the LPCR when we need it. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> --- target/ppc/cpu.h | 3 --- target/ppc/mmu-hash64.c | 28 ++++++---------------------- 2 files changed, 6 insertions(+), 25 deletions(-)