On 2/29/2024 2:36 PM, Xiaoyao Li wrote:
> tdx_cpuid_lookup[].tdx_fixed0/1 is QEMU maintained data which reflects
> TDX restrictions regrading what bits are fixed by TDX module.
>
> It's retrieved from TDX spec and static. However, TDX may evolve and
> change some fixed fields to configurable in the future. Update
> tdx_cpuid.lookup[].tdx_fixed0/1 fields by removing the bits that
> reported from TDX module as configurable. This can adapt with the
> updated TDX (module) automatically.
Can the fixed fields evolves to other type, i.e., native?
>
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
> target/i386/kvm/tdx.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
> index 239170142e4f..424c0f3c0fbb 100644
> --- a/target/i386/kvm/tdx.c
> +++ b/target/i386/kvm/tdx.c
> @@ -377,6 +377,38 @@ static int get_tdx_capabilities(Error **errp)
> return 0;
> }
>
> +static void update_tdx_cpuid_lookup_by_tdx_caps(void)
> +{
> + KvmTdxCpuidLookup *entry;
> + FeatureWordInfo *fi;
> + uint32_t config;
> + FeatureWord w;
> +
> + for (w = 0; w < FEATURE_WORDS; w++) {
> + fi = &feature_word_info[w];
> + entry = &tdx_cpuid_lookup[w];
> +
> + if (fi->type != CPUID_FEATURE_WORD) {
> + continue;
> + }
> +
> + config = tdx_cap_cpuid_config(fi->cpuid.eax,
> + fi->cpuid.needs_ecx ? fi->cpuid.ecx : ~0u,
So the check "cpuid_c->sub_leaf == 0xffffffff" in tdx_cap_cpuid_config()
is unnecessary?
Thanks
Zhenzhong
> + fi->cpuid.reg);
> +
> + if (!config) {
> + continue;
> + }
> +
> + /*
> + * Remove the configurable bits from tdx_fixed0/1 in case QEMU
> + * maintained fixed0/1 values is outdated to TDX module.
> + */
> + entry->tdx_fixed0 &= ~config;
> + entry->tdx_fixed1 &= ~config;
> + }
> +}
> +
> static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
> {
> MachineState *ms = MACHINE(qdev_get_machine());
> @@ -392,6 +424,8 @@ static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
> }
> }
>
> + update_tdx_cpuid_lookup_by_tdx_caps();
> +
> tdx_guest = tdx;
> return 0;
> }