On 2/9/2026 7:23 PM, Zhao Liu wrote:
> At present, QEMU determines if the user has set the "lbr-fmt" property
> by checking if its value differs from a special value,
> `~PERF_CAP_LBR_FMT` (`~0x3f`).
> 
> Relying on such a magic number to distinguish user input from the
> default state is implicit and fragile. It also prevents the helper macro
> `DEFINE_PROP_UINT64_CHECKMASK` from supporting a *valid* default value,
> as initializing the property with a valid default would make it
> impossible to distinguish from a user-provided value.
> 
> With the introduction of `OBJ_PROP_FLAG_USER_SET`, it's possible to
> directly check this flag to determine whether the user has modified the
> property, which can help get rid of invalid "sentinel" value.
> 
> Therefore, detect user-provided value by checking the USER_SET property
> flag in x86_cpu_realizefn(). The invalid initialization value will be
> dropped in subsequent work.
> 
> Signed-off-by: Zhao Liu <[email protected]>
> ---
>  target/i386/cpu.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index a594747f0030..a6d943c53a3f 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -9779,6 +9779,7 @@ static void x86_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>      CPUX86State *env = &cpu->env;
>      Error *local_err = NULL;
>      unsigned requested_lbr_fmt;
> +    int lbr_fmt_set;
>  
>  #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
>      /* Use pc-relative instructions in system-mode */
> @@ -9815,7 +9816,11 @@ static void x86_cpu_realizefn(DeviceState *dev, Error 
> **errp)
>       * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
>       * with user-provided setting.
>       */
> -    if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
> +    lbr_fmt_set = object_property_check_flags(OBJECT(dev), "lbr-fmt",
> +                                              OBJ_PROP_FLAG_USER_SET, errp);
> +    if (lbr_fmt_set < 0) {

lbr_fmt_set will never be -1.  How about remove the "< 0" case and hence
the variable lbr_fmt_set can be removed. Simpler code.

> +        return;
> +    } else if (lbr_fmt_set > 0) {
>          env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
>          env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
>      }


Reply via email to