All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: nikunj@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com,
	thuth@redhat.com, lvivier@redhat.com, qemu-ppc@nongnu.org,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC 07/17] ppc: Rewrite ppc_set_compat()
Date: Tue, 8 Nov 2016 14:49:30 +1100	[thread overview]
Message-ID: <20161108034930.GP28688@umbus.fritz.box> (raw)
In-Reply-To: <4149b9cb-9a41-ed27-3f08-503548485f90@ozlabs.ru>

[-- Attachment #1: Type: text/plain, Size: 8573 bytes --]

On Fri, Nov 04, 2016 at 01:57:45PM +1100, Alexey Kardashevskiy wrote:
> On 30/10/16 22:11, David Gibson wrote:
> > This rewrites the ppc_set_compat() function so that instead of open coding
> > the various compatibility modes, it reads the relevant data from a table.
> > This is a first step in consolidating the information on compatibility
> > modes scattered across the code into a single place.
> > 
> > It also makes one change to the logic.  The old code masked the bits to be
> > set in the PCR (Processor Compatibility Register) by which bits are valid
> > on the host CPU.  This made no sense, since it was done regardless of
> > whether our guest CPU was the same as the host CPU or not.  Futhermore,
> 
> s/Futhermore/Furthermore/
> 
> 
> > the actual PCR bits are only relevant for TCG[1] - KVM instead uses the
> > compatibility mode we tell it in kvmppc_set_compat().  When using TCG
> > host cpu information usually isn't even present.
> > 
> > While we're at it, we put the new implementation in a new file to make the
> > enormouse translate_init.c a little smaller.
> 
> s/enormouse/enormous/

Thanks, spelling corrections applied.

> 
> 
> > 
> > [1] Actually it doesn't even do anything in TCG, but it will if / when we
> >     get to implementing compatibility mode logic at that level.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> 
> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> 
> > ---
> >  target-ppc/Makefile.objs    |  1 +
> >  target-ppc/compat.c         | 91 +++++++++++++++++++++++++++++++++++++++++++++
> >  target-ppc/cpu.h            |  6 ++-
> >  target-ppc/translate_init.c | 41 --------------------
> >  4 files changed, 97 insertions(+), 42 deletions(-)
> >  create mode 100644 target-ppc/compat.c
> > 
> > diff --git a/target-ppc/Makefile.objs b/target-ppc/Makefile.objs
> > index e667e69..feb5c30 100644
> > --- a/target-ppc/Makefile.objs
> > +++ b/target-ppc/Makefile.objs
> > @@ -15,3 +15,4 @@ obj-y += misc_helper.o
> >  obj-y += mem_helper.o
> >  obj-$(CONFIG_USER_ONLY) += user_only_helper.o
> >  obj-y += gdbstub.o
> > +obj-$(TARGET_PPC64) += compat.o
> > diff --git a/target-ppc/compat.c b/target-ppc/compat.c
> > new file mode 100644
> > index 0000000..f3fd9c6
> > --- /dev/null
> > +++ b/target-ppc/compat.c
> > @@ -0,0 +1,91 @@
> > +/*
> > + *  PowerPC CPU initialization for qemu.
> > + *
> > + *  Copyright 2016, David Gibson, Red Hat Inc. <dgibson@redhat.com>
> > + *
> > + * This library is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU Lesser General Public
> > + * License as published by the Free Software Foundation; either
> > + * version 2 of the License, or (at your option) any later version.
> > + *
> > + * This library is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > + * Lesser General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU Lesser General Public
> > + * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#include "qemu/osdep.h"
> > +#include "sysemu/kvm.h"
> > +#include "kvm_ppc.h"
> > +#include "sysemu/cpus.h"
> > +#include "qemu/error-report.h"
> > +#include "qapi/error.h"
> > +#include "cpu-models.h"
> > +
> > +typedef struct {
> > +    uint32_t pvr;
> > +    uint64_t pcr;
> > +} CompatInfo;
> > +
> > +static const CompatInfo compat_table[] = {
> > +    { /* POWER6, ISA2.05 */
> > +        .pvr = CPU_POWERPC_LOGICAL_2_05,
> > +        .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05
> > +               | PCR_TM_DIS | PCR_VSX_DIS,
> > +    },
> > +    { /* POWER7, ISA2.06 */
> > +        .pvr = CPU_POWERPC_LOGICAL_2_06,
> > +        .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> > +    },
> > +    {
> > +        .pvr = CPU_POWERPC_LOGICAL_2_06_PLUS,
> > +        .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> > +    },
> > +    { /* POWER8, ISA2.07 */
> > +        .pvr = CPU_POWERPC_LOGICAL_2_07,
> > +        .pcr = PCR_COMPAT_2_07,
> > +    },
> > +};
> > +
> > +static const CompatInfo *compat_by_pvr(uint32_t pvr)
> > +{
> > +    int i;
> > +
> > +    for (i = 0; i < ARRAY_SIZE(compat_table); i++) {
> > +        if (compat_table[i].pvr == pvr) {
> > +            return &compat_table[i];
> > +        }
> > +    }
> > +    return NULL;
> > +}
> > +
> > +void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
> > +{
> > +    const CompatInfo *compat = compat_by_pvr(compat_pvr);
> > +    CPUPPCState *env = &cpu->env;
> > +    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
> > +    uint64_t pcr;
> > +
> > +    if (!compat_pvr) {
> > +        pcr = 0;
> > +    } else if (!compat) {
> > +        error_setg(errp, "Unknown compatibility PVR 0x%08"PRIx32, compat_pvr);
> > +        return;
> > +    } else {
> > +        pcr = compat->pcr;
> > +    }
> > +
> > +    cpu->compat_pvr = compat_pvr;
> > +    env->spr[SPR_PCR] = pcr & pcc->pcr_mask;
> > +
> > +    if (kvm_enabled()) {
> > +        int ret = kvmppc_set_compat(cpu, cpu->compat_pvr);
> > +        if (ret < 0) {
> > +            error_setg_errno(errp, -ret,
> > +                             "Unable to set CPU compatibility mode in KVM");
> > +        }
> > +    }
> > +}
> > diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> > index f7656cb..15d5e4b 100644
> > --- a/target-ppc/cpu.h
> > +++ b/target-ppc/cpu.h
> > @@ -1243,7 +1243,6 @@ void ppc_store_msr (CPUPPCState *env, target_ulong value);
> >  void ppc_cpu_list (FILE *f, fprintf_function cpu_fprintf);
> >  int ppc_get_compat_smt_threads(PowerPCCPU *cpu);
> >  #if defined(TARGET_PPC64)
> > -void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp);
> >  #endif
> >  
> >  /* Time-base and decrementer management */
> > @@ -1314,6 +1313,11 @@ static inline int cpu_mmu_index (CPUPPCState *env, bool ifetch)
> >      return ifetch ? env->immu_idx : env->dmmu_idx;
> >  }
> >  
> > +/* Compatibility modes */
> > +#if defined(TARGET_PPC64)
> > +void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp);
> > +#endif /* defined(TARGET_PPC64) */
> > +
> >  #include "exec/cpu-all.h"
> >  
> >  /*****************************************************************************/
> > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> > index c35065d..a70eafb 100644
> > --- a/target-ppc/translate_init.c
> > +++ b/target-ppc/translate_init.c
> > @@ -9972,47 +9972,6 @@ int ppc_get_compat_smt_threads(PowerPCCPU *cpu)
> >      return ret;
> >  }
> >  
> > -#ifdef TARGET_PPC64
> > -void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp)
> > -{
> > -    int ret = 0;
> > -    CPUPPCState *env = &cpu->env;
> > -    PowerPCCPUClass *host_pcc;
> > -
> > -    cpu->compat_pvr = compat_pvr;
> > -
> > -    switch (compat_pvr) {
> > -    case CPU_POWERPC_LOGICAL_2_05:
> > -        env->spr[SPR_PCR] = PCR_TM_DIS | PCR_VSX_DIS | PCR_COMPAT_2_07 |
> > -                            PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
> > -        break;
> > -    case CPU_POWERPC_LOGICAL_2_06:
> > -    case CPU_POWERPC_LOGICAL_2_06_PLUS:
> > -        env->spr[SPR_PCR] = PCR_TM_DIS | PCR_COMPAT_2_07 | PCR_COMPAT_2_06;
> > -        break;
> > -    case CPU_POWERPC_LOGICAL_2_07:
> > -        env->spr[SPR_PCR] = PCR_COMPAT_2_07;
> > -        break;
> > -    default:
> > -        env->spr[SPR_PCR] = 0;
> > -        break;
> > -    }
> > -
> > -    host_pcc = kvm_ppc_get_host_cpu_class();
> > -    if (host_pcc) {
> > -        env->spr[SPR_PCR] &= host_pcc->pcr_mask;
> > -    }
> > -
> > -    if (kvm_enabled()) {
> > -        ret = kvmppc_set_compat(cpu, cpu->compat_pvr);
> > -        if (ret < 0) {
> > -            error_setg_errno(errp, -ret,
> > -                             "Unable to set CPU compatibility mode in KVM");
> > -        }
> > -    }
> > -}
> > -#endif
> > -
> >  static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
> >  {
> >      ObjectClass *oc = (ObjectClass *)a;
> > 
> 
> 

-- 
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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

  reply	other threads:[~2016-11-08  5:35 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-30 11:11 [Qemu-devel] [RFC 00/17] Clean up compatibility mode handling David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 01/17] ppc: Remove some stub POWER6 models David Gibson
2016-10-31  7:38   ` Thomas Huth
2016-10-31  8:37     ` David Gibson
2016-11-08  3:40   ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 02/17] powernv: CPU compatibility modes don't make sense for powernv David Gibson
2016-10-31  7:46   ` Thomas Huth
2016-10-31  8:38     ` David Gibson
2016-10-31 10:35   ` Greg Kurz
2016-10-30 11:11 ` [Qemu-devel] [RFC 03/17] pseries: Always use core objects for CPU construction David Gibson
2016-11-03  8:11   ` Alexey Kardashevskiy
2016-11-04  9:51     ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2016-11-08  5:34       ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 04/17] pseries: Make cpu_update during CAS unconditional David Gibson
2016-11-03  8:24   ` Alexey Kardashevskiy
2016-11-04 10:45   ` Thomas Huth
2016-11-08  3:44     ` David Gibson
2016-10-30 11:11 ` [Qemu-devel] [RFC 05/17] ppc: Clean up and QOMify hypercall emulation David Gibson
2016-11-03  8:50   ` Alexey Kardashevskiy
2016-10-30 11:11 ` [Qemu-devel] [RFC 06/17] ppc: Rename cpu_version to compat_pvr David Gibson
2016-11-04  2:26   ` Alexey Kardashevskiy
2016-11-08  3:48     ` David Gibson
2016-11-04 10:51   ` Thomas Huth
2016-10-30 11:11 ` [Qemu-devel] [RFC 07/17] ppc: Rewrite ppc_set_compat() David Gibson
2016-11-04  2:57   ` Alexey Kardashevskiy
2016-11-08  3:49     ` David Gibson [this message]
2016-10-30 11:11 ` [Qemu-devel] [RFC 08/17] ppc: Rewrite ppc_get_compat_smt_threads() David Gibson
2016-11-04  3:37   ` Alexey Kardashevskiy
2016-11-08  5:13     ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 09/17] ppc: Validate compatibility modes when setting David Gibson
2016-10-31  5:55   ` Alexey Kardashevskiy
2016-10-31  8:39     ` David Gibson
2016-11-04  3:45       ` Alexey Kardashevskiy
2016-11-08  5:14         ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 10/17] pseries: Rewrite CAS PVR compatibility logic David Gibson
2016-10-31  5:00   ` Alexey Kardashevskiy
2016-10-31  5:44     ` David Gibson
2016-11-10 17:54   ` Michael Roth
2016-11-10 23:50     ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 11/17] ppc: Add ppc_set_compat_all() David Gibson
2016-11-04  4:01   ` Alexey Kardashevskiy
2016-11-08  5:18     ` David Gibson
2016-11-09  1:27       ` Alexey Kardashevskiy
2016-11-09  3:52         ` David Gibson
2016-11-09  5:18           ` Alexey Kardashevskiy
2016-11-10  3:13             ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 12/17] ppc: Migrate compatibility mode David Gibson
2016-11-04  5:58   ` Alexey Kardashevskiy
2016-11-08  5:19     ` David Gibson
2016-11-08  5:51       ` Alexey Kardashevskiy
2016-11-10  1:59         ` David Gibson
2016-11-10 23:55           ` Michael Roth
2016-11-14  1:15             ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 13/17] pseries: Move CPU compatibility property to machine David Gibson
2016-11-04  7:43   ` Alexey Kardashevskiy
2016-11-08  5:26     ` David Gibson
2016-11-08  5:56       ` Alexey Kardashevskiy
2016-11-09  4:41         ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 14/17] pseries: Reset CPU compatibility mode David Gibson
2016-11-04  7:50   ` Alexey Kardashevskiy
2016-10-30 11:12 ` [Qemu-devel] [RFC 15/17] ppc: Check that CPU model stays consistent across migration David Gibson
2016-11-04  7:54   ` Alexey Kardashevskiy
2016-11-08  5:29     ` David Gibson
2016-11-08  6:03       ` Alexey Kardashevskiy
2016-11-09  4:24         ` David Gibson
2016-11-09  6:06           ` Alexey Kardashevskiy
2016-11-09  6:40             ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 16/17] ppc: Remove counter-productive "sanity checks" in migration David Gibson
2016-11-04  5:52   ` Alexey Kardashevskiy
2016-11-08  5:31     ` David Gibson
2016-11-11 18:13       ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2016-11-14  2:34         ` Alexey Kardashevskiy
2016-11-14  6:08           ` David Gibson
2016-10-30 11:12 ` [Qemu-devel] [RFC 17/17] pseries: Default to POWER8 compatibility mode David Gibson
2016-10-30 11:58   ` David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161108034930.GP28688@umbus.fritz.box \
    --to=david@gibson.dropbear.id.au \
    --cc=aik@ozlabs.ru \
    --cc=lvivier@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.