qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: "Nikunj A Dadhania" <nikunj@linux.vnet.ibm.com>,
	qemu-devel@nongnu.org, qemu-ppc@nongnu.org,
	"Paul Mackerras" <paulus@samba.org>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH] spapr: add "compat" machine option
Date: Mon, 30 Sep 2013 16:49:52 +0200	[thread overview]
Message-ID: <52498F90.6020309@suse.de> (raw)
In-Reply-To: <52497B00.6030706@ozlabs.ru>

On 09/30/2013 03:22 PM, Alexey Kardashevskiy wrote:
> On 30.09.2013 21:25, Alexander Graf wrote:
>> On 27.09.2013, at 10:06, Alexey Kardashevskiy wrote:
>>
>>> To be able to boot on newer hardware that the software support,
>>> PowerISA defines a logical PVR, one per every PowerISA specification
>>> version from 2.04.
>>>
>>> This adds the "compat" option which takes values 205 or 206 and forces
>>> QEMU to boot the guest with a logical PVR (CPU_POWERPC_LOGICAL_2_05 or
>>> CPU_POWERPC_LOGICAL_2_06).
>>>
>>> The guest reads the logical PVR value from "cpu-version" property of
>>> a CPU device node.
>>>
>>> Cc: Nikunj A Dadhania<nikunj@linux.vnet.ibm.com>
>>> Cc: Andreas Färber<afaerber@suse.de>
>>> Signed-off-by: Alexey Kardashevskiy<aik@ozlabs.ru>
>>> ---
>>> hw/ppc/spapr.c          | 40 ++++++++++++++++++++++++++++++++++++++++
>>> include/hw/ppc/spapr.h  |  2 ++
>>> target-ppc/cpu-models.h | 10 ++++++++++
>>> target-ppc/cpu.h        |  3 +++
>>> target-ppc/kvm.c        |  2 ++
>>> vl.c                    |  4 ++++
>>> 6 files changed, 61 insertions(+)
>>>
>>> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
>>> index a09a1d9..737452d 100644
>>> --- a/hw/ppc/spapr.c
>>> +++ b/hw/ppc/spapr.c
>>> @@ -33,6 +33,7 @@
>>> #include "sysemu/kvm.h"
>>> #include "kvm_ppc.h"
>>> #include "mmu-hash64.h"
>>> +#include "cpu-models.h"
>>>
>>> #include "hw/boards.h"
>>> #include "hw/ppc/ppc.h"
>>> @@ -196,6 +197,26 @@ static XICSState *xics_system_init(int nr_servers, int nr_irqs)
>>>      return icp;
>>> }
>>>
>>> +static void spapr_compat_mode_init(sPAPREnvironment *spapr)
>>> +{
>>> +    QemuOpts *machine_opts = qemu_get_machine_opts();
>>> +    uint64_t compat = qemu_opt_get_number(machine_opts, "compat", 0);
>>> +
>>> +    switch (compat) {
>>> +    case 0:
>>> +        break;
>>> +    case 205:
>>> +        spapr->arch_compat = CPU_POWERPC_LOGICAL_2_05;
>>> +        break;
>>> +    case 206:
>>> +        spapr->arch_compat = CPU_POWERPC_LOGICAL_2_06;
>> Does it make sense to declare compat mode a number or would a string
>> be easier for users? I can imagine that "-machine compat=power6" is
>> easier to understand for a user than "-machine compat=205".
> I just follow the PowerISA spec. It does not say anywhere (at least I do
> not see it) that 2.05==power6. 2.05 was released when power6 was
> released and power6 supports 2.05 but these are not synonims. And
> "compat=power6" would not set "cpu-version" to any of power6 PVRs, it
> still will be a logical PVR. It confuses me too to tell qemu "205"
> instead of "power6" but it is the spec to blame :)

So what is "2_06 plus" then? :)

To me it really sounds like a 1:1 mapping to cores rather than specs - 
the ISA defines a lot more capabilities than a single core necessarily 
supports, especially with the inclusion of booke into the generic ppc spec.

