From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Gavin Shan <gshan@redhat.com>, qemu-devel@nongnu.org
Cc: "Daniel Henrique Barboza" <danielhb413@gmail.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Cédric Le Goater" <clg@kaod.org>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Eduardo Habkost" <eduardo@habkost.net>,
qemu-ppc@nongnu.org, "Peter Maydell" <peter.maydell@linaro.org>
Subject: Re: [PATCH] hw/core: Handle cpu_model_from_type() returning NULL value
Date: Thu, 11 Jan 2024 09:21:06 +0100 [thread overview]
Message-ID: <4f73c8d8-ea98-47b0-9296-bd9ccb76908d@linaro.org> (raw)
In-Reply-To: <cdfc3049-8b9b-4a24-9e0e-8db396acc6c1@redhat.com>
Hi Gavin,
On 11/1/24 08:30, Gavin Shan wrote:
> Hi Phil,
>
> On 1/11/24 16:47, Philippe Mathieu-Daudé wrote:
>> Per cpu_model_from_type() docstring (added in commit 445946f4dd):
>>
>> * Returns: CPU model name or NULL if the CPU class doesn't exist
>>
>> We must check the return value in order to avoid surprises, i.e.:
>>
>> $ qemu-system-arm -machine virt -cpu cortex-a9
>> qemu-system-arm: Invalid CPU model: cortex-a9
>> The valid models are: cortex-a7, cortex-a15, (null), (null),
>> (null), (null), (null), (null), (null), (null), (null), (null),
>> (null), max
>>
>> Add assertions when the call can not fail (because the CPU type
>> must be registered).
>>
>> Fixes: 5422d2a8fa ("machine: Print CPU model name instead of CPU type")
>> Reported-by: Peter Maydell <peter.maydell@linaro.org>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>> cpu-target.c | 1 +
>> hw/core/machine.c | 5 +++++
>> target/ppc/cpu_init.c | 1 +
>> 3 files changed, 7 insertions(+)
>>
>> diff --git a/cpu-target.c b/cpu-target.c
>> index 5eecd7ea2d..b0f6deb13b 100644
>> --- a/cpu-target.c
>> +++ b/cpu-target.c
>> @@ -291,6 +291,7 @@ static void cpu_list_entry(gpointer data, gpointer
>> user_data)
>> const char *typename = object_class_get_name(OBJECT_CLASS(data));
>> g_autofree char *model = cpu_model_from_type(typename);
>> + assert(model);
>> if (cc->deprecation_note) {
>> qemu_printf(" %s (deprecated)\n", model);
>> } else {
>> diff --git a/hw/core/machine.c b/hw/core/machine.c
>> index fc239101f9..730ec10328 100644
>> --- a/hw/core/machine.c
>> +++ b/hw/core/machine.c
>> @@ -1422,16 +1422,21 @@ static bool is_cpu_type_supported(const
>> MachineState *machine, Error **errp)
>> /* The user specified CPU type isn't valid */
>> if (!mc->valid_cpu_types[i]) {
>> g_autofree char *requested =
>> cpu_model_from_type(machine->cpu_type);
>> + assert(requested);
>> error_setg(errp, "Invalid CPU model: %s", requested);
>> if (!mc->valid_cpu_types[1]) {
>> g_autofree char *model = cpu_model_from_type(
>>
>> mc->valid_cpu_types[0]);
>> + assert(model);
>> error_append_hint(errp, "The only valid type is:
>> %s\n", model);
>> } else {
>> error_append_hint(errp, "The valid models are: ");
>> for (i = 0; mc->valid_cpu_types[i]; i++) {
>> g_autofree char *model = cpu_model_from_type(
>>
>> mc->valid_cpu_types[i]);
>> + if (!model) {
>> + continue;
>> + }
>
> Shall we assert(model) for this case, to be consistent with other cases? :)
No, this is the "(null)" cases displayed in the example.
IOW, mc->valid_cpu_types[] contains a CPU type which isn't registered,
so we just skip it.
>
>> error_append_hint(errp, "%s%s",
>> model,
>> mc->valid_cpu_types[i + 1] ?
>> ", " : "");
>
> Otherwise, the separator here need to be adjusted because it's uncertain
> that
> mc->valid_cpu_types[i+1] ... mc->valid_cpu_types[END] are valid.
Here we know mc->valid_cpu_types[i] is *not* NULL, but
mc->valid_cpu_types[i + 1] might be (signaling the end
of the array).
This seems correct to me, but I might be missing something.
>
>> diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
>> index 344196a8ce..58f0c1e30e 100644
>> --- a/target/ppc/cpu_init.c
>> +++ b/target/ppc/cpu_init.c
>> @@ -7037,6 +7037,7 @@ static void ppc_cpu_list_entry(gpointer data,
>> gpointer user_data)
>> }
>> name = cpu_model_from_type(typename);
>> + assert(name);
>> qemu_printf("PowerPC %-16s PVR %08x\n", name, pcc->pvr);
>> for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
>> PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
>
> Thanks,
> Gavin
>
next prev parent reply other threads:[~2024-01-11 8:21 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-11 6:47 [PATCH] hw/core: Handle cpu_model_from_type() returning NULL value Philippe Mathieu-Daudé
2024-01-11 6:49 ` Philippe Mathieu-Daudé
2024-01-11 7:30 ` Gavin Shan
2024-01-11 8:21 ` Philippe Mathieu-Daudé [this message]
2024-01-12 2:07 ` Gavin Shan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4f73c8d8-ea98-47b0-9296-bd9ccb76908d@linaro.org \
--to=philmd@linaro.org \
--cc=clg@kaod.org \
--cc=danielhb413@gmail.com \
--cc=eduardo@habkost.net \
--cc=gshan@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=npiggin@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=wangyanan55@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).