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(-)

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);
-- 
2.39.3


Reply via email to