[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,