Patchwork [qom-cpu,for-1.5,3/4] target-i386: Emulate X86CPU subclasses for global properties

login
register
mail settings
Submitter Andreas Färber
Date May 1, 2013, 4:07 p.m.
Message ID <1367424440-16687-4-git-send-email-afaerber@suse.de>
Download mbox | patch
Permalink /patch/240784/
State New
Headers show

Comments

Andreas Färber - May 1, 2013, 4:07 p.m.
After initializing the object from its x86_def_t and before setting any
additional -cpu arguments, set any global properties for the designated
subclass <name>-{i386,x86_64}-cpu.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 target-i386/cpu.c | 9 +++++++++
 1 file changed, 9 insertions(+)
Eduardo Habkost - May 2, 2013, 3:03 p.m.
On Wed, May 01, 2013 at 06:07:19PM +0200, Andreas Färber wrote:
> After initializing the object from its x86_def_t and before setting any
> additional -cpu arguments, set any global properties for the designated
> subclass <name>-{i386,x86_64}-cpu.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
>  target-i386/cpu.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index bba41fe..8a9563b 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -1626,6 +1626,7 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
>      CPUX86State *env;
>      gchar **model_pieces;
>      char *name, *features;
> +    char *typename;
>      Error *error = NULL;
>  
>      model_pieces = g_strsplit(cpu_model, ",", 2);
> @@ -1653,6 +1654,14 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
>          goto out;
>      }
>  
> +    /* Emulate per-model subclasses for global properties */
> +    typename = g_strdup_printf("%s-" TYPE_X86_CPU, name);
> +    qdev_prop_set_custom_globals(DEVICE(cpu), typename, &error);
> +    g_free(typename);
> +    if (error) {
> +        goto out;
> +    }

I really like this solution.

I find it ironic that we spent 2 or 3 releases struggling with the
imposed restriction that global-properties can't be used to set dynamic
QOM properties (only static properties), and now we are introducing a
mechanism to do exactly that.  :-)

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>


> +
>      cpu_x86_parse_featurestr(cpu, features, &error);
>      if (error) {
>          goto out;
> -- 
> 1.8.1.4
>

Patch

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index bba41fe..8a9563b 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1626,6 +1626,7 @@  X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
     CPUX86State *env;
     gchar **model_pieces;
     char *name, *features;
+    char *typename;
     Error *error = NULL;
 
     model_pieces = g_strsplit(cpu_model, ",", 2);
@@ -1653,6 +1654,14 @@  X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
         goto out;
     }
 
+    /* Emulate per-model subclasses for global properties */
+    typename = g_strdup_printf("%s-" TYPE_X86_CPU, name);
+    qdev_prop_set_custom_globals(DEVICE(cpu), typename, &error);
+    g_free(typename);
+    if (error) {
+        goto out;
+    }
+
     cpu_x86_parse_featurestr(cpu, features, &error);
     if (error) {
         goto out;