[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/cpuid: Expose number of vCPUs in CPUID.1.EBX
When running under KVM (or presumably other hypervisors) we enable the CPUID.1.EDX.HTT flag, thus indicating validity of CPUID.1.EBX[23:16] - maximum number of logical processors which the guest reads as 0. Although this method of topology detection is considered legacy, Windows falls back to it when CPUID.0BH.EBX is 0. CPUID.1.EBX[23:16] being equal to 0, triggers memory corruption in ntoskrnl.exe as Windows assumes that number of logical processors would be at least 1. Memory corruption manifests itself while mapping framebuffer for early graphical subsystem, causing BSOD. This patch fixes running nested Windows (tested on 7 and 10) with KVM as L0 hypervisor, by setting the value to maximum number of vCPUs in domain. Signed-off-by: Hubert Jasudowicz <hubert.jasudowicz@xxxxxxx> --- xen/arch/x86/cpuid.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index ee11087626..bf38398ef3 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -811,10 +811,12 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, case 0x1: /* TODO: Rework topology logic. */ - res->b &= 0x00ffffffu; + res->b &= 0x0000ffffu; if ( is_hvm_domain(d) ) res->b |= (v->vcpu_id * 2) << 24; + res->b |= (d->max_vcpus & 0xff) << 16; + /* TODO: Rework vPMU control in terms of toolstack choices. */ if ( vpmu_available(v) && vpmu_is_set(vcpu_vpmu(v), VPMU_CPU_HAS_DS) ) -- 2.27.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |