2 * QEMU LoongArch CPU (monitor definitions)
4 * SPDX-FileCopyrightText: 2021 Loongson Technology Corporation Limited
6 * SPDX-License-Identifier: GPL-2.0-or-later
9 #include "qemu/osdep.h"
10 #include "qapi/error.h"
11 #include "qapi/qapi-commands-machine-target.h"
13 #include "qapi/qmp/qdict.h"
14 #include "qapi/qobject-input-visitor.h"
15 #include "qom/qom-qobject.h"
17 static void loongarch_cpu_add_definition(gpointer data
, gpointer user_data
)
19 ObjectClass
*oc
= data
;
20 CpuDefinitionInfoList
**cpu_list
= user_data
;
21 CpuDefinitionInfo
*info
= g_new0(CpuDefinitionInfo
, 1);
22 const char *typename
= object_class_get_name(oc
);
24 info
->name
= cpu_model_from_type(typename
);
25 info
->q_typename
= g_strdup(typename
);
27 QAPI_LIST_PREPEND(*cpu_list
, info
);
30 CpuDefinitionInfoList
*qmp_query_cpu_definitions(Error
**errp
)
32 CpuDefinitionInfoList
*cpu_list
= NULL
;
35 list
= object_class_get_list(TYPE_LOONGARCH_CPU
, false);
36 g_slist_foreach(list
, loongarch_cpu_add_definition
, &cpu_list
);
42 static const char *cpu_model_advertised_features
[] = {
46 CpuModelExpansionInfo
*qmp_query_cpu_model_expansion(CpuModelExpansionType type
,
52 CpuModelExpansionInfo
*expansion_info
;
59 if (type
!= CPU_MODEL_EXPANSION_TYPE_STATIC
) {
60 error_setg(errp
, "The requested expansion type is not supported");
65 visitor
= qobject_input_visitor_new(model
->props
);
66 if (!visit_start_struct(visitor
, "model.props", NULL
, 0, errp
)) {
71 ok
= visit_check_struct(visitor
, errp
);
72 visit_end_struct(visitor
, NULL
);
79 oc
= cpu_class_by_name(TYPE_LOONGARCH_CPU
, model
->name
);
81 error_setg(errp
, "The CPU type '%s' is not a recognized LoongArch CPU type",
86 obj
= object_new(object_class_get_name(oc
));
88 expansion_info
= g_new0(CpuModelExpansionInfo
, 1);
89 expansion_info
->model
= g_malloc0(sizeof(*expansion_info
->model
));
90 expansion_info
->model
->name
= g_strdup(model
->name
);
92 qdict_out
= qdict_new();
95 while ((name
= cpu_model_advertised_features
[i
++]) != NULL
) {
96 ObjectProperty
*prop
= object_property_find(obj
, name
);
101 value
= object_property_get_qobject(obj
, name
, &error_abort
);
103 qdict_put_obj(qdict_out
, name
, value
);
107 if (!qdict_size(qdict_out
)) {
108 qobject_unref(qdict_out
);
110 expansion_info
->model
->props
= QOBJECT(qdict_out
);
115 return expansion_info
;