On Thu, Oct 31, 2024 at 05:09:17PM +0800, Binbin Wu wrote: > > > > On 10/31/2024 3:00 AM, Rick Edgecombe wrote: > [...] > > +static u32 tdx_set_guest_phys_addr_bits(const u32 eax, int addr_bits) > > +{ > > + return (eax & ~GENMASK(23, 16)) | (addr_bits & 0xff) << 16; > > +} > > + > > +#define KVM_TDX_CPUID_NO_SUBLEAF ((__u32)-1) > > + > > +static void td_init_cpuid_entry2(struct kvm_cpuid_entry2 *entry, unsigned char idx) > > +{ > > + const struct tdx_sys_info_td_conf *td_conf = &tdx_sysinfo->td_conf; > > + > > + entry->function = (u32)td_conf->cpuid_config_leaves[idx]; > > + entry->index = td_conf->cpuid_config_leaves[idx] >> 32; > > + entry->eax = (u32)td_conf->cpuid_config_values[idx][0]; > > + entry->ebx = td_conf->cpuid_config_values[idx][0] >> 32; > > + entry->ecx = (u32)td_conf->cpuid_config_values[idx][1]; > > + entry->edx = td_conf->cpuid_config_values[idx][1] >> 32; > > + > > + if (entry->index == KVM_TDX_CPUID_NO_SUBLEAF) > > + entry->index = 0; > > + > > + /* Work around missing support on old TDX modules */ > > + if (entry->function == 0x80000008) > > + entry->eax = tdx_set_guest_phys_addr_bits(entry->eax, 0xff); > Is it necessary to set bit 16~23 to 0xff? > It seems that when userspace wants to retrieve the value, the GPAW will > be set in tdx_read_cpuid() anyway. Leaving it out currently produces: qemu-system-x86_64: KVM_TDX_INIT_VM failed: Invalid argument Regards, Tony