[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/25] i386: Register feature bit properties as class properties
From: |
Eduardo Habkost |
Subject: |
[PULL 04/25] i386: Register feature bit properties as class properties |
Date: |
Tue, 15 Dec 2020 10:19:21 -0500 |
Class properties make QOM introspection simpler and easier, as
they don't require an object to be instantiated.
Also, the hundreds of instance properties were having an impact
on QMP commands that create temporary CPU objects. On my
machine, run time of qmp_query_cpu_definitions() changed
from ~200ms to ~16ms after applying this patch.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Message-Id: <20201111183823.283752-5-ehabkost@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
target/i386/cpu.c | 40 ++++++++++++++++------------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 6c11feeb92..ca997a68cd 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -6858,29 +6858,23 @@ static void x86_cpu_set_bit_prop(Object *obj, Visitor
*v, const char *name,
cpu->env.user_features[fp->w] |= fp->mask;
}
-static void x86_cpu_release_bit_prop(Object *obj, const char *name,
- void *opaque)
-{
- BitProperty *prop = opaque;
- g_free(prop);
-}
-
/* Register a boolean property to get/set a single bit in a uint32_t field.
*
* The same property name can be registered multiple times to make it affect
* multiple bits in the same FeatureWord. In that case, the getter will return
* true only if all bits are set.
*/
-static void x86_cpu_register_bit_prop(X86CPU *cpu,
+static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
const char *prop_name,
FeatureWord w,
int bitnr)
{
+ ObjectClass *oc = OBJECT_CLASS(xcc);
BitProperty *fp;
ObjectProperty *op;
uint64_t mask = (1ULL << bitnr);
- op = object_property_find(OBJECT(cpu), prop_name);
+ op = object_class_property_find(oc, prop_name);
if (op) {
fp = op->opaque;
assert(fp->w == w);
@@ -6889,14 +6883,14 @@ static void x86_cpu_register_bit_prop(X86CPU *cpu,
fp = g_new0(BitProperty, 1);
fp->w = w;
fp->mask = mask;
- object_property_add(OBJECT(cpu), prop_name, "bool",
- x86_cpu_get_bit_prop,
- x86_cpu_set_bit_prop,
- x86_cpu_release_bit_prop, fp);
+ object_class_property_add(oc, prop_name, "bool",
+ x86_cpu_get_bit_prop,
+ x86_cpu_set_bit_prop,
+ NULL, fp);
}
}
-static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
+static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
FeatureWord w,
int bitnr)
{
@@ -6915,7 +6909,7 @@ static void x86_cpu_register_feature_bit_props(X86CPU
*cpu,
/* aliases don't use "|" delimiters anymore, they are registered
* manually using object_property_add_alias() */
assert(!strchr(name, '|'));
- x86_cpu_register_bit_prop(cpu, name, w, bitnr);
+ x86_cpu_register_bit_prop(xcc, name, w, bitnr);
}
#if !defined(CONFIG_USER_ONLY)
@@ -6969,7 +6963,6 @@ static void x86_cpu_initfn(Object *obj)
X86CPU *cpu = X86_CPU(obj);
X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
CPUX86State *env = &cpu->env;
- FeatureWord w;
env->nr_dies = 1;
cpu_set_cpustate_pointers(cpu);
@@ -6981,14 +6974,6 @@ static void x86_cpu_initfn(Object *obj)
x86_cpu_get_feature_words,
NULL, NULL, (void *)cpu->filtered_features);
- for (w = 0; w < FEATURE_WORDS; w++) {
- int bitnr;
-
- for (bitnr = 0; bitnr < 64; bitnr++) {
- x86_cpu_register_feature_bit_props(cpu, w, bitnr);
- }
- }
-
object_property_add_alias(obj, "sse3", obj, "pni");
object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
@@ -7274,6 +7259,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc,
void *data)
X86CPUClass *xcc = X86_CPU_CLASS(oc);
CPUClass *cc = CPU_CLASS(oc);
DeviceClass *dc = DEVICE_CLASS(oc);
+ FeatureWord w;
device_class_set_parent_realize(dc, x86_cpu_realizefn,
&xcc->parent_realize);
@@ -7363,6 +7349,12 @@ static void x86_cpu_common_class_init(ObjectClass *oc,
void *data)
x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
#endif
+ for (w = 0; w < FEATURE_WORDS; w++) {
+ int bitnr;
+ for (bitnr = 0; bitnr < 64; bitnr++) {
+ x86_cpu_register_feature_bit_props(xcc, w, bitnr);
+ }
+ }
}
static const TypeInfo x86_cpu_type_info = {
--
2.28.0
- [PULL 10/25] netfilter: Use class properties, (continued)
- [PULL 10/25] netfilter: Use class properties, Eduardo Habkost, 2020/12/15
- [PULL 05/25] arm/virt: Register most properties as class properties, Eduardo Habkost, 2020/12/15
- [PULL 22/25] qdev: Make error_set_from_qdev_prop_error() get Object* argument, Eduardo Habkost, 2020/12/15
- [PULL 14/25] qdev: Check dev->realized at set_size(), Eduardo Habkost, 2020/12/15
- [PULL 21/25] qdev: Make check_prop_still_unset() get Object* argument, Eduardo Habkost, 2020/12/15
- [PULL 15/25] sparc: Check dev->realized at sparc_set_nwindows(), Eduardo Habkost, 2020/12/15
- [PULL 01/25] vexpress: Register "secure" as class property, Eduardo Habkost, 2020/12/15
- [PULL 16/25] qdev: Don't use dev->id on set_size32() error message, Eduardo Habkost, 2020/12/15
- [PULL 11/25] cs4231: Get rid of empty property array, Eduardo Habkost, 2020/12/15
- [PULL 07/25] arm/cpu64: Register "aarch64" as class property, Eduardo Habkost, 2020/12/15
- [PULL 04/25] i386: Register feature bit properties as class properties,
Eduardo Habkost <=
- [PULL 13/25] qdev: Move property code to qdev-properties.[ch], Eduardo Habkost, 2020/12/15
- [PULL 12/25] cpu: Move cpu_common_props to hw/core/cpu.c, Eduardo Habkost, 2020/12/15
- [PULL 08/25] can_host: Use class properties, Eduardo Habkost, 2020/12/15
- [PULL 25/25] MAINTAINERS: Update my git repository URLs, Eduardo Habkost, 2020/12/15
- [PULL 17/25] qdev: Make PropertyInfo.print method get Object* argument, Eduardo Habkost, 2020/12/15
- [PULL 20/25] qdev: Make qdev_find_global_prop() get Object* argument, Eduardo Habkost, 2020/12/15
- [PULL 23/25] qdev: Make qdev_propinfo_get_uint16() static, Eduardo Habkost, 2020/12/15
- [PULL 19/25] qdev: Make qdev_get_prop_ptr() get Object* arg, Eduardo Habkost, 2020/12/15
- [PULL 24/25] qdev: Move UUID property to qdev-properties-system.c, Eduardo Habkost, 2020/12/15
- [PULL 06/25] virt: Register "its" as class property, Eduardo Habkost, 2020/12/15