From nobody Sat Apr 11 20:10:09 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=unpredictable.fr ARC-Seal: i=1; a=rsa-sha256; t=1775158355; cv=none; d=zohomail.com; s=zohoarc; b=AnYLR1raDDZ5RdwaBUou7uh5ehApKpEl3eI4WPVGfXsS1k4PJOLBl5kDvoRmvlEdNlZ/cQr/1Dl7+BAt1emCqKa1dXXaGdcyyR0Q1sIM0vQGjRZ8sYCFHcVc8bRAfHT6vuCrwjcP0JXMaeYGvFMCqXXWjXwrtiKpRXu66HPh7pI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1775158355; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=DJiQcN+R2DoS0VUEx1nwHZdiISPegzTmeoPCfvvpPAA=; b=fv47faaCd8hYEHS7ujcIzZAGWH/++vQLch1A5h5qkyDcX+GwL8PL1u2jxQE8k9f1wbzq4aB6ueZUjfkK+F+0OSz/5peJ9JGjSTY6ynreVMFlm4cY5+6rhkpbAp3G3tiKcqwM3NLUnD4sAB1O0f+/pm26WXaGusA7Rh4Z0jVC11U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1775158355310852.488752048256; Thu, 2 Apr 2026 12:32:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1w8Nlc-0000Oz-W8; Thu, 02 Apr 2026 15:31:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w8NlO-0000Lq-7I for qemu-devel@nongnu.org; Thu, 02 Apr 2026 15:31:39 -0400 Received: from pv-2002j-snip4-3.eps.apple.com ([57.103.64.144] helo=outbound.pv.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1w8NlI-0008HC-67 for qemu-devel@nongnu.org; Thu, 02 Apr 2026 15:31:30 -0400 Received: from outbound.pv.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-west-1a-20-percent-1 (Postfix) with ESMTPS id 91A1F1800161; Thu, 02 Apr 2026 19:31:24 +0000 (UTC) Received: from localhost.localdomain (unknown [17.56.9.36]) by p00-icloudmta-asmtp-us-west-1a-20-percent-1 (Postfix) with ESMTPSA id 383941800166; Thu, 02 Apr 2026 19:31:22 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1775158286; x=1777750286; bh=DJiQcN+R2DoS0VUEx1nwHZdiISPegzTmeoPCfvvpPAA=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=JPt4jXyHExwsBN3yRflU64Mop3wrZTfSLdvoEeYKK7p9yYwD15gpfB4O5ozCdnlBUxaqltYSD/Zlq9Otr8NGswN1n2Ehn0tMoIgVc4LP+gYlSuE408QEG8qYHYwZTn9HGyOnJjpJCq/D82hE8BBlkTPIZund89zLB3WiWrJD03Uhf6S/ClcJgHFTThf7Ty7jblmofJqFEtB82wDIcrEUi/Wz8RbJcGau1xVBDkNT7Y/n80UePWHwZH59VXWNFONtAN/L6KWCO+/GiWoUAVuAD2sVGR3nV/mOUTS1xoblTHphrG/yrKoCcLRz6mcUCNEeMTqL8lFNLYdg4MUnGIY4bg== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Mohamed Mediouni , Paolo Bonzini , Peter Maydell , Zhao Liu , Roman Bolshakov , Wei Liu , Pedro Barbuda , Phil Dennis-Jordan Subject: [PATCH v2 6/6] whpx: i386: reintroduce enlightenments for Windows 10 Date: Thu, 2 Apr 2026 21:31:04 +0200 Message-ID: <20260402193104.56331-7-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260402193104.56331-1-mohamed@unpredictable.fr> References: <20260402193104.56331-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDAyMDE3NSBTYWx0ZWRfX98CdvnNC8KgV ztIJSyZ32lOdeAiq0LJvBa+IdxzVK75WZn8EG5X21y03aBBHnX3ewpgeaYjJ1gslWPPItUwPB86 MsAmIYv5ncwAbt0abK4/+xSgHI1Y8etNrDVG5ONTLMpEpgrVvYatqOCLNkYGovWjRG6TPAjsBjd j0b0PwCt63YPR3lTz7fAQuQYHJU7rsYMIJoHyyXVS7Rs3fsmqlIEacKQD7pZTpF6Kk/HE9rO5+1 3XqHazF0s2PfBFgzicBCA/gsudBCURkQ0AEbogV0+PRCLhe4OFCuuh6MPL10ywCwCY6MSGBGTG3 v9mMMYS47/xWkhMxQRT7dSx3PiiGhVNPqfS+eIFIukGLx2TajTDTL1gP9NpyBE= X-Proofpoint-GUID: HsktXxGOi5Zk_rkYOiND54WOm5OaaT4A X-Proofpoint-ORIG-GUID: HsktXxGOi5Zk_rkYOiND54WOm5OaaT4A X-Authority-Info-Out: v=2.4 cv=Qr9THFyd c=1 sm=1 tr=0 ts=69cec40d cx=c_apl:c_pps:t_out a=azHRBMxVc17uSn+fyuI/eg==:117 a=azHRBMxVc17uSn+fyuI/eg==:17 a=A5OVakUREuEA:10 a=VkNPw1HP01LnGYTKEx00:22 a=1av6p83xj7LwzDHaJJEA:9 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-02_03,2026-04-02_05,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 mlxlogscore=999 clxscore=1030 spamscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 bulkscore=0 phishscore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2604020175 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=57.103.64.144; envelope-from=mohamed@unpredictable.fr; helo=outbound.pv.icloud.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=unavailable 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+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @unpredictable.fr) X-ZM-MESSAGEID: 1775158360396154100 Content-Type: text/plain; charset="utf-8" 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. Also pretend to be KVM, with the only capability reported being X2APIC support. Although looks like Linux doesn't use that vmware leaf... 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 | 68 ++++++++++++++++++++++++++++++---- 4 files changed, 64 insertions(+), 8 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) =20 whpx->hyperv_enlightenments_allowed =3D true; whpx->hyperv_enlightenments_required =3D false; + /* Value determined at whpx_accel_init */ + whpx->hyperv_enlightenments_enabled =3D false; } =20 static const TypeInfo whpx_accel_type =3D { diff --git a/include/system/whpx-internal.h b/include/system/whpx-internal.h index 480d05fdca..576587ec3b 100644 --- a/include/system/whpx-internal.h +++ b/include/system/whpx-internal.h @@ -45,6 +45,7 @@ struct whpx_state { =20 bool hyperv_enlightenments_allowed; bool hyperv_enlightenments_required; + bool hyperv_enlightenments_enabled; =20 }; =20 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 =3D true; hr =3D whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks, diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index b8f53ca532..b62377cb41 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -2077,14 +2077,47 @@ int whpx_vcpu_run(CPUState *cpu) vcpu->exit_ctx.VpContext.Rip + vcpu->exit_ctx.VpContext.InstructionLength; =20 - reg_values[1].Reg64 =3D vcpu->exit_ctx.CpuidAccess.DefaultResu= ltRax; - reg_values[2].Reg64 =3D vcpu->exit_ctx.CpuidAccess.DefaultResu= ltRcx; - reg_values[3].Reg64 =3D vcpu->exit_ctx.CpuidAccess.DefaultResu= ltRdx; - reg_values[4].Reg64 =3D vcpu->exit_ctx.CpuidAccess.DefaultResu= ltRbx; - - if (vcpu->exit_ctx.CpuidAccess.Rax =3D=3D 1) { - if (cpu_has_x2apic_feature(env)) { - reg_values[2].Reg64 |=3D CPUID_EXT_X2APIC; + if (whpx_is_legacy_os()) { + reg_values[1].Reg64 =3D vcpu->exit_ctx.CpuidAccess.Default= ResultRax; + reg_values[2].Reg64 =3D vcpu->exit_ctx.CpuidAccess.Default= ResultRcx; + reg_values[3].Reg64 =3D vcpu->exit_ctx.CpuidAccess.Default= ResultRdx; + reg_values[4].Reg64 =3D vcpu->exit_ctx.CpuidAccess.Default= ResultRbx; + } else { + cpu_x86_cpuid(env, vcpu->exit_ctx.CpuidAccess.Rax, 0,=20 + (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: + if (cpu_has_x2apic_feature(env)) { + reg_values[2].Reg64 |=3D CPUID_EXT_X2APIC; + } + reg_values[2].Reg64 |=3D CPUID_EXT_HYPERVISOR; + break; + case 0x40000000: + /* report KVM */ + if (x86_cpu->vmware_cpuid_freq) { + reg_values[1].Reg64 =3D 0x40000010; + } else { + reg_values[1].Reg64 =3D 0x40000001; + } + reg_values[4].Reg64 =3D 0x4b4d564b; + reg_values[2].Reg64 =3D 0x564b4d56; + reg_values[3].Reg64 =3D 0x4d; + break; + case 0x40000001: + /* report X2APIC */ + reg_values[1].Reg64 =3D reg_values[4].Reg64 =3D reg_va= lues[2].Reg64 =3D 1 << 15; + break; + case 0x40000010: + if (x86_cpu->vmware_cpuid_freq) { + reg_values[1].Reg64 =3D env->tsc_khz; + reg_values[4].Reg64 =3D env->apic_bus_freq / 1000;= /* Hz to KHz */ + } + break; } } =20 @@ -2259,6 +2292,24 @@ int whpx_init_vcpu(CPUState *cpu) env->apic_bus_freq =3D 1000000000; } =20 + /* When Hyper-V enlightenments are not active, fall back to the KVM on= es */ + if (!whpx->hyperv_enlightenments_enabled) { + UINT32 cpuidExitList[] =3D {1, 0x40000000, 0x40000001, 0x40000010= }; + + hr =3D whp_dispatch.WHvSetPartitionProperty( + whpx->partition, + WHvPartitionPropertyCodeCpuidExitList, + cpuidExitList, + RTL_NUMBER_OF(cpuidExitList) * sizeof(UINT32)); + + if (FAILED(hr)) { + error_report("WHPX: Failed to set partition CpuidExitList hr= =3D%08lx", + hr); + ret =3D -EINVAL; + goto error; + } + } + vcpu->interruptable =3D true; cpu->vcpu_dirty =3D true; cpu->accel =3D vcpu; @@ -2507,6 +2558,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms) } =20 if (!is_legacy_os && whpx->hyperv_enlightenments_allowed) { + whpx->hyperv_enlightenments_enabled =3D true; hr =3D whp_dispatch.WHvSetPartitionProperty( whpx->partition, WHvPartitionPropertyCodeSyntheticProcessorFeaturesBanks, --=20 2.50.1 (Apple Git-155)