From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id EB0D4F34C65 for ; Mon, 13 Apr 2026 16:54:29 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wCKX8-0006qO-O8; Mon, 13 Apr 2026 12:53:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wCKX7-0006q4-SY for qemu-devel@nongnu.org; Mon, 13 Apr 2026 12:53:09 -0400 Received: from p-west2-cluster3-host5-snip4-3.eps.apple.com ([57.103.69.86] helo=outbound.mr.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wCKX6-0005Uv-3s for qemu-devel@nongnu.org; Mon, 13 Apr 2026 12:53:09 -0400 Received: from outbound.mr.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-2a-10-percent-1 (Postfix) with ESMTPS id 76DF618027E6; Mon, 13 Apr 2026 16:53:06 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1776099186; x=1778691186; bh=oQob0705w1vpsKwSbilmxpp8KQiyruObQqebQ5RZ0Dc=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=Ekljg24y5XdqPHkpPRHPRcjP3tmBwFEl0VhuMmmeROEnRACTvKx80EHtVrYJaZBsijmDxgLTSYuzIZaG0GCICd82iprpIkdFlNDxdmnBa7BpBJlnOiFzXuIGnkfjTdGZgAl2RMBSzx/Rn5NyfpW4ypq06d+v+ElhLZInE1gPIcMv75WqfVTmkW9HE7RjXFEdeh1Y0XOU+EZWqVb1++QSik711H7nY1z/WxMBhwSdfL84iljZ6bKjYlZHpqNVihT0a3BjEw53wjBwEdTumS2T/LVzq+rELZP0q+416i42dpuatm9LcsbuIE18beTdwiU/AdRK+v8VysLFzn4oxgpS3Q== mail-alias-created-date: 1752046281608 Received: from localhost.localdomain (unknown [17.57.152.38]) by p00-icloudmta-asmtp-us-west-2a-10-percent-1 (Postfix) with ESMTPSA id BE72E180047D; Mon, 13 Apr 2026 16:52:57 +0000 (UTC) From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: "Michael S. Tsirkin" , Pedro Barbuda , Mohamed Mediouni , Paolo Bonzini , Zhao Liu , Roman Bolshakov , Wei Liu , Phil Dennis-Jordan Subject: [PATCH v11 06/15] whpx: i386: reintroduce enlightenments for Windows 10 Date: Mon, 13 Apr 2026 18:52:08 +0200 Message-ID: <20260413165217.47105-7-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260413165217.47105-1-mohamed@unpredictable.fr> References: <20260413165217.47105-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDEzMDE2NiBTYWx0ZWRfX/udrLk4wTy69 kFs6kysHx/d+UdZeR5xTxB66ebCTaCl0aA1NIwJvUcpOeiQ8RX5eMwBvXHyy6vrUh/7m9nBsR61 kA9LuLW4v74giOu1D9cXXsVzLpRy6NvKHxcJQeFko8itemh2xgKNgz1XMypwGvXUCLpJJh8dEFc jz9mpmb1t1+cxN2xmkvsQREL1NPQvimKNY6cKmxnosbTpsJCx0yf54xz3SmCE/MjNRxjkOctfjX mNkd70Iv5whX0fH5kLFNxvrSkQxMiAr3v3NBwgjTuFlpOuW9pWSNMueaEFEeiZ1oENm76WN4KCH RjfdFUP4grDojhYqj0R0RqfvlbNq8T7pEF4JYW7Fnp19Zt2JHPeBNZZTXC1ufw= X-Proofpoint-GUID: ojFBLz7sioIdrNZ2OF37HobbJ35g__Pa X-Authority-Info-Out: v=2.4 cv=botBxUai c=1 sm=1 tr=0 ts=69dd1f72 cx=c_apl:c_pps:t_out a=9OgfyREA4BUYbbCgc0Y0oA==:117 a=9OgfyREA4BUYbbCgc0Y0oA==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=hfWBbujXMTx1PmRkPVYA:9 X-Proofpoint-ORIG-GUID: ojFBLz7sioIdrNZ2OF37HobbJ35g__Pa X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-13_03,2026-04-13_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 clxscore=1030 adultscore=0 phishscore=0 bulkscore=0 mlxlogscore=999 malwarescore=0 lowpriorityscore=0 spamscore=0 mlxscore=0 suspectscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604130166 Received-SPF: pass client-ip=57.103.69.86; envelope-from=mohamed@unpredictable.fr; helo=outbound.mr.icloud.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Was removed in 2c08624 but it's still useful for Windows 10 so reintroduce it there. And this time, actually make it work by reporting the hypervisor bit in CPUID. Pretend to be vmware to be able to use vmport's functionality. If the vmware frequency leaf is disabled, pretend to be KVM, with the only capability reported being X2APIC support. Signed-off-by: Mohamed Mediouni --- accel/whpx/whpx-common.c | 2 ++ include/system/whpx-internal.h | 1 + target/arm/whpx/whpx-all.c | 1 + target/i386/whpx/whpx-all.c | 63 +++++++++++++++++++++++++++++----- 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c index b813a5d9d2..59be996aef 100644 --- a/accel/whpx/whpx-common.c +++ b/accel/whpx/whpx-common.c @@ -550,6 +550,8 @@ static void whpx_accel_instance_init(Object *obj) whpx->hyperv_enlightenments_allowed = true; whpx->hyperv_enlightenments_required = false; + /* Value determined at whpx_accel_init */ + whpx->hyperv_enlightenments_enabled = false; } static const TypeInfo whpx_accel_type = { diff --git a/include/system/whpx-internal.h b/include/system/whpx-internal.h index 5902124b63..cf782cf5f8 100644 --- a/include/system/whpx-internal.h +++ b/include/system/whpx-internal.h @@ -45,6 +45,7 @@ struct whpx_state { bool hyperv_enlightenments_allowed; bool hyperv_enlightenments_required; + bool hyperv_enlightenments_enabled; }; diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c index bbf0f6be96..4019a513aa 100644 --- a/target/arm/whpx/whpx-all.c +++ b/target/arm/whpx/whpx-all.c @@ -968,6 +968,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) * as they're not needed for performance. */ if (whpx->hyperv_enlightenments_required) { + whpx->hyperv_enlightenments_enabled = true; hr = whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks, diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index 66f263558f..c2a78312f8 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2083,14 +2083,57 @@ int whpx_vcpu_run(CPUState *cpu) vcpu->exit_ctx.VpContext.Rip + vcpu->exit_ctx.VpContext.InstructionLength; - reg_values[1].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRax; - reg_values[2].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRcx; - reg_values[3].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx; - reg_values[4].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx; - - if (vcpu->exit_ctx.CpuidAccess.Rax == 1) { - if (cpu_has_x2apic_feature(env)) { - reg_values[2].Reg64 |= CPUID_EXT_X2APIC; + if (whpx_is_legacy_os()) { + reg_values[1].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRax; + reg_values[2].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRcx; + reg_values[3].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRdx; + reg_values[4].Reg64 = vcpu->exit_ctx.CpuidAccess.DefaultResultRbx; + } else { + cpu_x86_cpuid(env, vcpu->exit_ctx.CpuidAccess.Rax, + vcpu->exit_ctx.CpuidAccess.Rcx, + (UINT32 *)®_values[1].Reg32, + (UINT32 *)®_values[4].Reg32, (UINT32 *)®_values[2].Reg32, + (UINT32 *)®_values[3].Reg32); + } + + if (!whpx->hyperv_enlightenments_enabled) { + switch (vcpu->exit_ctx.CpuidAccess.Rax) { + case 1: + reg_values[2].Reg64 |= CPUID_EXT_HYPERVISOR; + break; + case 0x40000000: + /* + * Use vmware_cpuid_freq as a proxy to report VMware. + * This is to get the TSC/APIC frequency query functionality + * provided through vmport, as Linux doesn't use leaf + * 0x40000010 for getting those frequencies. + */ + if (x86_cpu->vmware_cpuid_freq) { + reg_values[1].Reg64 = 0x40000010; + reg_values[4].Reg64 = 0x61774d56; + reg_values[2].Reg64 = 0x4d566572; + reg_values[3].Reg64 = 0x65726177; + } else { + /* report KVM otherwise if that's disabled */ + reg_values[1].Reg64 = 0x40000001; + reg_values[4].Reg64 = 0x4b4d564b; + reg_values[2].Reg64 = 0x564b4d56; + reg_values[3].Reg64 = 0x4d; + } + break; + case 0x40000001: + if (!x86_cpu->vmware_cpuid_freq) { + /* KVM reporting of X2APIC support */ + reg_values[1].Reg64 = reg_values[4].Reg64 = + reg_values[2].Reg64 = 1 << 15; + } + break; + case 0x40000010: + if (x86_cpu->vmware_cpuid_freq) { + reg_values[1].Reg64 = env->tsc_khz; + reg_values[4].Reg64 = env->apic_bus_freq / 1000; /* Hz to KHz */ + } + break; } } @@ -2311,6 +2354,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) WHV_PROCESSOR_FEATURES_BANKS processor_features; WHV_PROCESSOR_PERFMON_FEATURES perfmon_features; UINT32 cpuidExitList[] = {1}; + UINT32 cpuidExitList_nohyperv[] = {1, 0x40000000, 0x40000001, 0x40000010}; whpx = &whpx_global; @@ -2513,6 +2557,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) } if (is_modern_os && whpx->hyperv_enlightenments_allowed) { + whpx->hyperv_enlightenments_enabled = true; hr = whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks, @@ -2565,7 +2610,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) hr = whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeCpuidExitList, - cpuidExitList, + whpx->hyperv_enlightenments_enabled ? cpuidExitList : cpuidExitList_nohyperv, RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32)); if (FAILED(hr)) { -- 2.50.1 (Apple Git-155)