>
>
>
>>> +        break;
>>> +    default:
>>> +        perror("Unsupported mode, only are 205, 206 supported\n");
>>> +        break;
>>> +    }
>>> +}
>>> +
>>> static int spapr_fixup_cpu_dt(void *fdt, sPAPREnvironment *spapr)
>>> {
>>>      int ret = 0, offset;
>>> @@ -206,6 +227,7 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPREnvironment *spapr)
>>>
>>>      CPU_FOREACH(cpu) {
>>>          DeviceClass *dc = DEVICE_GET_CLASS(cpu);
>>> +        CPUPPCState *env =&(POWERPC_CPU(cpu)->env);
>>>          uint32_t associativity[] = {cpu_to_be32(0x5),
>>>                                      cpu_to_be32(0x0),
>>>                                      cpu_to_be32(0x0),
>>> @@ -238,6 +260,14 @@ static int spapr_fixup_cpu_dt(void *fdt, sPAPREnvironment *spapr)
>>>          if (ret<  0) {
>>>              return ret;
>>>          }
>>> +
>>> +        if (env->arch_compat) {
>>> +            ret = fdt_setprop(fdt, offset, "cpu-version",
>>> +&env->arch_compat, sizeof(env->arch_compat));
>>> +            if (ret<  0) {
>>> +                return ret;
>>> +            }
>>> +        }
>>>      }
>>>      return ret;
>>> }
>>> @@ -1145,6 +1175,8 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
>>>      spapr = g_malloc0(sizeof(*spapr));
>>>      QLIST_INIT(&spapr->phbs);
>>>
>>> +    spapr_compat_mode_init(spapr);
>>> +
>>>      cpu_ppc_hypercall = emulate_spapr_hypercall;
>>>
>>>      /* Allocate RMA if necessary */
>>> @@ -1226,6 +1258,14 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
>>>
>>>          xics_cpu_setup(spapr->icp, cpu);
>>>
>>> +        /*
>>> +         * If compat mode is set in the command line, pass it to CPU so KVM
>>> +         * will be able to set it in the host kernel.
>>> +         */
>>> +        if (spapr->arch_compat) {
>>> +            env->arch_compat = spapr->arch_compat;
>> You should set the compat mode in KVM here, rather than doing it in
> the put_registers call which gets invoked on every register sync. Or can
> the guest change the mode?
>
>
> I will change it here in the next patch (which requires kernel changes
> which are not there yet). The guest cannot change it directly but it can
> indirectly via "client-architecture-support".

They probably want a generic callback then. What happens on reset?

>
>
>> Also, we need to handle failure. If the kernel can not set the CPU
>> to
> 2.05 mode for example (IIRC POWER8 doesn't allow you to) we should bail
> out here.
>
> Yep, I'll add this easy check :)
>
>> And then there's the TCG question. We either have to disable CPU
> features similar to how we handle it in KVM (by setting and honoring the
> respective bits in PCR) or we need to bail out too and declare compat
> mode unsupported for TCG.
>
> At the moment we want to run old distro on new CPUs. This patch would
> make more sense with the "ibm,client-architecture-support" and "power8
> registers migration" patches which I did not post yet.
>
> Disabling "unsupported" bits in TCG would be really nice indeed and we
> should eventually do this but 1) it will not really hurt the guest if we
> did not disable some feature (really old guest will not use it and
> that's it)  2) once created, PowerPCCPUState (or whatever the exact name
> is, I am writing this mail on windows machine :) ) is not very flexible
> to reconfigure...

Can't you just set the bits in PCR and add an XXX comment indicating 
that we're currently not honoring them? Then fron the machine code point 
of view, everything is implemented.

>
>
>> And then there's the fact that the kernel interface isn't upstream in a way that
> ? unfinished sentence? What is missing in the kernel right now?

Eh. I think I wanted to say that this depends on in-kernel patches that 
are not upstream yet :).

