On 4/22/25 07:54, Philippe Mathieu-Daudé wrote:
index f52a4f2273b..8b40735ef98 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -1581,6 +1581,33 @@ static bool is_cpu_type_supported(const MachineState *machine, Error **errp) return false; } } + if (mc->get_valid_cpu_types) { + GSList *vct = mc->get_valid_cpu_types(machine); + bool valid = false; + unsigned count = 0; + GSList *l; + + for (l = vct; !valid && l != NULL; l = l->next) { + valid |= !!object_class_dynamic_cast(oc, l->data); + count++; + } + + if (!valid) { + g_autofree char *requested = cpu_model_from_type(machine->cpu_type); + vct = g_slist_reverse(vct); + error_setg(errp, "Invalid CPU model: %s", requested); + error_append_hint(errp, "The valid models are: "); + for (l = vct; l != NULL; l = l->next) { + g_autofree char *model = cpu_model_from_type(l->data); + error_append_hint(errp, "%s%s", model, --count ? ", " : ""); + } + error_append_hint(errp, "\n"); + } + g_slist_free_full(vct, g_free); + if (!valid) { + return false; + } + }
Why use GSList instead of GPtrArray? That would provide you the count without manually computing it, and it would avoid the need for any sort of reverse. I think it would also allow you to auto-free the set. r~