On 15/05/2018 13:37, petrutlucia...@gmail.com wrote: > From: Lucian Petrut <lpet...@cloudbasesolutions.com> > > Adds the CPUID trap for CPUID 0x40000000, sending the WHPX signature > to the guest upon request. This is consistent with other QEMU > accelerators (KVM). > > Signed-off-by: Alessandro Pilotti <apilo...@cloudbasesolutions.com> > Signed-off-by: Justin Terry (VM) <jute...@microsoft.com> > Signed-off-by: Lucian Petrut <lpet...@cloudbasesolutions.com>
Is it worth defining a different signature? Can WHPX implement part of the Hyper-V spec, and if so would it be better to return the Hv signature ("Hv#1") instead? Thanks, Paolo > --- > As opposed to the previous patch, this one will set the result of > this specific CPUID leaf when initializing the accelerator so that > we avoid a vcpu exit. > > target/i386/whpx-all.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/target/i386/whpx-all.c b/target/i386/whpx-all.c > index 5843517..c8310de 100644 > --- a/target/i386/whpx-all.c > +++ b/target/i386/whpx-all.c > @@ -29,6 +29,8 @@ > #include <WinHvPlatform.h> > #include <WinHvEmulation.h> > > +#define WHPX_CPUID_SIGNATURE 0x40000000 > + > struct whpx_state { > uint64_t mem_quota; > WHV_PARTITION_HANDLE partition; > @@ -1342,6 +1344,27 @@ static int whpx_accel_init(MachineState *ms) > cpuidExitList, > RTL_NUMBER_OF(cpuidExitList) * > sizeof(UINT32)); > > + UINT32 signature[3] = {0}; > + memcpy(signature, "WHPXWHPXWHPX", 12); > + > + WHV_X64_CPUID_RESULT cpuidResultList[1] = {0}; > + cpuidResultList[0].Function = WHPX_CPUID_SIGNATURE; > + cpuidResultList[0].Eax = 0; > + cpuidResultList[0].Ebx = signature[0]; > + cpuidResultList[0].Ecx = signature[1]; > + cpuidResultList[0].Edx = signature[2]; > + hr = WHvSetPartitionProperty(whpx->partition, > + WHvPartitionPropertyCodeCpuidResultList, > + cpuidResultList, > + RTL_NUMBER_OF(cpuidResultList) * > + sizeof(WHV_X64_CPUID_RESULT)); > + if (FAILED(hr)) { > + error_report("WHPX: Failed to set partition CpuidResultList > hr=%08lx", > + hr); > + ret = -EINVAL; > + goto error; > + } > + > if (FAILED(hr)) { > error_report("WHPX: Failed to set partition CpuidExitList hr=%08lx", > hr); >