Collin Walling <wall...@linux.ibm.com> writes: > The @deprecated-props array did not make any sense to be a member of the > CpuModelInfo struct, since this field would only be populated by a > query-cpu-model-expansion response and ignored otherwise.
Doesn't query-cpu-model-baseline also return it in its response? It seems to assume the "static" expansion type. > Move this > field to the CpuModelExpansionInfo struct where is makes more sense. > > References: > - https://lists.gnu.org/archive/html/qemu-devel/2024-07/msg05996.html > - commit eed0e8ffa38f0695c0519508f6e4f5a3297cbd67 > > Signed-off-by: Collin Walling <wall...@linux.ibm.com> > --- > > @David, the previous commit header did not align with the changes made > here, so I tagged this as a "v1" but added the previous conversation as > a reference. I hope this is appropriate? > > --- > qapi/machine-target.json | 18 ++++++++++-------- > target/s390x/cpu_models_sysemu.c | 31 ++++++++++++++++++++----------- > 2 files changed, 30 insertions(+), 19 deletions(-) > > diff --git a/qapi/machine-target.json b/qapi/machine-target.json > index a552e2b0ce..09dec2b9bb 100644 > --- a/qapi/machine-target.json > +++ b/qapi/machine-target.json > @@ -20,17 +20,11 @@ > # > # @props: a dictionary of QOM properties to be applied > # > -# @deprecated-props: a list of properties that are flagged as deprecated > -# by the CPU vendor. These properties are either a subset of the > -# properties enabled on the CPU model, or a set of properties > -# deprecated across all models for the architecture. > -# > # Since: 2.8 > ## > { 'struct': 'CpuModelInfo', > 'data': { 'name': 'str', > - '*props': 'any', > - '*deprecated-props': ['str'] } } > + '*props': 'any' } } > > ## > # @CpuModelExpansionType: > @@ -248,10 +242,18 @@ > # > # @model: the expanded CpuModelInfo. > # > +# @deprecated-props: a list of properties that are flagged as deprecated > +# by the CPU vendor. The list depends on the CpuModelExpansionType: > +# "static" properties are a subset of the enabled-properties for > +# the expanded model; "full" properties are a set of properties > +# that are deprecated across all models for the architecture. > +# (since: 9.1). > +# > # Since: 2.8 > ## > { 'struct': 'CpuModelExpansionInfo', > - 'data': { 'model': 'CpuModelInfo' }, > + 'data': { 'model': 'CpuModelInfo', > + '*deprecated-props': ['str'] }, > 'if': { 'any': [ 'TARGET_S390X', > 'TARGET_I386', > 'TARGET_ARM', This solves several interface problems: 1. Removes inappropriate @deprecated-props argument of query-cpu-model-comparison, query-cpu-model-expansion, query-cpu-model-baseline. 2. Removes @deprecated-props return of query-cpu-model-baseline. 3. Properly documents how @deprecated-props depends on the expansion type. Remaining problem: 4. Only S390 implements this. Suggest to capture 1-3 more clearly in the commit message, perhaps like this: CpuModelInfo is used both as command argument and in command returns. Its @deprecated-props array does not make any sense in arguments, and is silently ignored. We actually want it only as return value of query-cpu-model-expansion. Move it from CpuModelInfo to CpuModelExpansionType, and document its dependence on expansion type propetly. The simplest way to address 4 is to tack 'if': 'TARGET_S390X' to @deprecated-props. I recommend to make @deprecated-props mandatory rather than optional then. > diff --git a/target/s390x/cpu_models_sysemu.c > b/target/s390x/cpu_models_sysemu.c > index 94dd798b4c..44e7587acb 100644 > --- a/target/s390x/cpu_models_sysemu.c > +++ b/target/s390x/cpu_models_sysemu.c > @@ -174,15 +174,11 @@ static void cpu_info_from_model(CpuModelInfo *info, > const S390CPUModel *model, > bool delta_changes) > { > QDict *qdict = qdict_new(); > - S390FeatBitmap bitmap, deprecated; > + S390FeatBitmap bitmap; > > /* always fallback to the static base model */ > info->name = g_strdup_printf("%s-base", model->def->name); > > - /* features flagged as deprecated */ > - bitmap_zero(deprecated, S390_FEAT_MAX); > - s390_get_deprecated_features(deprecated); > - > if (delta_changes) { > /* features deleted from the base feature set */ > bitmap_andnot(bitmap, model->def->base_feat, model->features, > @@ -197,9 +193,6 @@ static void cpu_info_from_model(CpuModelInfo *info, const > S390CPUModel *model, > if (!bitmap_empty(bitmap, S390_FEAT_MAX)) { > s390_feat_bitmap_to_ascii(bitmap, qdict, qdict_add_enabled_feat); > } > - > - /* deprecated features that are a subset of the model's enabled > features */ > - bitmap_and(deprecated, deprecated, model->features, S390_FEAT_MAX); > } else { > /* expand all features */ > s390_feat_bitmap_to_ascii(model->features, qdict, > @@ -213,9 +206,6 @@ static void cpu_info_from_model(CpuModelInfo *info, const > S390CPUModel *model, > } else { > info->props = QOBJECT(qdict); > } > - > - s390_feat_bitmap_to_ascii(deprecated, &info->deprecated_props, > list_add_feat); > - info->has_deprecated_props = !!info->deprecated_props; > } > > CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType > type, > @@ -226,6 +216,7 @@ CpuModelExpansionInfo > *qmp_query_cpu_model_expansion(CpuModelExpansionType type, > CpuModelExpansionInfo *expansion_info = NULL; > S390CPUModel s390_model; > bool delta_changes = false; > + S390FeatBitmap deprecated_feats; > > /* convert it to our internal representation */ > cpu_model_from_info(&s390_model, model, "model", &err); > @@ -245,6 +236,24 @@ CpuModelExpansionInfo > *qmp_query_cpu_model_expansion(CpuModelExpansionType type, > expansion_info = g_new0(CpuModelExpansionInfo, 1); > expansion_info->model = g_malloc0(sizeof(*expansion_info->model)); > cpu_info_from_model(expansion_info->model, &s390_model, delta_changes); > + > + /* populated list of deprecated features */ > + bitmap_zero(deprecated_feats, S390_FEAT_MAX); > + s390_get_deprecated_features(deprecated_feats); > + > + if (delta_changes) { > + /* > + * Only populate deprecated features that are a > + * subset of the features enabled on the CPU model. > + */ > + bitmap_and(deprecated_feats, deprecated_feats, > + s390_model.features, S390_FEAT_MAX); > + } > + > + s390_feat_bitmap_to_ascii(deprecated_feats, > + &expansion_info->deprecated_props, > list_add_feat); > + expansion_info->has_deprecated_props = > !!expansion_info->deprecated_props; > + > return expansion_info; > } Implementation looks good to me.