[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH v2 1/2] target/ppc: Moved functions out of mmu-hash64
From: |
David Gibson |
Subject: |
Re: [RFC PATCH v2 1/2] target/ppc: Moved functions out of mmu-hash64 |
Date: |
Mon, 3 May 2021 14:24:59 +1000 |
On Fri, Apr 30, 2021 at 03:40:46PM -0300, Lucas Mateus Castro (alqotel) wrote:
> The functions ppc_store_lpcr, ppc_hash64_filter_pagesizes and
> ppc_hash64_unmap_hptes have been moved to mmu-misc.h since they are
> not needed in a !TCG context and mmu-hash64 should not be compiled
> in such situation.
>
> ppc_store_lpcr and ppc_hash64_filter_pagesizes are used by multiple
> functions, while ppc_hash64_unmap_hptes is used by rehash_hpt (in
> spapr_hcall.c).
Hmm.. looking at it, ppc_store_lpcr() (and helper_store_lpcr()) don't
really belong in this file at all. The LPCR has some things related
to the hash MMU, but plenty of others that don't. So, maybe
misc_helper.c? That might have to be moved again, since misc_helper
itself should probably mostly not be used for !TCG. But.. one thing
at a time.
AFAICT the only user of ppc_hash64_filter_pagesizes() is in
spapr_caps.c. For now you can just move it next to the caller, it's
debatable whether it belongs more to PAPR or MMU code.
ppc_hash64_unmap_hptes() is definitely TCG only and should stay where
it is. The call from rehash_hpt() can be solved because rehash_hpt()
itself is TCG only. I've already suggested splitting the TCG (well,
softmmu) only things out from spapr_hcall.c, so it might simplify
things to tackle that first.
> Also I've put the functions in mmu-misc as I am unsure in which file
> this functions should go, so I just created a new one for now, any
> suggestion which file to put them (considering it's a file that must be
> compiled in a !TCG situation)?
>
> Signed-off-by: Lucas Mateus Castro (alqotel) <lucas.araujo@eldorado.org.br>
> ---
> hw/ppc/spapr.c | 1 +
> hw/ppc/spapr_caps.c | 1 +
> hw/ppc/spapr_cpu_core.c | 1 +
> hw/ppc/spapr_hcall.c | 1 +
> hw/ppc/spapr_rtas.c | 1 +
> target/ppc/meson.build | 1 +
> target/ppc/mmu-hash64.c | 81 +-------------------------------------
> target/ppc/mmu-hash64.h | 6 ---
> target/ppc/mmu-misc.c | 86 +++++++++++++++++++++++++++++++++++++++++
> target/ppc/mmu-misc.h | 22 +++++++++++
> 10 files changed, 115 insertions(+), 86 deletions(-)
> create mode 100644 target/ppc/mmu-misc.c
> create mode 100644 target/ppc/mmu-misc.h
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index e4be00b732..61f8f150c2 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -53,6 +53,7 @@
> #include "mmu-book3s-v3.h"
> #include "cpu-models.h"
> #include "hw/core/cpu.h"
> +#include "mmu-misc.h"
>
> #include "hw/boards.h"
> #include "hw/ppc/ppc.h"
> diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
> index 9ea7ddd1e9..22352ff018 100644
> --- a/hw/ppc/spapr_caps.c
> +++ b/hw/ppc/spapr_caps.c
> @@ -34,6 +34,7 @@
> #include "kvm_ppc.h"
> #include "migration/vmstate.h"
> #include "sysemu/tcg.h"
> +#include "mmu-misc.h"
>
> #include "hw/ppc/spapr.h"
>
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 4f316a6f9d..f4d93999e5 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -24,6 +24,7 @@
> #include "sysemu/reset.h"
> #include "sysemu/hw_accel.h"
> #include "qemu/error-report.h"
> +#include "mmu-misc.h"
>
> static void spapr_reset_vcpu(PowerPCCPU *cpu)
> {
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index 7b5cd3553c..4b0ba69841 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -13,6 +13,7 @@
> #include "hw/ppc/spapr.h"
> #include "hw/ppc/spapr_cpu_core.h"
> #include "mmu-hash64.h"
> +#include "mmu-misc.h"
> #include "cpu-models.h"
> #include "trace.h"
> #include "kvm_ppc.h"
> diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> index 8a79f9c628..8935b75d1c 100644
> --- a/hw/ppc/spapr_rtas.c
> +++ b/hw/ppc/spapr_rtas.c
> @@ -35,6 +35,7 @@
> #include "sysemu/hw_accel.h"
> #include "sysemu/runstate.h"
> #include "kvm_ppc.h"
> +#include "mmu-misc.h"
>
> #include "hw/ppc/spapr.h"
> #include "hw/ppc/spapr_vio.h"
> diff --git a/target/ppc/meson.build b/target/ppc/meson.build
> index bbfef90e08..7a97648803 100644
> --- a/target/ppc/meson.build
> +++ b/target/ppc/meson.build
> @@ -31,6 +31,7 @@ ppc_softmmu_ss.add(when: 'TARGET_PPC64', if_true: files(
> 'mmu-book3s-v3.c',
> 'mmu-hash64.c',
> 'mmu-radix64.c',
> + 'mmu-misc.c',
> ))
>
> target_arch += {'ppc': ppc_ss}
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 0fabc10302..919a3e9f51 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -30,6 +30,7 @@
> #include "exec/log.h"
> #include "hw/hw.h"
> #include "mmu-book3s-v3.h"
> +#include "mmu-misc.h"
>
> /* #define DEBUG_SLB */
>
> @@ -499,20 +500,6 @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU
> *cpu,
> return hptes;
> }
>
> -void ppc_hash64_unmap_hptes(PowerPCCPU *cpu, const ppc_hash_pte64_t *hptes,
> - hwaddr ptex, int n)
> -{
> - if (cpu->vhyp) {
> - PPCVirtualHypervisorClass *vhc =
> - PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> - vhc->unmap_hptes(cpu->vhyp, hptes, ptex, n);
> - return;
> - }
> -
> - address_space_unmap(CPU(cpu)->as, (void *)hptes, n * HASH_PTE_SIZE_64,
> - false, n * HASH_PTE_SIZE_64);
> -}
> -
> static unsigned hpte_page_shift(const PPCHash64SegmentPageSizes *sps,
> uint64_t pte0, uint64_t pte1)
> {
> @@ -1119,14 +1106,6 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu,
> target_ulong ptex,
> cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
> }
>
> -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;
> -}
> -
> void helper_store_lpcr(CPUPPCState *env, target_ulong val)
> {
> PowerPCCPU *cpu = env_archcpu(env);
> @@ -1197,61 +1176,3 @@ const PPCHash64Options ppc_hash64_opts_POWER7 = {
> }
> };
>
> -void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu,
> - bool (*cb)(void *, uint32_t, uint32_t),
> - void *opaque)
> -{
> - PPCHash64Options *opts = cpu->hash64_opts;
> - int i;
> - int n = 0;
> - bool ci_largepage = false;
> -
> - assert(opts);
> -
> - n = 0;
> - for (i = 0; i < ARRAY_SIZE(opts->sps); i++) {
> - PPCHash64SegmentPageSizes *sps = &opts->sps[i];
> - int j;
> - int m = 0;
> -
> - assert(n <= i);
> -
> - if (!sps->page_shift) {
> - break;
> - }
> -
> - for (j = 0; j < ARRAY_SIZE(sps->enc); j++) {
> - PPCHash64PageSize *ps = &sps->enc[j];
> -
> - assert(m <= j);
> - if (!ps->page_shift) {
> - break;
> - }
> -
> - if (cb(opaque, sps->page_shift, ps->page_shift)) {
> - if (ps->page_shift >= 16) {
> - ci_largepage = true;
> - }
> - sps->enc[m++] = *ps;
> - }
> - }
> -
> - /* Clear rest of the row */
> - for (j = m; j < ARRAY_SIZE(sps->enc); j++) {
> - memset(&sps->enc[j], 0, sizeof(sps->enc[j]));
> - }
> -
> - if (m) {
> - n++;
> - }
> - }
> -
> - /* Clear the rest of the table */
> - for (i = n; i < ARRAY_SIZE(opts->sps); i++) {
> - memset(&opts->sps[i], 0, sizeof(opts->sps[i]));
> - }
> -
> - if (!ci_largepage) {
> - opts->flags &= ~PPC_HASH64_CI_LARGEPAGE;
> - }
> -}
> diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h
> index 87729d48b3..562602b466 100644
> --- a/target/ppc/mmu-hash64.h
> +++ b/target/ppc/mmu-hash64.h
> @@ -15,12 +15,8 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu,
> target_ulong pte0, target_ulong pte1);
> unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu,
> uint64_t pte0, uint64_t pte1);
> -void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val);
> void ppc_hash64_init(PowerPCCPU *cpu);
> void ppc_hash64_finalize(PowerPCCPU *cpu);
> -void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu,
> - bool (*cb)(void *, uint32_t, uint32_t),
> - void *opaque);
> #endif
>
> /*
> @@ -112,8 +108,6 @@ struct ppc_hash_pte64 {
>
> const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
> hwaddr ptex, int n);
> -void ppc_hash64_unmap_hptes(PowerPCCPU *cpu, const ppc_hash_pte64_t *hptes,
> - hwaddr ptex, int n);
>
> static inline uint64_t ppc_hash64_hpte0(PowerPCCPU *cpu,
> const ppc_hash_pte64_t *hptes, int i)
> diff --git a/target/ppc/mmu-misc.c b/target/ppc/mmu-misc.c
> new file mode 100644
> index 0000000000..8abda66547
> --- /dev/null
> +++ b/target/ppc/mmu-misc.c
> @@ -0,0 +1,86 @@
> +#include "qemu/osdep.h"
> +#include "cpu.h"
> +#include "mmu-hash64.h"
> +#include "fpu/softfloat-helpers.h"
> +#include "mmu-misc.h"
> +
> +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;
> +}
> +
> +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu,
> + bool (*cb)(void *, uint32_t, uint32_t),
> + void *opaque)
> +{
> + PPCHash64Options *opts = cpu->hash64_opts;
> + int i;
> + int n = 0;
> + bool ci_largepage = false;
> +
> + assert(opts);
> +
> + n = 0;
> + for (i = 0; i < ARRAY_SIZE(opts->sps); i++) {
> + PPCHash64SegmentPageSizes *sps = &opts->sps[i];
> + int j;
> + int m = 0;
> +
> + assert(n <= i);
> +
> + if (!sps->page_shift) {
> + break;
> + }
> +
> + for (j = 0; j < ARRAY_SIZE(sps->enc); j++) {
> + PPCHash64PageSize *ps = &sps->enc[j];
> +
> + assert(m <= j);
> + if (!ps->page_shift) {
> + break;
> + }
> +
> + if (cb(opaque, sps->page_shift, ps->page_shift)) {
> + if (ps->page_shift >= 16) {
> + ci_largepage = true;
> + }
> + sps->enc[m++] = *ps;
> + }
> + }
> +
> + /* Clear rest of the row */
> + for (j = m; j < ARRAY_SIZE(sps->enc); j++) {
> + memset(&sps->enc[j], 0, sizeof(sps->enc[j]));
> + }
> +
> + if (m) {
> + n++;
> + }
> + }
> +
> + /* Clear the rest of the table */
> + for (i = n; i < ARRAY_SIZE(opts->sps); i++) {
> + memset(&opts->sps[i], 0, sizeof(opts->sps[i]));
> + }
> +
> + if (!ci_largepage) {
> + opts->flags &= ~PPC_HASH64_CI_LARGEPAGE;
> + }
> +}
> +
> +void ppc_hash64_unmap_hptes(PowerPCCPU *cpu, const ppc_hash_pte64_t *hptes,
> + hwaddr ptex, int n)
> +{
> + if (cpu->vhyp) {
> + PPCVirtualHypervisorClass *vhc =
> + PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> + vhc->unmap_hptes(cpu->vhyp, hptes, ptex, n);
> + return;
> + }
> +
> + address_space_unmap(CPU(cpu)->as, (void *)hptes, n * HASH_PTE_SIZE_64,
> + false, n * HASH_PTE_SIZE_64);
> +}
> diff --git a/target/ppc/mmu-misc.h b/target/ppc/mmu-misc.h
> new file mode 100644
> index 0000000000..7be6bf7b44
> --- /dev/null
> +++ b/target/ppc/mmu-misc.h
> @@ -0,0 +1,22 @@
> +#ifndef MMU_MISC_H
> +#define MMU_MISC_H
> +#include "qemu/osdep.h"
> +#include "cpu.h"
> +
> +#ifndef CONFIG_USER_ONLY
> +
> +#ifdef TARGET_PPC64
> +
> +void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val);
> +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu,
> + bool (*cb)(void *, uint32_t, uint32_t),
> + void *opaque);
> +
> +#endif
> +
> +void ppc_hash64_unmap_hptes(PowerPCCPU *cpu, const ppc_hash_pte64_t *hptes,
> + hwaddr ptex, int n);
> +
> +#endif
> +
> +#endif
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature
- Re: [RFC PATCH v2 1/2] target/ppc: Moved functions out of mmu-hash64,
David Gibson <=