From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org, Laurent Vivier <laurent@vivier.eu>,
Marcel Apfelbaum <marcel@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 20/24] machine: drop MachineState::cpu_model
Date: Fri, 19 Jan 2018 11:14:39 +0100 [thread overview]
Message-ID: <20180119111439.0feb4f5a@redhat.com> (raw)
In-Reply-To: <20180118191809.GB5292@localhost.localdomain>
On Thu, 18 Jan 2018 17:18:09 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:
> On Thu, Jan 18, 2018 at 11:10:35AM +0100, Igor Mammedov wrote:
> > On Wed, 17 Jan 2018 23:48:46 -0200
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > > On Wed, Jan 17, 2018 at 04:43:32PM +0100, Igor Mammedov wrote:
> > > > The last user of it was machine type 'none', which used field
> > > > to create CPU id user requested it on CLI with -cpu option.
[...]
> It looks like default_cpu_type is being overloaded for two
> different roles: 1) specifying the default CPU type; 2) finding
> the arch-specific class to be used to parse -cpu.
>
> In the case of null-machine, these two roles conflict with each
> other. I believe we can find other solutions instead of this
> hack that involves lying on MachineClass::default_cpu_type (and
> then having to work around the lie on machine_none_init()).
>
> I see multiple options: adding a new MachineClass field for that
> (e.g. resolving_cpu_type, which defaults to default_cpu_type if
> NULL); moving the CPU parsing code to arch_init.c (so it could
> use CPU_RESOLVING_TYPE or something similar); adding a optional
> MachineClass::parse_cpu_model hook. We could even try to get rid
> of CPUClass::parse_features completely
Adding hooks just for the sake on null-machine seems to be overkill,
I'd go for arch_init.c but it won't work for linux-user, how about
exec.c as following:
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 93bd546..0185589 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -661,8 +661,7 @@ ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);
[...]
diff --git a/exec.c b/exec.c
index d28fc0c..4543f06 100644
--- a/exec.c
+++ b/exec.c
@@ -817,6 +817,29 @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp)
#endif
}
+const char *parse_cpu_model(const char *cpu_model)
+{
+ ObjectClass *oc;
+ CPUClass *cc;
+ gchar **model_pieces;
+ const char *cpu_type;
+
+ model_pieces = g_strsplit(cpu_model, ",", 2);
+
+ oc = cpu_class_by_name(CPU_RESOLVING_TYPE, model_pieces[0]);
+ if (oc == NULL) {
+ error_report("unable to find CPU model '%s'", model_pieces[0]);
+ g_strfreev(model_pieces);
+ exit(EXIT_FAILURE);
+ }
+
+ cpu_type = object_class_get_name(oc);
+ cc = CPU_CLASS(oc);
+ cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
+ g_strfreev(model_pieces);
+ return cpu_type;
+}
+
#if defined(CONFIG_USER_ONLY)
static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
{
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 864832d..cde4d3e 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -24,9 +24,9 @@ static void machine_none_init(MachineState *mch)
{
CPUState *cpu = NULL;
- /* Initialize CPU (if a model has been specified) */
- if (mch->cpu_model) {
- cpu = cpu_init(mch->cpu_model);
+ /* Initialize CPU (if user asked for it) */
+ if (mch->cpu_type) {
+ cpu = cpu_create(mch->cpu_type);
if (!cpu) {
error_report("Unable to initialize CPU");
exit(1);
diff --git a/linux-user/main.c b/linux-user/main.c
index a35477e..0afb3f4 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -4357,10 +4358,13 @@ int main(int argc, char **argv, char **envp)
cpu_model = "any";
#endif
}
+ cpu_type = parse_cpu_model(cpu_model);
+
tcg_exec_init(0);
/* NOTE: we need to init the CPU at this stage to get
qemu_host_page_size */
- cpu = cpu_init(cpu_model);
+
+ cpu = cpu_create(cpu_type);
env = cpu->env_ptr;
cpu_reset(cpu);
diff --git a/qom/cpu.c b/qom/cpu.c
index e42d9a7..aab8437 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -67,37 +67,6 @@ CPUState *cpu_create(const char *typename)
return cpu;
}
-const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model)
-{
[...]
-}
-
-CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
-{
[...]
-}
-
bool cpu_paging_enabled(const CPUState *cpu)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
diff --git a/vl.c b/vl.c
index 2586f25..178bca3 100644
--- a/vl.c
+++ b/vl.c
@@ -4609,17 +4609,13 @@ int main(int argc, char **argv, char **envp)
current_machine->maxram_size = maxram_size;
current_machine->ram_slots = ram_slots;
current_machine->boot_order = boot_order;
- current_machine->cpu_model = cpu_model;
parse_numa_opts(current_machine);
/* parse features once if machine provides default cpu_type */
- if (machine_class->default_cpu_type) {
- current_machine->cpu_type = machine_class->default_cpu_type;
- if (cpu_model) {
- current_machine->cpu_type =
- cpu_parse_cpu_model(machine_class->default_cpu_type, cpu_model);
- }
+ current_machine->cpu_type = machine_class->default_cpu_type;
+ if (cpu_model) {
+ current_machine->cpu_type = parse_cpu_model(cpu_model);
}
machine_run_board_init(current_machine);
next prev parent reply other threads:[~2018-01-19 10:14 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-17 15:43 [Qemu-devel] [PATCH 00/24] generalize parsing of cpu_model (part 4) Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 01/24] arm: cpu: add TARGET_DEFAULT_CPU_TYPE macro Igor Mammedov
2018-01-17 15:43 ` Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 02/24] alpha: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 03/24] cris: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 04/24] lm32: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 05/24] m68k: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 06/24] microblaze: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 07/24] mips: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 08/24] moxie: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 09/24] nios2: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 10/24] openrisc: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 11/24] ppc: " Igor Mammedov
2018-01-18 0:30 ` David Gibson
2018-01-17 15:43 ` [Qemu-devel] [PATCH 12/24] s390x: " Igor Mammedov
2018-01-17 16:04 ` [Qemu-devel] [qemu-s390x] " David Hildenbrand
2018-01-17 19:20 ` Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 13/24] sh4: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 14/24] sparc: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 15/24] tricore: " Igor Mammedov
2018-01-17 16:34 ` Bastian Koppelmann
2018-01-17 15:43 ` [Qemu-devel] [PATCH 16/24] unicore32: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 17/24] xtensa: cpu: rename XTENSA_DEFAULT_CPU_TYPE to TARGET_DEFAULT_CPU_TYPE Igor Mammedov
2018-01-17 17:35 ` Max Filippov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 18/24] hppa: cpu: add TARGET_DEFAULT_CPU_TYPE macro Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 19/24] tilegx: " Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 20/24] machine: drop MachineState::cpu_model Igor Mammedov
2018-01-18 1:48 ` Eduardo Habkost
2018-01-18 10:10 ` Igor Mammedov
2018-01-18 19:18 ` Eduardo Habkost
2018-01-19 10:14 ` Igor Mammedov [this message]
2018-01-19 13:14 ` Eduardo Habkost
2018-01-19 13:39 ` Igor Mammedov
2018-01-19 14:23 ` Eduardo Habkost
2018-01-17 15:43 ` [Qemu-devel] [PATCH 21/24] linux/bsd-user: drop cpu_init() and use cpu_create() instead Igor Mammedov
2018-01-17 15:43 ` [Qemu-arm] [PATCH 22/24] cpu: get rid of unused cpu_init() defines Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] " Igor Mammedov
2018-01-18 0:28 ` [Qemu-arm] " David Gibson
2018-01-18 0:28 ` [Qemu-devel] " David Gibson
2018-01-18 1:50 ` [Qemu-arm] " Eduardo Habkost
2018-01-18 1:50 ` [Qemu-devel] " Eduardo Habkost
2018-01-17 15:43 ` [Qemu-devel] [PATCH 23/24] nios2: 10m50_devboard: replace cpu_model with cpu_type Igor Mammedov
2018-01-17 15:43 ` [Qemu-devel] [PATCH 24/24] cpu: get rid of cpu_generic_init() Igor Mammedov
2018-01-17 16:12 ` [Qemu-devel] [PATCH 00/24] generalize parsing of cpu_model (part 4) Peter Maydell
2018-01-17 19:15 ` Igor Mammedov
2018-01-17 20:30 ` Peter Maydell
2018-01-18 10:43 ` Igor Mammedov
2018-01-18 10:50 ` Peter Maydell
2018-01-18 13:06 ` Igor Mammedov
2018-01-18 13:10 ` Peter Maydell
2018-01-18 13:34 ` Igor Mammedov
2018-01-18 13:36 ` Peter Maydell
2018-01-18 13:45 ` Igor Mammedov
2018-01-18 13:49 ` Peter Maydell
2018-01-18 14:02 ` Igor Mammedov
2018-01-18 15:31 ` Philippe Mathieu-Daudé
2018-01-18 15:41 ` Peter Maydell
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=20180119111439.0feb4f5a@redhat.com \
--to=imammedo@redhat.com \
--cc=ehabkost@redhat.com \
--cc=laurent@vivier.eu \
--cc=marcel@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@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.