>
>
>>> +        }
>>> +
>>>          qemu_register_reset(spapr_cpu_reset, cpu);
>>>      }
>>>
>>> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
>>> index ca175b0..201c578 100644
>>> --- a/include/hw/ppc/spapr.h
>>> +++ b/include/hw/ppc/spapr.h
>>> @@ -34,6 +34,8 @@ typedef struct sPAPREnvironment {
>>>      uint32_t epow_irq;
>>>      Notifier epow_notifier;
>>>
>>> +    uint32_t arch_compat;        /* Compatible PVR from the command line */
>>> +
>>>      /* Migration state */
>>>      int htab_save_index;
>>>      bool htab_first_pass;
>>> diff --git a/target-ppc/cpu-models.h b/target-ppc/cpu-models.h
>>> index 49ba4a4..d7c033c 100644
>>> --- a/target-ppc/cpu-models.h
>>> +++ b/target-ppc/cpu-models.h
>>> @@ -583,6 +583,16 @@ enum {
>>>      CPU_POWERPC_RS64II             = 0x00340000,
>>>      CPU_POWERPC_RS64III            = 0x00360000,
>>>      CPU_POWERPC_RS64IV             = 0x00370000,
>>> +
>>> +    /* Logical CPUs */
>>> +    CPU_POWERPC_LOGICAL_MASK       = 0xFFFFFFFF,
>>> +    CPU_POWERPC_LOGICAL_2_04       = 0x0F000001,
>>> +    CPU_POWERPC_LOGICAL_2_05       = 0x0F000002,
>>> +    CPU_POWERPC_LOGICAL_2_06       = 0x0F000003,
>>> +    CPU_POWERPC_LOGICAL_2_06_PLUS  = 0x0F100003,
>>> +    CPU_POWERPC_LOGICAL_2_07       = 0x0F000004,
>>> +    CPU_POWERPC_LOGICAL_2_08       = 0x0F000005,
>> These don't really belong here.
>
> Sorry, I do not understand. These are PVRs which are used in
> "cpu-version" DT property. They are logical PVRs but still PVRs - i.e.
> the guest has PVR masks for them too.

But they are specific to PAPR, not PowerPC in general, no? And you would 
never find one in the PVR register of a guest.

>
>
>>> +
>>> #endif /* defined(TARGET_PPC64) */
>>>      /* Original POWER */
>>>      /* XXX: should be POWER (RIOS), RSC3308, RSC4608,
>>> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
>>> index 422a6bb..fc837c1 100644
>>> --- a/target-ppc/cpu.h
>>> +++ b/target-ppc/cpu.h
>>> @@ -999,6 +999,9 @@ struct CPUPPCState {
>>>      /* Device control registers */
>>>      ppc_dcr_t *dcr_env;
>>>
>>> +    /* Architecture compatibility mode */
>>> +    uint32_t arch_compat;
>
>> Do we really need to carry this in the vcpu struct? Or can we just
>> fire-and-forget about it? If we want to preserve anything, it should
>> be the PCR register.
> This is the current PVR value aka "cpu-version" property. It may change
> during reboots as every reboot does the "client-architecture-support"
> call so the logical PVR can change.

Ok, so again: What happens on reset / reboot? Do we want to preserve the 
compatibility setting or does that get reset as well?


Alex

  reply	other threads:[~2013-09-30 14:50 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-27  8:06 [Qemu-devel] [PATCH] spapr: add "compat" machine option Alexey Kardashevskiy
2013-09-30 11:25 ` Alexander Graf
2013-09-30 11:52   ` Paolo Bonzini
2013-09-30 12:57     ` Alexey Kardashevskiy
2013-11-05  9:06       ` Paolo Bonzini
2013-11-05  9:16         ` Alexander Graf
2013-11-05  9:52           ` Paolo Bonzini
2013-11-05 10:27             ` Alexander Graf
2013-11-05 10:33               ` Paolo Bonzini
2013-11-05 10:45             ` Alexey Kardashevskiy
2013-11-05 10:46               ` Paolo Bonzini
2013-11-05 13:53             ` Andreas Färber
2013-11-06 11:36               ` Igor Mammedov
2013-11-07  9:11               ` Alexey Kardashevskiy
2013-11-07 13:36                 ` Igor Mammedov
2013-11-08  8:22                   ` Alexey Kardashevskiy
2013-11-08 13:20                     ` Andreas Färber
2013-11-08 14:57                       ` Alexey Kardashevskiy
2013-11-08 15:07                         ` Andreas Färber
2013-11-07 14:01                 ` Andreas Färber
2013-11-08  8:22                   ` [Qemu-devel] [PATCH v2 0/2] " Alexey Kardashevskiy
2013-11-08  8:22                     ` [Qemu-devel] [PATCH v2 1/2] cpu: add suboptions support Alexey Kardashevskiy
2013-11-08  8:22                     ` [Qemu-devel] [PATCH v2 2/2] target-ppc: add "compat" CPU option Alexey Kardashevskiy
2013-11-08 13:24                     ` [Qemu-devel] [PATCH v2 0/2] spapr: add "compat" machine option Andreas Färber
2013-11-06  3:27         ` [Qemu-devel] [PATCH] " Paul Mackerras
2013-09-30 13:22   ` Alexey Kardashevskiy
2013-09-30 14:49     ` Alexander Graf [this message]
2013-11-05  2:19       ` Alexey Kardashevskiy
2013-11-05  9:23         ` Alexander Graf
2013-11-06  5:48   ` Paul Mackerras
2013-11-06 12:07     ` Alexander Graf

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=52498F90.6020309@suse.de \
    --to=agraf@suse.de \
    --cc=afaerber@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=nikunj@linux.vnet.ibm.com \
    --cc=paulus@samba.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).