Hello Tom, On Mon, Aug 09, 2021 at 08:41:27AM -0500, Tom Lendacky wrote: > On 8/2/21 7:31 AM, Ashish Kalra wrote: > > + > > + Signature[12] = '\0'; > > + for (mKvmLeaf = 0x40000000; mKvmLeaf < 0x40010000; mKvmLeaf += 0x100) { > > I still really don't understand the need for the CPUID loop. KVM only ever > programs CPUID function 0x40000000, right? >
Yes KVM only programs CPUID function 0x40000000, as do other hypervisors like Hyper-V. Also mentioned that leaf 0x40000000 is the Hypervisor CPUID leaf range and vendor ID signature in MSFT Hypervisor Interface document. But looking at linux kernel code for the same functionality : static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves) { uint32_t base, eax, signature[3]; for (base = 0x40000000; base < 0x40010000; base += 0x100) { cpuid(base, &eax, &signature[0], &signature[1], &signature[2]); if (!memcmp(sig, signature, 12) ... ... And the Xen detection code in OVMF: for (mXenLeaf = 0x40000000; mXenLeaf < 0x40010000; mXenLeaf += 0x100) { AsmCpuid (mXenLeaf, NULL, (UINT32 *) &Signature[0], (UINT32 *) &Signature[4], (UINT32 *) &Signature[8]); if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) { return TRUE; The above functions are doing a loop-test. The kernel patch also mentions about the loop-test : https://lore.kernel.org/kvm/51ff1e26.6010...@redhat.com/t/ This patch introduce hypervisor_cpuid_base() which loop test the hypervisor existence function until the signature match and check the number of leaves if required. This could be used by Xen/KVM guest to detect the existence of hypervisor. The above patches/functions don't have any additonal documentation for why are they doing the loop-test ? I don't want to miss any functionality, hence i am reusing the same loop-test code. Thanks, Ashish > > + AsmCpuid ( > > + mKvmLeaf, > > + NULL, > > + (UINT32 *) &Signature[0], > > + (UINT32 *) &Signature[4], > > + (UINT32 *) &Signature[8]); > > + > > + if (AsciiStrCmp (Signature, "KVMKVMKVM") == 0) { > > + DEBUG (( > > + DEBUG_INFO, > > + "%a: KVM Detected, signature = %a\n", > > + __FUNCTION__, > > + Signature > > + )); > > + > > + RegEax = mKvmLeaf + 1; > > + RegEcx = 0; > > + AsmCpuid (mKvmLeaf + 1, &RegEax, &RegEbx, &RegEcx, &RegEdx); > > + if ((RegEax & KVM_FEATURE_MIGRATION_CONTROL) != 0) { > > + DEBUG (( > > + DEBUG_INFO, > > + "%a: SEV Live Migration feature supported\n", > > + __FUNCTION__ > > + )); > > + > > + return TRUE; > > + } > > + } > > + } > > + > > + return FALSE; > > +} -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#78964): https://edk2.groups.io/g/devel/message/78964 Mute This Topic: https://groups.io/mt/84609830/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-