All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Andreas Färber" <afaerber@suse.de>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Riku Voipio" <riku.voipio@iki.fi>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
	"Artyom Tarasenko" <atar4qemu@gmail.com>
Subject: [Qemu-devel] [PATCH 09/28] sparc: replace custom cpu feature parsing with cpu_legacy_parse_featurestr()
Date: Fri, 14 Jul 2017 15:52:00 +0200	[thread overview]
Message-ID: <1500040339-119465-10-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1500040339-119465-1-git-send-email-imammedo@redhat.com>

with features converted to properties we can reuse shared
with x86 cpu_legacy_parse_featurestr() for features parsing
and drop legacy parser that manipulated CPU directly.

With that in place and sparc_cpu_parse_features() providing
generic CPUClass::parse_features callback, the cpu_sparc_init()
will do the same job as cpu_generic_init() so replace content
of cpu_sparc_init() with it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: Riku Voipio <riku.voipio@iki.fi>
CC: Laurent Vivier <laurent@vivier.eu>
CC: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
CC: Artyom Tarasenko <atar4qemu@gmail.com>
---
 default-configs/sparc-bsd-user.mak         |   1 +
 default-configs/sparc-linux-user.mak       |   1 +
 default-configs/sparc-softmmu.mak          |   1 +
 default-configs/sparc32plus-linux-user.mak |   1 +
 default-configs/sparc64-bsd-user.mak       |   1 +
 default-configs/sparc64-linux-user.mak     |   1 +
 default-configs/sparc64-softmmu.mak        |   1 +
 target/sparc/cpu.c                         | 160 ++++-------------------------
 8 files changed, 27 insertions(+), 140 deletions(-)

diff --git a/default-configs/sparc-bsd-user.mak b/default-configs/sparc-bsd-user.mak
index 21e0950..caea9ea 100644
--- a/default-configs/sparc-bsd-user.mak
+++ b/default-configs/sparc-bsd-user.mak
@@ -1 +1,2 @@
 # Default configuration for sparc-bsd-user
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc-linux-user.mak b/default-configs/sparc-linux-user.mak
index 9c716d1..0f23504 100644
--- a/default-configs/sparc-linux-user.mak
+++ b/default-configs/sparc-linux-user.mak
@@ -1 +1,2 @@
 # Default configuration for sparc-linux-user
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc-softmmu.mak b/default-configs/sparc-softmmu.mak
index 004b0f4..d8fa9fd 100644
--- a/default-configs/sparc-softmmu.mak
+++ b/default-configs/sparc-softmmu.mak
@@ -18,3 +18,4 @@ CONFIG_GRLIB=y
 CONFIG_STP2000=y
 CONFIG_ECCMEMCTL=y
 CONFIG_SUN4M=y
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc32plus-linux-user.mak b/default-configs/sparc32plus-linux-user.mak
index 432e880..e3cc16b 100644
--- a/default-configs/sparc32plus-linux-user.mak
+++ b/default-configs/sparc32plus-linux-user.mak
@@ -1 +1,2 @@
 # Default configuration for sparc32plus-linux-user
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc64-bsd-user.mak b/default-configs/sparc64-bsd-user.mak
index b8b9eea..25bfa1f 100644
--- a/default-configs/sparc64-bsd-user.mak
+++ b/default-configs/sparc64-bsd-user.mak
@@ -1 +1,2 @@
 # Default configuration for sparc64-bsd-user
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc64-linux-user.mak b/default-configs/sparc64-linux-user.mak
index bf1bdd6..7c8a9f0 100644
--- a/default-configs/sparc64-linux-user.mak
+++ b/default-configs/sparc64-linux-user.mak
@@ -1 +1,2 @@
 # Default configuration for sparc64-linux-user
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/default-configs/sparc64-softmmu.mak b/default-configs/sparc64-softmmu.mak
index d07876a..658546a 100644
--- a/default-configs/sparc64-softmmu.mak
+++ b/default-configs/sparc64-softmmu.mak
@@ -16,3 +16,4 @@ CONFIG_MC146818RTC=y
 CONFIG_ISA_TESTDEV=y
 CONFIG_EMPTY_SLOT=y
 CONFIG_SUN4V_RTC=y
+CONFIG_LEGACY_CPU_FEATURES=y
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
index cb13540..1271b7f 100644
--- a/target/sparc/cpu.c
+++ b/target/sparc/cpu.c
@@ -104,51 +104,23 @@ static void cpu_sparc_disas_set_info(CPUState *cpu, disassemble_info *info)
 #endif
 }
 
