From nobody Sun Apr 12 04:21:24 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=1771836151; cv=none; d=zohomail.com; s=zohoarc; b=U5pCLyeS2l8/6k5pi2mGsza2BfwCpUeXBbmeHMHMHlrEAf00IA2CX0jdFDrGOnel9TjMUxbxpjhbsTVLrjOiTpQstLZ3WdOHUvQLrtpMGIDhE9U1wBkeAPn7ErtFWdlmKIugu7+0h82h2s/7a85ysir9PySpnSg1PV5qCW2WBuQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771836151; 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=WRWOr4bOqspFilOnrREUflTllQ5A/6LuLnTDO613usU=; b=AWhm4OF6Wm4UWabg6opgtQn21b3r7yoBYtdWn527zhC6Kc0FMfPQG0nY2Ug+vgBFEH2nGO6ZeOAAOQefeDC2wBw7mWlHdE7fDzfNC/FcA42YrbD5m/+Dz4eTpr1F6jxL0uncYwH0eSrTaVtgiD1zMUiqmga70cZMa7TyPBxF6eM= 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 1771836151326244.75768846316873; Mon, 23 Feb 2026 00:42:31 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vuRSX-0000nN-U8; Mon, 23 Feb 2026 03:38:29 -0500 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 1vuRSS-0000UL-Pw for qemu-devel@nongnu.org; Mon, 23 Feb 2026 03:38:24 -0500 Received: from p-east2-cluster3-host9-snip4-7.eps.apple.com ([57.103.77.138] helo=outbound.st.icloud.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vuRSP-0002Gl-4p for qemu-devel@nongnu.org; Mon, 23 Feb 2026 03:38:23 -0500 Received: from outbound.st.icloud.com (unknown [127.0.0.2]) by p00-icloudmta-asmtp-us-east-1a-60-percent-12 (Postfix) with ESMTPS id B93071800168; Mon, 23 Feb 2026 08:38:17 +0000 (UTC) Received: from localhost.localdomain (unknown [17.42.251.67]) by p00-icloudmta-asmtp-us-east-1a-60-percent-12 (Postfix) with ESMTPSA id 2B49B1800215; Mon, 23 Feb 2026 08:38:15 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unpredictable.fr; s=sig1; t=1771835900; x=1774427900; bh=WRWOr4bOqspFilOnrREUflTllQ5A/6LuLnTDO613usU=; h=From:To:Subject:Date:Message-ID:MIME-Version:x-icloud-hme; b=AAv/ga93I0C5T51RkaV36r1XV7GyXhlhBv8An6EUnNXDWYUJ6m320z6lCvuOxbl2zCxEvF5n65rrHhYxATvEpcRj5ZzljCclDetk6wmA82SBOjW8QdKkr5RaJtgPJBLx5DVJSnw0xnRZm6D5h41F1muJ9Q03FzU4D7sb3DlSboJ3YHSKiw1Mam7eyoI0ZP282EAZFy5F299uGO5CHk3v4zgP54fPo7D4Gu3v8ABPS4sfynpNzSoV+sw2C0OGklyS/UMMQ6Xazr+zj4SIi1fTn4rpk2tDGu4AsnTXJjXhq7klvHOGqvxdDOqpkvtnK/nZ5IuI0Vi34i8d4etcNzghcg== mail-alias-created-date: 1752046281608 From: Mohamed Mediouni To: qemu-devel@nongnu.org Cc: Cameron Esfahani , Magnus Kulke , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Paolo Bonzini , Phil Dennis-Jordan , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Wei Liu , Roman Bolshakov , Magnus Kulke , Peter Maydell , Bernhard Beschow , qemu-arm@nongnu.org, Mohamed Mediouni , Pedro Barbuda , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Zhao Liu Subject: [PATCH v5 16/27] whpx: i386: saving/restoring less state for WHPX_LEVEL_FAST_RUNTIME_STATE Date: Mon, 23 Feb 2026 09:37:22 +0100 Message-ID: <20260223083734.48533-17-mohamed@unpredictable.fr> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260223083734.48533-1-mohamed@unpredictable.fr> References: <20260223083734.48533-1-mohamed@unpredictable.fr> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Authority-Info-Out: v=2.4 cv=Oa2VzxTY c=1 sm=1 tr=0 ts=699c11fa cx=c_apl:c_apl_out:c_pps a=YrL12D//S6tul8v/L+6tKg==:117 a=YrL12D//S6tul8v/L+6tKg==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=pGLkceISAAAA:8 a=d1mOUhxfU30B8FCplPMA:9 X-Proofpoint-ORIG-GUID: J3OhY3FvfJi5ajNKNVWstzkshGJGi9BT X-Proofpoint-GUID: J3OhY3FvfJi5ajNKNVWstzkshGJGi9BT X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjIzMDA3NiBTYWx0ZWRfXxIXopqGLFimb qWzSqpEvUHxiyK8BtumhhIG8prDZGzthNejmeijL29FZhGs0GuaiodHhr3vYdh1TDaVUJNpH5eR UBddkXwJVcbbuFjFDroxa67XAfD02l6diJnio5dWSdl3nCu4W2j3dDd99wozm0uM7RWQRmaKZQj sJ71JpvIy2vHDO3RFhSJ+a+MaKkD6eqXROZQ6G7LwJDjmPdlGbtyL272jxLcqAJBCxuEbDgMwk+ cLm5UaPi11BRCcfWDFQD3E274wLp0e2MvyhopdB4osRNDdgYe1620CQf+ScEmnHu+Jcbs25iv8f WPHlWTCYX0WCe6cuK4pesiRZ1Jyz1HKG0gKDzfncUMLFWkA0c3L6mWMVWhkTJM= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-23_01,2026-02-20_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 bulkscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 clxscore=1030 mlxlogscore=999 spamscore=0 mlxscore=0 malwarescore=0 classifier=spam authscore=0 adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602230076 X-JNJ: AAAAAAABm83HsolHTZ31+Naq+YtYzpQmXwxHjdBzOjMR0ZWOTXFsFtPVuo6jk03lVFnJwx9mlCT296BYzQZeuXtVgV9KHUwqoISy3KVSRV+E+vBry5XFxDu/mK6w7xI0RU6E3574Vooyj0B3OeB4VhAqaLy9OcxOrA5GgsO2mDV8t3AAHH+bMFbBib6dT8+i4uOrggzcITH6Xdd3b9rSu1CC4YtvPo+OzHgfgkTR/QRbNMKqplIkrvWSww2EQ1q+VGLFDUkpsob09tBjgXgi1ORq8Rd6fAi66mSv7J8qJOJJxi4/3vnHHSMPnx2x46GJf9E36Fp3cMW+3irupuX02kf2FugSMio37QhR52xqM9Ow0aQ91KP9hGWD5988K8gk+CpAcwJYhRz0GUf/7yHEhDn5rGse7OUgoSKD/bnutWsXnusSs8CDD0hJmLmuszvJ50HCLtAVkZZemNlSKzNHDjsZ+vJFqHY+QKSFuwbLJlfUtOHxLJy6D90uZ7sI90S/aGa+K4WPd5dC8Yv8cGl2/1bmuhasj7HHx+3AaGmsbcwG+Gjtn9pDJbQji3ZpitP1HQ/nJNOeD3SwvCI3V5DxDUZtl67KkdmwT5FFyCq4g5adfz5xdsM3t+oHDJer5xhukXfcP0zYLIOeRHGXEM++yaGCdMZXH55pvElELFaBA7oVu7wO9k47WspB9Yd4CHBErN2XaQCzahWW7CAxHRq9FdmBLrPs5da36/ufzqoLdkekRHP9BjJ9B1vrWAaqJvsk1oZw5gNVUZLH5/bHRRVD16qZFSuHJCzRp6YznE96NxuJmVdOJRnyyg6JuOQ+tKQ/3ohQQHt0qLZNahVF 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.77.138; envelope-from=mohamed@unpredictable.fr; helo=outbound.st.icloud.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 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.798, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.79, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no 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: 1771836152483158500 Content-Type: text/plain; charset="utf-8" Optimise vmexits by save/restoring less state in those cases instead of the= full state. Signed-off-by: Mohamed Mediouni Reviewed-by: Bernhard Beschow --- target/i386/whpx/whpx-all.c | 202 +++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 98 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index c09d9affef..ab583e922d 100644 --- a/target/i386/whpx/whpx-all.c +++ b/target/i386/whpx/whpx-all.c @@ -422,118 +422,124 @@ void whpx_set_registers(CPUState *cpu, WHPXStateLev= el level) } =20 assert(idx =3D=3D WHvX64RegisterLdtr); - vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->ldt, 0, 0); - - assert(idx =3D=3D WHvX64RegisterTr); - vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->tr, 0, 0); - - assert(idx =3D=3D WHvX64RegisterIdtr); - vcxt.values[idx].Table.Base =3D env->idt.base; - vcxt.values[idx].Table.Limit =3D env->idt.limit; - idx +=3D 1; - - assert(idx =3D=3D WHvX64RegisterGdtr); - vcxt.values[idx].Table.Base =3D env->gdt.base; - vcxt.values[idx].Table.Limit =3D env->gdt.limit; - idx +=3D 1; - - /* CR0, 2, 3, 4, 8 */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr0); - vcxt.values[idx++].Reg64 =3D env->cr[0]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr2); - vcxt.values[idx++].Reg64 =3D env->cr[2]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr3); - vcxt.values[idx++].Reg64 =3D env->cr[3]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr4); - vcxt.values[idx++].Reg64 =3D env->cr[4]; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); - vcxt.values[idx++].Reg64 =3D vcpu->tpr; - - /* 8 Debug Registers - Skipped */ - /* - * Extended control registers needs to be handled separately depending - * on whether xsave is supported/enabled or not. + * Skip those registers for synchronisation after MMIO accesses + * as they're not going to be modified in that case. */ - whpx_set_xcrs(cpu); - - /* 16 XMM registers */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmm0); - idx_next =3D idx + 16; - for (i =3D 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i +=3D 1, id= x +=3D 1) { - vcxt.values[idx].Reg128.Low64 =3D env->xmm_regs[i].ZMM_Q(0); - vcxt.values[idx].Reg128.High64 =3D env->xmm_regs[i].ZMM_Q(1); - } - idx =3D idx_next; - - /* 8 FP registers */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpMmx0); - for (i =3D 0; i < 8; i +=3D 1, idx +=3D 1) { - vcxt.values[idx].Fp.AsUINT128.Low64 =3D env->fpregs[i].mmx.MMX_Q(0= ); - /* vcxt.values[idx].Fp.AsUINT128.High64 =3D - env->fpregs[i].mmx.MMX_Q(1); - */ - } + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE) { + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->ldt, 0, 0); + + assert(idx =3D=3D WHvX64RegisterTr); + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->tr, 0, 0); + + assert(idx =3D=3D WHvX64RegisterIdtr); + vcxt.values[idx].Table.Base =3D env->idt.base; + vcxt.values[idx].Table.Limit =3D env->idt.limit; + idx +=3D 1; + + assert(idx =3D=3D WHvX64RegisterGdtr); + vcxt.values[idx].Table.Base =3D env->gdt.base; + vcxt.values[idx].Table.Limit =3D env->gdt.limit; + idx +=3D 1; + + /* CR0, 2, 3, 4, 8 */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr0); + vcxt.values[idx++].Reg64 =3D env->cr[0]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr2); + vcxt.values[idx++].Reg64 =3D env->cr[2]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr3); + vcxt.values[idx++].Reg64 =3D env->cr[3]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr4); + vcxt.values[idx++].Reg64 =3D env->cr[4]; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); + vcxt.values[idx++].Reg64 =3D vcpu->tpr; + + /* 8 Debug Registers - Skipped */ =20 - /* FP control status register */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpControlStatus); - vcxt.values[idx].FpControlStatus.FpControl =3D env->fpuc; - vcxt.values[idx].FpControlStatus.FpStatus =3D - (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; - vcxt.values[idx].FpControlStatus.FpTag =3D 0; - for (i =3D 0; i < 8; ++i) { - vcxt.values[idx].FpControlStatus.FpTag |=3D (!env->fptags[i]) << i; - } - vcxt.values[idx].FpControlStatus.Reserved =3D 0; - vcxt.values[idx].FpControlStatus.LastFpOp =3D env->fpop; - vcxt.values[idx].FpControlStatus.LastFpRip =3D env->fpip; - idx +=3D 1; - - /* XMM control status register */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmmControlStatus); - vcxt.values[idx].XmmControlStatus.LastFpRdp =3D 0; - vcxt.values[idx].XmmControlStatus.XmmStatusControl =3D env->mxcsr; - vcxt.values[idx].XmmControlStatus.XmmStatusControlMask =3D 0x0000ffff; - idx +=3D 1; + /* + * Extended control registers needs to be handled separately depen= ding + * on whether xsave is supported/enabled or not. + */ + whpx_set_xcrs(cpu); + + /* 16 XMM registers */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmm0); + idx_next =3D idx + 16; + for (i =3D 0; i < sizeof(env->xmm_regs) / sizeof(ZMMReg); i +=3D 1= , idx +=3D 1) { + vcxt.values[idx].Reg128.Low64 =3D env->xmm_regs[i].ZMM_Q(0); + vcxt.values[idx].Reg128.High64 =3D env->xmm_regs[i].ZMM_Q(1); + } + idx =3D idx_next; + + /* 8 FP registers */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpMmx0); + for (i =3D 0; i < 8; i +=3D 1, idx +=3D 1) { + vcxt.values[idx].Fp.AsUINT128.Low64 =3D env->fpregs[i].mmx.MMX= _Q(0); + /* vcxt.values[idx].Fp.AsUINT128.High64 =3D + env->fpregs[i].mmx.MMX_Q(1); + */ + } =20 - /* MSRs */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterEfer); - vcxt.values[idx++].Reg64 =3D env->efer; + /* FP control status register */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterFpControlStat= us); + vcxt.values[idx].FpControlStatus.FpControl =3D env->fpuc; + vcxt.values[idx].FpControlStatus.FpStatus =3D + (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; + vcxt.values[idx].FpControlStatus.FpTag =3D 0; + for (i =3D 0; i < 8; ++i) { + vcxt.values[idx].FpControlStatus.FpTag |=3D (!env->fptags[i]) = << i; + } + vcxt.values[idx].FpControlStatus.Reserved =3D 0; + vcxt.values[idx].FpControlStatus.LastFpOp =3D env->fpop; + vcxt.values[idx].FpControlStatus.LastFpRip =3D env->fpip; + idx +=3D 1; + + /* XMM control status register */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterXmmControlSta= tus); + vcxt.values[idx].XmmControlStatus.LastFpRdp =3D 0; + vcxt.values[idx].XmmControlStatus.XmmStatusControl =3D env->mxcsr; + vcxt.values[idx].XmmControlStatus.XmmStatusControlMask =3D 0x0000f= fff; + idx +=3D 1; + + /* MSRs */ + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterEfer); + vcxt.values[idx++].Reg64 =3D env->efer; #ifdef TARGET_X86_64 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterKernelGsBase); - vcxt.values[idx++].Reg64 =3D env->kernelgsbase; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterKernelGsBase); + vcxt.values[idx++].Reg64 =3D env->kernelgsbase; #endif =20 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterApicBase); - vcxt.values[idx++].Reg64 =3D vcpu->apic_base; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterApicBase); + vcxt.values[idx++].Reg64 =3D vcpu->apic_base; =20 - /* WHvX64RegisterPat - Skipped */ + /* WHvX64RegisterPat - Skipped */ =20 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterCs); - vcxt.values[idx++].Reg64 =3D env->sysenter_cs; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEip); - vcxt.values[idx++].Reg64 =3D env->sysenter_eip; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEsp); - vcxt.values[idx++].Reg64 =3D env->sysenter_esp; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterStar); - vcxt.values[idx++].Reg64 =3D env->star; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterCs); + vcxt.values[idx++].Reg64 =3D env->sysenter_cs; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEip); + vcxt.values[idx++].Reg64 =3D env->sysenter_eip; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSysenterEsp); + vcxt.values[idx++].Reg64 =3D env->sysenter_esp; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterStar); + vcxt.values[idx++].Reg64 =3D env->star; #ifdef TARGET_X86_64 - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterLstar); - vcxt.values[idx++].Reg64 =3D env->lstar; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCstar); - vcxt.values[idx++].Reg64 =3D env->cstar; - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSfmask); - vcxt.values[idx++].Reg64 =3D env->fmask; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterLstar); + vcxt.values[idx++].Reg64 =3D env->lstar; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCstar); + vcxt.values[idx++].Reg64 =3D env->cstar; + assert(whpx_register_names[idx] =3D=3D WHvX64RegisterSfmask); + vcxt.values[idx++].Reg64 =3D env->fmask; #endif =20 - /* Interrupt / Event Registers - Skipped */ + /* Interrupt / Event Registers - Skipped */ =20 - assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); + assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); + } =20 hr =3D whp_dispatch.WHvSetVirtualProcessorRegisters( whpx->partition, cpu->cpu_index, whpx_register_names, - RTL_NUMBER_OF(whpx_register_names), + idx, &vcxt.values[0]); =20 if (FAILED(hr)) { @@ -613,7 +619,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) hr); } =20 - if (whpx_irqchip_in_kernel()) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && whpx_irqchip_in_kernel())= { /* * Fetch the TPR value from the emulated APIC. It may get overwrit= ten * below with the value from CR8 returned by @@ -670,7 +676,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) env->cr[4] =3D vcxt.values[idx++].Reg64; assert(whpx_register_names[idx] =3D=3D WHvX64RegisterCr8); tpr =3D vcxt.values[idx++].Reg64; - if (tpr !=3D vcpu->tpr) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && tpr !=3D vcpu->tpr) { vcpu->tpr =3D tpr; cpu_set_apic_tpr(x86_cpu->apic_state, whpx_cr8_to_apic_tpr(tpr)); } @@ -756,7 +762,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel l= evel) =20 assert(idx =3D=3D RTL_NUMBER_OF(whpx_register_names)); =20 - if (whpx_irqchip_in_kernel()) { + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE && whpx_irqchip_in_kernel())= { whpx_apic_get(x86_cpu->apic_state); } =20 --=20 2.50.1 (Apple Git-155)