diff mbox series

[v5,19/65] i386/tdx: Update tdx_cpuid_lookup[].tdx_fixed0/1 by tdx_caps.cpuid_config[]

Message ID 20240229063726.610065-20-xiaoyao.li@intel.com (mailing list archive)
State New, archived
Headers show
Series QEMU Guest memfd + QEMU TDX support | expand

Commit Message

Xiaoyao Li Feb. 29, 2024, 6:36 a.m. UTC
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.

Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
 target/i386/kvm/tdx.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Comments

Duan, Zhenzhong May 31, 2024, 9:27 a.m. UTC | #1
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;
>   }
diff mbox series

Patch

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,
+                                      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;
 }