-static void sparc_cpu_parse_features(CPUState *cs, char *features,
-                                     Error **errp);
+/* Compatibily hack to maintain legacy +-feat semantic,
+ * where +-feat overwrites any feature set by
+ * feat=on|feat even if the later is parsed after +-feat
+ * (i.e. "-float,float=on" will result in "float" disabled)
+ */
+static GList *plus_features, *minus_features;
 
-static int cpu_sparc_register(SPARCCPU *cpu, const char *cpu_model)
+static void sparc_cpu_parse_features(const char *typename, char *features,
+                                     Error **errp)
 {
-    char *s = g_strdup(cpu_model);
-    char *featurestr = strtok(s, ",");
-    Error *err = NULL;
-
-    featurestr = strtok(NULL, ",");
-    sparc_cpu_parse_features(CPU(cpu), featurestr, &err);
-    g_free(s);
-    if (err) {
-        error_report_err(err);
-        return -1;
-    }
-
-    return 0;
+    cpu_legacy_parse_featurestr(typename, features,
+        &plus_features, &minus_features, errp);
 }
 
 SPARCCPU *cpu_sparc_init(const char *cpu_model)
 {
-    SPARCCPU *cpu;
-    ObjectClass *oc;
-    char *str, *name;
-
-    str = g_strdup(cpu_model);
-    name = strtok(str, ",");
-    oc = cpu_class_by_name(TYPE_SPARC_CPU, name);
-    if (oc == NULL) {
-        g_free(str);
-        return NULL;
-    }
-    g_free(str);
-
-    cpu = SPARC_CPU(object_new(object_class_get_name(oc)));
-
-    if (cpu_sparc_register(cpu, cpu_model) < 0) {
-        object_unref(OBJECT(cpu));
-        return NULL;
-    }
-
-    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
-
-    return cpu;
+    return SPARC_CPU(cpu_generic_init(TYPE_SPARC_CPU, cpu_model));
 }
 
 void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
@@ -529,107 +501,6 @@ static void print_features(FILE *f, fprintf_function cpu_fprintf,
     }
 }
 
