On 2/9/2026 7:23 PM, Zhao Liu wrote: > DEFINE_PROP_UINT64_CHECKMASK is designed to detect and check user's > property setting: > * checking: check property value against a bitmask. > * detection: ask caller to provide an invalid value as the initial > "sentinel" value, which is impossible to be set by users. However, > this detection is not strict, since the property could be also > set internally. > > The entire mechanism is not easy to use. > > Now there's USER_SET flag in place (and the current unique use case > "lbr-fmt" has been converted to checking USER_SET way), manual setting > of invalid initial values is no longer required. > > Thus, extend DEFINE_PROP_UINT64_CHECKMASK to support *valid* default > value, and for "lbr-fmt" case, replace the invalid initialization value > `~PERF_CAP_LBR_FMT` with a valid value `0`. > > In addition, considering DEFINE_PROP_UINT64_CHECKMASK itself actually > doesn't identify whether the property is set by the user or not, remove > "user-supplied" related description in its document. > > Signed-off-by: Zhao Liu <[email protected]> > --- Nice to see "cpu->lbr_fmt = ~PERF_CAP_LBR_FMT" is gone. Reviewed-by: Zide Chen <[email protected]> > hw/core/qdev-properties.c | 1 + > include/hw/core/qdev-properties.h | 14 +++++++------- > target/i386/cpu.c | 4 +--- > 3 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 91c4010e7dc9..b84214e60f19 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -507,6 +507,7 @@ const PropertyInfo qdev_prop_uint64_checkmask = { > .type = "uint64", > .get = get_uint64, > .set = set_uint64_checkmask, > + .set_default_value = qdev_propinfo_set_default_value_uint, > }; > > /* --- pointer-size integer --- */ > diff --git a/include/hw/core/qdev-properties.h > b/include/hw/core/qdev-properties.h > index c06de37b1e9d..2ac784bb5e9c 100644 > --- a/include/hw/core/qdev-properties.h > +++ b/include/hw/core/qdev-properties.h > @@ -128,14 +128,14 @@ extern const PropertyInfo qdev_prop_link; > ##__VA_ARGS__) > > /** > - * The DEFINE_PROP_UINT64_CHECKMASK macro checks a user-supplied value > - * against corresponding bitmask, rejects the value if it violates. > - * The default value is set in instance_init(). > + * The DEFINE_PROP_UINT64_CHECKMASK macro checks a value against > corresponding > + * bitmask, rejects the value if it violates. > */ > -#define DEFINE_PROP_UINT64_CHECKMASK(_name, _state, _field, _bitmask) \ > - DEFINE_PROP(_name, _state, _field, qdev_prop_uint64_checkmask, uint64_t, > \ > - .bitmask = (_bitmask), \ > - .set_default = false) > +#define DEFINE_PROP_UINT64_CHECKMASK(_name, _state, _field, _bitmask, > _defval) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_uint64_checkmask, uint64_t, > \ > + .bitmask = (_bitmask), > \ > + .set_default = true, > \ > + .defval.u = (_defval)) > > /** > * DEFINE_PROP_ARRAY: > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index a6d943c53a3f..56735570d66c 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -10265,9 +10265,7 @@ static void x86_cpu_initfn(Object *obj) > object_property_add_alias(obj, "pause_filter", obj, "pause-filter"); > object_property_add_alias(obj, "sse4_1", obj, "sse4.1"); > object_property_add_alias(obj, "sse4_2", obj, "sse4.2"); > - > object_property_add_alias(obj, "hv-apicv", obj, "hv-avic"); > - cpu->lbr_fmt = ~PERF_CAP_LBR_FMT; > object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt"); > > if (xcc->model) { > @@ -10439,7 +10437,7 @@ static const Property x86_cpu_properties[] = { > #endif > DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID), > DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false), > - DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, > PERF_CAP_LBR_FMT), > + DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, > PERF_CAP_LBR_FMT, 0), > > DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts, > HYPERV_SPINLOCK_NEVER_NOTIFY),
