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: Wed, 08 May 2019 07:52:45 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Markus Armbruster <address@hidden> writes:

> 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 *.

s/exactly one/at most one/

PATCH 7 defines formats without a conversion specifier.

>> +    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]