-static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features)
-{
-    unsigned int i;
-
-    for (i = 0; i < ARRAY_SIZE(feature_name); i++) {
-        if (feature_name[i] && !strcmp(flagname, feature_name[i])) {
-            *features |= 1 << i;
-            return;
-        }
-    }
-    error_report("CPU feature %s not found", flagname);
-}
-
-static void sparc_cpu_parse_features(CPUState *cs, char *features,
-                                     Error **errp)
-{
-    SPARCCPU *cpu = SPARC_CPU(cs);
-    sparc_def_t *cpu_def = &cpu->env.def;
-    char *featurestr;
-    uint32_t plus_features = 0;
-    uint32_t minus_features = 0;
-    uint64_t iu_version;
-    uint32_t fpu_version, mmu_version, nwindows;
-
-    featurestr = features ? strtok(features, ",") : NULL;
-    while (featurestr) {
-        char *val;
-
-        if (featurestr[0] == '+') {
-            add_flagname_to_bitmaps(featurestr + 1, &plus_features);
-        } else if (featurestr[0] == '-') {
-            add_flagname_to_bitmaps(featurestr + 1, &minus_features);
-        } else if ((val = strchr(featurestr, '='))) {
-            *val = 0; val++;
-            if (!strcmp(featurestr, "iu_version")) {
-                char *err;
-
-                iu_version = strtoll(val, &err, 0);
-                if (!*val || *err) {
-                    error_setg(errp, "bad numerical value %s", val);
-                    return;
-                }
-                cpu_def->iu_version = iu_version;
-#ifdef DEBUG_FEATURES
-                fprintf(stderr, "iu_version %" PRIx64 "\n", iu_version);
-#endif
-            } else if (!strcmp(featurestr, "fpu_version")) {
-                char *err;
-
-                fpu_version = strtol(val, &err, 0);
-                if (!*val || *err) {
-                    error_setg(errp, "bad numerical value %s", val);
-                    return;
-                }
-                cpu_def->fpu_version = fpu_version;
-#ifdef DEBUG_FEATURES
-                fprintf(stderr, "fpu_version %x\n", fpu_version);
-#endif
-            } else if (!strcmp(featurestr, "mmu_version")) {
-                char *err;
-
-                mmu_version = strtol(val, &err, 0);
-                if (!*val || *err) {
-                    error_setg(errp, "bad numerical value %s", val);
-                    return;
-                }
-                cpu_def->mmu_version = mmu_version;
-#ifdef DEBUG_FEATURES
-                fprintf(stderr, "mmu_version %x\n", mmu_version);
-#endif
-            } else if (!strcmp(featurestr, "nwindows")) {
-                char *err;
-
-                nwindows = strtol(val, &err, 0);
-                if (!*val || *err || nwindows > MAX_NWINDOWS ||
-                    nwindows < MIN_NWINDOWS) {
-                    error_setg(errp, "bad numerical value %s", val);
-                    return;
-                }
-                cpu_def->nwindows = nwindows;
-#ifdef DEBUG_FEATURES
-                fprintf(stderr, "nwindows %d\n", nwindows);
-#endif
-            } else {
-                error_setg(errp, "unrecognized feature %s", featurestr);
-                return;
-            }
-        } else {
-            error_setg(errp, "feature string `%s' not in format "
-                             "(+feature|-feature|feature=xyz)", featurestr);
-            return;
-        }
-        featurestr = strtok(NULL, ",");
-    }
-    cpu_def->features |= plus_features;
-    cpu_def->features &= ~minus_features;
-#ifdef DEBUG_FEATURES
-    print_features(stderr, fprintf, cpu_def->features, NULL);
-#endif
-}
-
 void sparc_cpu_list(FILE *f, fprintf_function cpu_fprintf)
 {
     unsigned int i;
@@ -806,6 +677,14 @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
     SPARCCPU *cpu = SPARC_CPU(dev);
     CPUSPARCState *env = &cpu->env;
 
+    if (cpu_legacy_apply_features(OBJECT(cpu), plus_features, true, errp)) {
+        return;
+    }
+
+    if (cpu_legacy_apply_features(OBJECT(cpu), minus_features, false, errp)) {
+        return;
+    }
+
 #if defined(CONFIG_USER_ONLY)
     if ((env->def.features & CPU_FEATURE_FLOAT)) {
         env->def.features |= CPU_FEATURE_FLOAT128;
@@ -932,6 +811,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, void *data)
     cc->reset = sparc_cpu_reset;
 
     cc->class_by_name = sparc_cpu_class_by_name;
+    cc->parse_features = sparc_cpu_parse_features;
     cc->has_work = sparc_cpu_has_work;
     cc->do_interrupt = sparc_cpu_do_interrupt;
     cc->cpu_exec_interrupt = sparc_cpu_exec_interrupt;
-- 
2.7.4

  parent reply	other threads:[~2017-07-14 13:53 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-14 13:51 [Qemu-devel] [PATCH 00/28] complete cpu QOMification and remove cpu_FOO_init() helpers Igor Mammedov
2017-07-14 13:51 ` [Qemu-devel] [PATCH 01/28] mips: cpu: move mmu/fpu/mvp_init to realize time Igor Mammedov
2017-07-15 21:48   ` Philippe Mathieu-Daudé
2017-07-14 13:51 ` [Qemu-devel] [PATCH 02/28] mips: MIPSCPU model subclasses Igor Mammedov
2017-07-15 21:48   ` Philippe Mathieu-Daudé
2017-08-17  3:38     ` Philippe Mathieu-Daudé
2017-08-17 10:53       ` Igor Mammedov
2017-08-17 11:15         ` Philippe Mathieu-Daudé
2017-07-14 13:51 ` [Qemu-devel] [PATCH 03/28] mips: replace cpu_mips_init() with cpu_generic_init() Igor Mammedov
2017-07-15  6:09   ` Hervé Poussineau
2017-07-15 21:48   ` Philippe Mathieu-Daudé
2017-07-14 13:51 ` [Qemu-devel] [PATCH 04/28] sparc: convert cpu models to SPARC cpu subclasses Igor Mammedov
2017-08-14  7:56   ` Igor Mammedov
2017-08-14 16:24     ` Artyom Tarasenko
2017-08-15  7:38       ` Igor Mammedov
2017-08-15 11:27     ` Mark Cave-Ayland
2017-08-17  3:50   ` Philippe Mathieu-Daudé
2017-08-17 14:11     ` Igor Mammedov
2017-07-14 13:51 ` [Qemu-devel] [PATCH 05/28] sparc: embed sparc_def_t into CPUSPARCState Igor Mammedov
2017-07-14 13:51 ` [Qemu-devel] [PATCH 06/28] sparc: convert cpu features to qdev properties Igor Mammedov
2017-07-14 13:51 ` [Qemu-devel] [PATCH 07/28] sparc: move adhoc CPUSPARCState initialization to realize time Igor Mammedov
2017-07-14 13:51 ` [Qemu-devel] [PATCH 08/28] x86: extract legacy cpu features format parser Igor Mammedov
2017-08-16 19:32   ` Eduardo Habkost
2017-08-17 14:07     ` [Qemu-devel] [PATCH 1/2] target-i386: cpu: convert plus/minus properties to global properties Igor Mammedov
2017-08-17 14:07       ` [Qemu-devel] [PATCH 2/2] x86: extract legacy cpu features format parser Igor Mammedov
2017-08-18 17:40       ` [Qemu-devel] [PATCH 1/2] target-i386: cpu: convert plus/minus properties to global properties Eduardo Habkost
2017-08-21  8:32         ` Igor Mammedov
2017-08-23 14:24           ` Eduardo Habkost
2017-08-23 15:54             ` Igor Mammedov
2017-08-23 16:52               ` Eduardo Habkost
2017-07-14 13:52 ` Igor Mammedov [this message]
2017-07-14 13:52 ` [Qemu-devel] [PATCH 10/28] sparc: replace cpu_sparc_init() with cpu_generic_init() Igor Mammedov
2017-07-14 13:52 ` [Qemu-devel] [PATCH 11/28] s390x: replace cpu_s390x_init() " Igor Mammedov
2017-07-18 12:30   ` Cornelia Huck
2017-07-18 13:17     ` Igor Mammedov
2017-08-14  8:03       ` Igor Mammedov
2017-08-14  8:53         ` Cornelia Huck
2017-08-14  9:24           ` Igor Mammedov
2017-08-14  9:27             ` Cornelia Huck
2017-07-14 13:52 ` [Qemu-devel] [PATCH 12/28] alpha: replace cpu_alpha_init() " Igor Mammedov
2017-07-15 18:05   ` Richard Henderson
2017-07-14 13:52 ` [Qemu-devel] [PATCH 13/28] hppa: replace cpu_hppa_init() " Igor Mammedov
2017-07-15 18:06   ` Richard Henderson
2017-07-14 13:52 ` [Qemu-devel] [PATCH 14/28] m68k: replace cpu_m68k_init() " Igor Mammedov
2017-07-15  8:05   ` Thomas Huth
2017-07-15 18:08   ` Richard Henderson
2017-07-15 20:57     ` Laurent Vivier
2017-07-17 10:41     ` Igor Mammedov
2017-07-17 15:05       ` Andreas Färber
2017-07-17 15:23         ` Igor Mammedov
2017-08-14  8:00           ` Igor Mammedov
2017-08-14 18:23             ` Laurent Vivier
2017-07-14 13:52 ` [Qemu-devel] [PATCH 15/28] microblaze: replace cpu_mb_init() " Igor Mammedov
2017-07-15 21:51   ` Philippe Mathieu-Daudé
2017-07-14 13:52 ` [Qemu-devel] [PATCH 16/28] nios2: replace cpu_nios2_init() " Igor Mammedov
2017-07-15 21:53   ` Philippe Mathieu-Daudé
2017-07-14 13:52 ` [Qemu-devel] [PATCH 17/28] tilegx: replace cpu_tilegx_init() " Igor Mammedov
2017-08-16 19:53   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 18/28] xtensa: replace cpu_xtensa_init() " Igor Mammedov
2017-08-16 19:56   ` Eduardo Habkost
2017-08-17 14:32     ` Igor Mammedov
2017-08-18 16:50       ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 19/28] tricore: replace cpu_tricore_init() " Igor Mammedov
2017-08-16 19:56   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 20/28] sh4: replace cpu_sh4_init() " Igor Mammedov
2017-08-16 19:57   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 21/28] arm: replace cpu_arm_init() " Igor Mammedov
2017-08-14  8:53   ` Andrew Jones
2017-07-14 13:52 ` [Qemu-devel] [PATCH 22/28] cris: replace cpu_cris_init() " Igor Mammedov
2017-08-16 19:57   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 23/28] x86: replace cpu_x86_init() " Igor Mammedov
2017-08-16 19:57   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 24/28] lm32: replace cpu_lm32_init() " Igor Mammedov
2017-07-14 15:51   ` Michael Walle
2017-08-16 19:58   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 25/28] moxie: replace cpu_moxie_init() " Igor Mammedov
2017-08-16 19:58   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 26/28] openrisc: replace cpu_openrisc_init() " Igor Mammedov
2017-08-16 19:58   ` Eduardo Habkost
2017-08-16 21:28   ` Stafford Horne
2017-07-14 13:52 ` [Qemu-devel] [PATCH 27/28] unicore32: replace uc32_cpu_init() " Igor Mammedov
2017-08-16 19:59   ` Eduardo Habkost
2017-07-14 13:52 ` [Qemu-devel] [PATCH 28/28] ppc: replace cpu_ppc_init() " Igor Mammedov
2017-07-15  2:36   ` David Gibson
2017-07-15  6:09   ` Hervé Poussineau
2017-08-16 19:59   ` Eduardo Habkost

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=1500040339-119465-10-git-send-email-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=afaerber@suse.de \
    --cc=atar4qemu@gmail.com \
    --cc=ehabkost@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=riku.voipio@iki.fi \
    /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.