From: David Gibson <david@gibson.dropbear.id.au>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org, "Alexander Graf" <agraf@suse.de>,
"Hervé Poussineau" <hpoussin@reactos.org>,
"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
"open list:ppce500" <qemu-ppc@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH 12/23] ppc: move '-cpu foo, compat=xxx' parsing into ppc_cpu_parse_featurestr()
Date: Fri, 6 Oct 2017 14:54:47 +1100 [thread overview]
Message-ID: <20171006035447.GP3260@umbus.fritz.box> (raw)
In-Reply-To: <1507220690-265042-13-git-send-email-imammedo@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 8140 bytes --]
On Thu, Oct 05, 2017 at 06:24:39PM +0200, Igor Mammedov wrote:
> there is a dedicated callback CPUClass::parse_features
> which purpose is to convert -cpu features into a set of
> global properties AND deal with compat/legacy features
> that couldn't be directly translated into CPU's properties.
>
> Create ppc variant of it (ppc_cpu_parse_featurestr) and
> move 'compat=val' handling from spapr_cpu_core.c into it.
> That removes a dependency of board/core code on cpu_model
> parsing and would let to reuse common -cpu parsing
> introduced by 6063d4c0
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Hrm. I'm a bit unsure about this. The fact that the board code is
involved in the parsing here is deliberate. Basically 'compat=' never
made sense as a cpu property, it always should have been a machine
property.
With this patch we'll still (correctly) fail on a non spapr machine at
the point where we do:
+ object_property_set_str(machine, v, "max-cpu-compat", &local_err);
Though probably with a rather cryptic error.
It still pollutes the cpu code with spapr's past mistake though. I'm
not sure if this is a good tradeoff.
> ---
> include/hw/ppc/spapr.h | 1 -
> target/ppc/cpu-qom.h | 1 +
> hw/ppc/spapr.c | 2 +-
> hw/ppc/spapr_cpu_core.c | 50 --------------------------------------
> target/ppc/translate_init.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 60 insertions(+), 52 deletions(-)
>
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index c1b365f..8ca4f94 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -659,7 +659,6 @@ void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type,
> uint32_t count, uint32_t index);
> void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type,
> uint32_t count, uint32_t index);
> -void spapr_cpu_parse_features(sPAPRMachineState *spapr);
> int spapr_hpt_shift_for_ramsize(uint64_t ramsize);
> void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
> Error **errp);
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index d0cf6ca..429b47f 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -181,6 +181,7 @@ typedef struct PowerPCCPUClass {
> DeviceRealize parent_realize;
> DeviceUnrealize parent_unrealize;
> void (*parent_reset)(CPUState *cpu);
> + void (*parent_parse_features)(const char *type, char *str, Error **errp);
>
> uint32_t pvr;
> bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr);
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index ff87f15..01b3012 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2366,7 +2366,7 @@ static void ppc_spapr_init(MachineState *machine)
> machine->cpu_model = kvm_enabled() ? "host" : smc->tcg_default_cpu;
> }
>
> - spapr_cpu_parse_features(spapr);
> + cpu_parse_cpu_model(TYPE_POWERPC_CPU, machine->cpu_model);
>
> spapr_set_vsmt_mode(spapr, &error_fatal);
>
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 3dea5ff..427d47f 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -21,56 +21,6 @@
> #include "sysemu/hw_accel.h"
> #include "qemu/error-report.h"
>
> -void spapr_cpu_parse_features(sPAPRMachineState *spapr)
> -{
> - /*
> - * Backwards compatibility hack:
> - *
> - * CPUs had a "compat=" property which didn't make sense for
> - * anything except pseries. It was replaced by "max-cpu-compat"
> - * machine option. This supports old command lines like
> - * -cpu POWER8,compat=power7
> - * By stripping the compat option and applying it to the machine
> - * before passing it on to the cpu level parser.
> - */
> - gchar **inpieces;
> - gchar *newprops;
> - int i, j;
> - gchar *compat_str = NULL;
> -
> - inpieces = g_strsplit(MACHINE(spapr)->cpu_model, ",", 0);
> -
> - /* inpieces[0] is the actual model string */
> - i = 1;
> - j = 1;
> - while (inpieces[i]) {
> - if (g_str_has_prefix(inpieces[i], "compat=")) {
> - /* in case of multiple compat= options */
> - g_free(compat_str);
> - compat_str = inpieces[i];
> - } else {
> - j++;
> - }
> -
> - i++;
> - /* Excise compat options from list */
> - inpieces[j] = inpieces[i];
> - }
> -
> - if (compat_str) {
> - char *val = compat_str + strlen("compat=");
> -
> - object_property_set_str(OBJECT(spapr), val, "max-cpu-compat",
> - &error_fatal);
> -
> - }
> -
> - newprops = g_strjoinv(",", inpieces);
> - cpu_parse_cpu_model(TYPE_POWERPC_CPU, newprops);
> - g_free(newprops);
> - g_strfreev(inpieces);
> -}
> -
> static void spapr_cpu_reset(void *opaque)
> {
> PowerPCCPU *cpu = opaque;
> diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c
> index c6399a3..5ee91e8 100644
> --- a/target/ppc/translate_init.c
> +++ b/target/ppc/translate_init.c
> @@ -10313,6 +10313,62 @@ static ObjectClass *ppc_cpu_class_by_name(const char *name)
>
> return NULL;
> }
> +static void ppc_cpu_parse_featurestr(const char *typename, char *features,
> + Error **errp)
> +{
> + const PowerPCCPUClass *pcc;
> + char *compat_str = NULL;
> + char *s = features;
> + char **inpieces;
> + Error *local_err = NULL;
> + int i;
> +
> + if (!features) {
> + return;
> + }
> +
> + /*
> + * Backwards compatibility hack:
> + *
> + * CPUs had a "compat=" property which didn't make sense for
> + * anything except pseries. It was replaced by "max-cpu-compat"
> + * machine option. This supports old command lines like
> + * -cpu POWER8,compat=power7
> + * By stripping the compat option and applying it to the machine
> + * before passing it on to the cpu level parser.
> + */
> + inpieces = g_strsplit(features, ",", 0);
> + *s = '\0';
> + for (i = 0; inpieces[i]; i++) {
> + if (g_str_has_prefix(inpieces[i], "compat=")) {
> + compat_str = inpieces[i];
> + continue;
> + }
> + if ((i != 0) && (s != features)) {
> + s = g_stpcpy(s, ",");
> + }
> + s = g_stpcpy(s, inpieces[i]);
> + }
> +
> + if (compat_str) {
> + Object *machine = qdev_get_machine();
> + if (machine) {
> + char *v = compat_str + strlen("compat=");
> + object_property_set_str(machine, v, "max-cpu-compat", &local_err);
> + } else {
> + error_setg(&local_err, "Not supported property: %s", compat_str);
> + }
> + }
> + g_strfreev(inpieces);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> + /* do property processing with generic handler */
> + pcc = POWERPC_CPU_CLASS(object_class_by_name(typename));
> + pcc->parent_parse_features(typename, features, errp);
> +}
>
> const char *ppc_cpu_lookup_alias(const char *alias)
> {
> @@ -10706,6 +10762,8 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data)
> cc->reset = ppc_cpu_reset;
>
> cc->class_by_name = ppc_cpu_class_by_name;
> + pcc->parent_parse_features = cc->parse_features;
> + cc->parse_features = ppc_cpu_parse_featurestr;
> cc->has_work = ppc_cpu_has_work;
> cc->do_interrupt = ppc_cpu_do_interrupt;
> cc->cpu_exec_interrupt = ppc_cpu_exec_interrupt;
--
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: 833 bytes --]
next prev parent reply other threads:[~2017-10-06 7:30 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-05 16:24 [Qemu-devel] [PATCH 00/23] generalize parsing of cpu_model (part 3/PPC) Igor Mammedov
2017-10-05 16:24 ` [Qemu-devel] [PATCH 01/23] qom: update doc comment for type_register[_static]() Igor Mammedov
2017-10-06 2:57 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 02/23] qom: introduce type_register_static_array() Igor Mammedov
2017-10-06 2:58 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 03/23] qom: add helper macro DEFINE_TYPES() Igor Mammedov
2017-10-06 3:06 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 04/23] ppc: mpc8544ds/e500plat: use generic cpu_model parsing Igor Mammedov
2017-10-06 3:02 ` David Gibson
2017-10-06 8:27 ` Igor Mammedov
2017-10-06 9:12 ` David Gibson
2017-10-06 9:37 ` Igor Mammedov
2017-10-05 16:24 ` [Qemu-devel] [PATCH 05/23] ppc: mac_newworld: " Igor Mammedov
2017-10-06 3:08 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 06/23] ppc: mac_oldworld: " Igor Mammedov
2017-10-06 3:09 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 07/23] ppc: bamboo: " Igor Mammedov
2017-10-06 3:11 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 08/23] ppc: replace cpu_model with cpu_type on ref405ep, taihu boards Igor Mammedov
2017-10-06 3:12 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 09/23] ppc: virtex-ml507: replace cpu_model with cpu_type Igor Mammedov
2017-10-06 3:13 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 10/23] ppc: 40p/prep: " Igor Mammedov
2017-10-06 3:14 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 11/23] ppc: spapr: replace ppc_cpu_parse_features() with cpu_parse_cpu_model() Igor Mammedov
2017-10-05 18:35 ` Greg Kurz
2017-10-06 3:16 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 12/23] ppc: move '-cpu foo, compat=xxx' parsing into ppc_cpu_parse_featurestr() Igor Mammedov
2017-10-05 19:05 ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2017-10-06 8:40 ` Igor Mammedov
2017-10-06 3:54 ` David Gibson [this message]
2017-10-06 9:03 ` [Qemu-devel] " Igor Mammedov
2017-10-06 9:17 ` David Gibson
2017-10-06 9:52 ` Igor Mammedov
2017-10-06 10:14 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 13/23] ppc: spapr: define core types statically Igor Mammedov
2017-10-05 20:31 ` Greg Kurz
2017-10-06 3:58 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 14/23] ppc: spapr: use cpu type name directly Igor Mammedov
2017-10-05 20:47 ` Greg Kurz
2017-10-06 4:01 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 15/23] ppc: spapr: register 'host' core type along with the rest of core types Igor Mammedov
2017-10-05 21:55 ` Greg Kurz
2017-10-06 4:41 ` David Gibson
2017-10-06 9:07 ` Igor Mammedov
2017-10-06 9:13 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 16/23] ppc: spapr: use cpu model names as tcg defaults instead of aliases Igor Mammedov
2017-10-06 4:43 ` David Gibson
2017-10-06 7:39 ` Greg Kurz
2017-10-06 9:27 ` Igor Mammedov
2017-10-06 10:12 ` Greg Kurz
2017-10-05 16:24 ` [Qemu-devel] [PATCH 17/23] ppc: spapr: use generic cpu_model parsing Igor Mammedov
2017-10-06 5:04 ` David Gibson
2017-10-06 9:20 ` Igor Mammedov
2017-10-06 9:35 ` David Gibson
2017-10-06 9:56 ` Igor Mammedov
2017-10-05 16:24 ` [Qemu-devel] [PATCH 18/23] ppc: pnv: " Igor Mammedov
2017-10-06 6:21 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:34 ` [Qemu-devel] " David Gibson
2017-10-06 9:30 ` Igor Mammedov
2017-10-06 11:25 ` David Gibson
2017-10-09 5:44 ` Igor Mammedov
2017-10-09 6:59 ` David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 19/23] ppc: pnv: normalize core/chip type names Igor Mammedov
2017-10-06 6:22 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:37 ` [Qemu-devel] " David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 20/23] ppc: pnv: drop PnvCoreClass::cpu_oc field Igor Mammedov
2017-10-06 6:27 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:41 ` [Qemu-devel] " David Gibson
2017-10-06 9:31 ` Igor Mammedov
2017-10-05 16:24 ` [Qemu-devel] [PATCH 21/23] ppc: pnv: define core types statically Igor Mammedov
2017-10-06 6:24 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:42 ` [Qemu-devel] " David Gibson
2017-10-05 16:24 ` [Qemu-devel] [PATCH 22/23] ppc: pnv: drop PnvChipClass::cpu_model field Igor Mammedov
2017-10-06 6:27 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:46 ` [Qemu-devel] " David Gibson
2017-10-06 9:32 ` Igor Mammedov
2017-10-05 16:24 ` [Qemu-devel] [PATCH 23/23] ppc: pnv: consolidate type definitions and batch register them Igor Mammedov
2017-10-06 6:27 ` [Qemu-devel] [Qemu-ppc] " Cédric Le Goater
2017-10-06 8:47 ` [Qemu-devel] " David Gibson
2017-10-05 17:31 ` [Qemu-devel] [PATCH 00/23] generalize parsing of cpu_model (part 3/PPC) no-reply
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=20171006035447.GP3260@umbus.fritz.box \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=edgar.iglesias@gmail.com \
--cc=hpoussin@reactos.org \
--cc=imammedo@redhat.com \
--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 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.