qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 5/7] cpu: Let architectures set CPU class name f


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH 5/7] cpu: Let architectures set CPU class name format
Date: Mon, 06 May 2019 13:42:04 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Eduardo Habkost <address@hidden> writes:

> Instead of requiring every architecture to implement a
> class_by_name function, let them set a format string at
> CPUClass::class_name_format.
>
> This will let us get rid of at least 16 class_by_name functions
> in the next commits.
>
> Signed-off-by: Eduardo Habkost <address@hidden>
> ---
>  include/qom/cpu.h | 12 ++++++++++++
>  qom/cpu.c         | 18 ++++++++++++++++--
>  2 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index fefd5c26b0..eda6a46b82 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -163,7 +163,19 @@ typedef struct CPUClass {
>      DeviceClass parent_class;
>      /*< public >*/
>  
> +    /* The following fields configure CPU model name -> QOM type 
> translation: */
> +
> +    /*
> +     * arch-specific CPU model -> QOM type translation function.
> +     * Optional if @class_name_format is set.
> +     */
>      ObjectClass *(*class_by_name)(const char *cpu_model);
> +    /*
> +     * Format string for g_strdup_printf(), used to generate the CPU
> +     * class name.

Please document acceptable conversion specifiers.

> +     */
> +    const char *class_name_format;
> +
>      void (*parse_features)(const char *typename, char *str, Error **errp);
>  
>      void (*reset)(CPUState *cpu);
> diff --git a/qom/cpu.c b/qom/cpu.c
> index b971a56242..1fa64941b6 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -286,9 +286,23 @@ static bool cpu_common_has_work(CPUState *cs)
>  CPUClass *cpu_class_by_name(const char *typename, const char *cpu_model)
>  {
>      CPUClass *cc = CPU_CLASS(object_class_by_name(typename));
> +    ObjectClass *oc;
> +    char *class_name;
>  
> -    assert(cpu_model && cc->class_by_name);
> -    return CPU_CLASS(cc->class_by_name(cpu_model));
> +    assert(cpu_model);
> +    if (cc->class_by_name) {
> +        return CPU_CLASS(cc->class_by_name(cpu_model));
> +    }
> +
> +    assert(cc->class_name_format);
> +    class_name = g_strdup_printf(cc->class_name_format, cpu_model);

Defeats -Wformat.  Triggers -Wformat-nonliteral, which we don't use, I
presume.  Observation, not objection.

cc->class_name_format must contain exactly one conversion specifier,
which must take a char *.

> +    oc = object_class_by_name(class_name);
> +    g_free(class_name);
> +    if (!oc || !object_class_dynamic_cast(oc, typename) ||
> +        object_class_is_abstract(oc)) {
> +        return NULL;
> +    }
> +    return CPU_CLASS(oc);
>  }
>  
>  static void cpu_common_parse_features(const char *typename, char *features,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]