[Qemu-devel] [RFC v2 3/5] linux-user: prepare for switching to cpu_create() API

Igor Mammedov posted 5 patches 7 years, 9 months ago
There is a newer version of this series
[Qemu-devel] [RFC v2 3/5] linux-user: prepare for switching to cpu_create() API
Posted by Igor Mammedov 7 years, 9 months ago
temporarily add #ifdef CPU_RESOLVING_TYPE in linux-user/main.c
so that  each target could gradually switch to cpu_create() and
not converted yet could continue to use cpu_init().

Once all targets are converted
    temporary ifdefs and cpu_init() API
will be removed

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 linux-user/main.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/linux-user/main.c b/linux-user/main.c
index 450eb3c..d481e8c 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -44,6 +44,7 @@ static const char *argv0;
 static int gdbstub_port;
 static envlist_t *envlist;
 static const char *cpu_model;
+static const char *cpu_type;
 unsigned long mmap_min_addr;
 unsigned long guest_base;
 int have_guest_base;
@@ -3847,7 +3848,7 @@ void init_task_state(TaskState *ts)
 CPUArchState *cpu_copy(CPUArchState *env)
 {
     CPUState *cpu = ENV_GET_CPU(env);
-    CPUState *new_cpu = cpu_init(cpu_model);
+    CPUState *new_cpu = cpu_create(cpu_type);
     CPUArchState *new_env = new_cpu->env_ptr;
     CPUBreakpoint *bp;
     CPUWatchpoint *wp;
@@ -4362,7 +4363,17 @@ int main(int argc, char **argv, char **envp)
     tcg_exec_init(0);
     /* NOTE: we need to init the CPU at this stage to get
        qemu_host_page_size */
+
+#ifdef CPU_RESOLVING_TYPE
+    cpu_type = cpu_parse_cpu_model(CPU_RESOLVING_TYPE, cpu_model);
+    if (!cpu_type) {
+        exit(1);
+    }
+    cpu_create(cpu_type);
+#else
     cpu = cpu_init(cpu_model);
+    cpu_type = object_class_get_name(object_get_class(OBJECT(cpu)));
+#endif
     env = cpu->env_ptr;
     cpu_reset(cpu);
 
-- 
2.7.4


Re: [Qemu-devel] [Qemu-ppc] [RFC v2 3/5] linux-user: prepare for switching to cpu_create() API
Posted by Thomas Huth 7 years, 9 months ago
On 18.01.2018 18:34, Igor Mammedov wrote:
> temporarily add #ifdef CPU_RESOLVING_TYPE in linux-user/main.c
> so that  each target could gradually switch to cpu_create() and
> not converted yet could continue to use cpu_init().
> 
> Once all targets are converted
>     temporary ifdefs and cpu_init() API
> will be removed
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  linux-user/main.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 450eb3c..d481e8c 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -44,6 +44,7 @@ static const char *argv0;
>  static int gdbstub_port;
>  static envlist_t *envlist;
>  static const char *cpu_model;
> +static const char *cpu_type;
>  unsigned long mmap_min_addr;
>  unsigned long guest_base;
>  int have_guest_base;
> @@ -3847,7 +3848,7 @@ void init_task_state(TaskState *ts)
>  CPUArchState *cpu_copy(CPUArchState *env)
>  {
>      CPUState *cpu = ENV_GET_CPU(env);
> -    CPUState *new_cpu = cpu_init(cpu_model);
> +    CPUState *new_cpu = cpu_create(cpu_type);
>      CPUArchState *new_env = new_cpu->env_ptr;
>      CPUBreakpoint *bp;
>      CPUWatchpoint *wp;
> @@ -4362,7 +4363,17 @@ int main(int argc, char **argv, char **envp)
>      tcg_exec_init(0);
>      /* NOTE: we need to init the CPU at this stage to get
>         qemu_host_page_size */
> +
> +#ifdef CPU_RESOLVING_TYPE
> +    cpu_type = cpu_parse_cpu_model(CPU_RESOLVING_TYPE, cpu_model);
> +    if (!cpu_type) {
> +        exit(1);
> +    }

That if-statement looks like it should be an assert(cpu_type) instead?

> +    cpu_create(cpu_type);
> +#else
>      cpu = cpu_init(cpu_model);
> +    cpu_type = object_class_get_name(object_get_class(OBJECT(cpu)));
> +#endif
>      env = cpu->env_ptr;
>      cpu_reset(cpu);

 Thomas

Re: [Qemu-devel] [RFC v2 3/5] linux-user: prepare for switching to cpu_create() API
Posted by Eduardo Habkost 7 years, 9 months ago
On Thu, Jan 18, 2018 at 06:34:00PM +0100, Igor Mammedov wrote:
> temporarily add #ifdef CPU_RESOLVING_TYPE in linux-user/main.c
> so that  each target could gradually switch to cpu_create() and
> not converted yet could continue to use cpu_init().
> 
> Once all targets are converted
>     temporary ifdefs and cpu_init() API
> will be removed
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  linux-user/main.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 450eb3c..d481e8c 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -44,6 +44,7 @@ static const char *argv0;
>  static int gdbstub_port;
>  static envlist_t *envlist;
>  static const char *cpu_model;
> +static const char *cpu_type;
>  unsigned long mmap_min_addr;
>  unsigned long guest_base;
>  int have_guest_base;
> @@ -3847,7 +3848,7 @@ void init_task_state(TaskState *ts)
>  CPUArchState *cpu_copy(CPUArchState *env)
>  {
>      CPUState *cpu = ENV_GET_CPU(env);
> -    CPUState *new_cpu = cpu_init(cpu_model);
> +    CPUState *new_cpu = cpu_create(cpu_type);
>      CPUArchState *new_env = new_cpu->env_ptr;
>      CPUBreakpoint *bp;
>      CPUWatchpoint *wp;
> @@ -4362,7 +4363,17 @@ int main(int argc, char **argv, char **envp)
>      tcg_exec_init(0);
>      /* NOTE: we need to init the CPU at this stage to get
>         qemu_host_page_size */
> +
> +#ifdef CPU_RESOLVING_TYPE
> +    cpu_type = cpu_parse_cpu_model(CPU_RESOLVING_TYPE, cpu_model);
> +    if (!cpu_type) {
> +        exit(1);
> +    }
> +    cpu_create(cpu_type);
> +#else
>      cpu = cpu_init(cpu_model);
> +    cpu_type = object_class_get_name(object_get_class(OBJECT(cpu)));

Will the final version of this series require the temporary
#ifdefs?

I'd prefer to first apply patches adding the CPU_RESOLVING_TYPE
defines and then patches adding the code without any #ifdef at
all.

> +#endif
>      env = cpu->env_ptr;
>      cpu_reset(cpu);
>  
> -- 
> 2.7.4
> 

-- 
Eduardo

Re: [Qemu-devel] [RFC v2 3/5] linux-user: prepare for switching to cpu_create() API
Posted by Igor Mammedov 7 years, 9 months ago
On Thu, 18 Jan 2018 18:33:37 -0200
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Thu, Jan 18, 2018 at 06:34:00PM +0100, Igor Mammedov wrote:
> > temporarily add #ifdef CPU_RESOLVING_TYPE in linux-user/main.c
> > so that  each target could gradually switch to cpu_create() and
> > not converted yet could continue to use cpu_init().
> > 
> > Once all targets are converted
> >     temporary ifdefs and cpu_init() API
> > will be removed
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> >  linux-user/main.c | 13 ++++++++++++-
> >  1 file changed, 12 insertions(+), 1 deletion(-)
> > 
> > diff --git a/linux-user/main.c b/linux-user/main.c
> > index 450eb3c..d481e8c 100644
> > --- a/linux-user/main.c
> > +++ b/linux-user/main.c
> > @@ -44,6 +44,7 @@ static const char *argv0;
> >  static int gdbstub_port;
> >  static envlist_t *envlist;
> >  static const char *cpu_model;
> > +static const char *cpu_type;
> >  unsigned long mmap_min_addr;
> >  unsigned long guest_base;
> >  int have_guest_base;
> > @@ -3847,7 +3848,7 @@ void init_task_state(TaskState *ts)
> >  CPUArchState *cpu_copy(CPUArchState *env)
> >  {
> >      CPUState *cpu = ENV_GET_CPU(env);
> > -    CPUState *new_cpu = cpu_init(cpu_model);
> > +    CPUState *new_cpu = cpu_create(cpu_type);
> >      CPUArchState *new_env = new_cpu->env_ptr;
> >      CPUBreakpoint *bp;
> >      CPUWatchpoint *wp;
> > @@ -4362,7 +4363,17 @@ int main(int argc, char **argv, char **envp)
> >      tcg_exec_init(0);
> >      /* NOTE: we need to init the CPU at this stage to get
> >         qemu_host_page_size */
> > +
> > +#ifdef CPU_RESOLVING_TYPE
> > +    cpu_type = cpu_parse_cpu_model(CPU_RESOLVING_TYPE, cpu_model);
> > +    if (!cpu_type) {
> > +        exit(1);
> > +    }
> > +    cpu_create(cpu_type);
> > +#else
> >      cpu = cpu_init(cpu_model);
> > +    cpu_type = object_class_get_name(object_get_class(OBJECT(cpu)));  
> 
> Will the final version of this series require the temporary
> #ifdefs?
> 
> I'd prefer to first apply patches adding the CPU_RESOLVING_TYPE
> defines and then patches adding the code without any #ifdef at
> all.
sure, it's possible to do without temporary #ifdef

> > +#endif
> >      env = cpu->env_ptr;
> >      cpu_reset(cpu);
> >  
> > -- 
> > 2.7.4
> >   
>