在 2026/1/19 下午6:07, Bibo Mao 写道:
On LoongArch with QMP command query-cpu-model-expansion, property setting is not supported witch command such as: query-cpu-model-expansion type=static model={"name":"max","props":{"lasx":false}}Here add property setting support with QMP command. Signed-off-by: Bibo Mao <[email protected]> --- target/loongarch/loongarch-qmp-cmds.c | 40 +++++++++++++++++++-------- 1 file changed, 28 insertions(+), 12 deletions(-)
Reviewed-by: Song Gao <[email protected]> Thanks. Song Gao
diff --git a/target/loongarch/loongarch-qmp-cmds.c b/target/loongarch/loongarch-qmp-cmds.c index 6a95080fe4..f053f22bb8 100644 --- a/target/loongarch/loongarch-qmp-cmds.c +++ b/target/loongarch/loongarch-qmp-cmds.c @@ -50,7 +50,6 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, Error **errp) { Visitor *visitor; - bool ok; CpuModelExpansionInfo *expansion_info; QDict *qdict_out; ObjectClass *oc; @@ -64,30 +63,47 @@ CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type, return NULL; }+ oc = cpu_class_by_name(TYPE_LOONGARCH_CPU, model->name);+ if (!oc) { + error_setg(errp, "The CPU type '%s' is not a recognized LoongArch " + "CPU type", model->name); + return NULL; + } + + obj = object_new(object_class_get_name(oc)); if (model->props) { + Error *err = NULL; + const QDict *qdict_in; + visitor = qobject_input_visitor_new(model->props); if (!visit_start_struct(visitor, "model.props", NULL, 0, errp)) { visit_free(visitor); + object_unref(obj); return NULL; }- ok = visit_check_struct(visitor, errp);+ qdict_in = qobject_to(QDict, model->props); + i = 0; + while ((name = cpu_model_advertised_features[i++]) != NULL) { + if (qdict_get(qdict_in, name)) { + if (!object_property_set(obj, name, visitor, &err)) { + break; + } + } + } + + if (!err) { + visit_check_struct(visitor, &err); + } visit_end_struct(visitor, NULL); visit_free(visitor); - if (!ok) { + if (err) { + error_propagate(errp, err); + object_unref(obj); return NULL; } }- oc = cpu_class_by_name(TYPE_LOONGARCH_CPU, model->name);- if (!oc) { - error_setg(errp, "The CPU type '%s' is not a recognized LoongArch CPU type", - model->name); - return NULL; - } - - obj = object_new(object_class_get_name(oc)); - expansion_info = g_new0(CpuModelExpansionInfo, 1); expansion_info->model = g_malloc0(sizeof(*expansion_info->model)); expansion_info->model->name = g_strdup(model->name);
