From nobody Sun Apr 12 00:56:48 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1772441496; cv=none; d=zohomail.com; s=zohoarc; b=Fy5JLNjZWsvryo1CcQdBaX+eMzjJVMsezUU6DE6+i2mrRM8fde+sEofIsjbiFDBa/nCEIXe6gm2MHQrRQMHhBvW8wzfiDccuWmChkUhndQrsK8EFJDUyuJk5yWbx0g6W16wI1O9+J/nHkZ+k1zb1CmKV98jIWuIraCpIM4J2RuY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1772441496; 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=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=n/5Z58G+U0iTUz9Br2hqiacYF/TACTIFH2o21Oabh6ycjxTGlEHhDQcIj/TMk9LyZ1KRKncy1yzWDNo808Rw593iWk58h+IOtNKHclvsvy4XWA7834eMIaOSfVzZWxhIkdZCrfUklrpqZ9XdmvmtSaL3ymtURhHBcVMZg2r/ctA= 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1772441496697894.2584531745094; Mon, 2 Mar 2026 00:51:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vwytp-0002lI-5O; Mon, 02 Mar 2026 03:45:09 -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 1vwytN-0001pe-EU for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:48 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vwytJ-0001aH-J7 for qemu-devel@nongnu.org; Mon, 02 Mar 2026 03:44:40 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-21-uMud_eDiMnqAN_3mmg3EeA-1; Mon, 02 Mar 2026 03:44:29 -0500 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-4836ff58111so42862925e9.1 for ; Mon, 02 Mar 2026 00:44:29 -0800 (PST) Received: from [192.168.10.48] ([151.95.144.138]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-483c3b4410bsm283021895e9.6.2026.03.02.00.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Mar 2026 00:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772441076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=ODLkCdHTlAclPUapwhNJZG3sHMyuqVosoM4E/LAX05vcq00KMy22S62DDN8UA2obifkAhJ 5e9EA/90h5PESsFItS+5vegmYYueZULgJ9FyTE6GVoUHP7W4tQngLHp8VMIyj2zkQqj+mA tkTsSPd0Td56/ee2Wk84mnfC35t6ou8= X-MC-Unique: uMud_eDiMnqAN_3mmg3EeA-1 X-Mimecast-MFC-AGG-ID: uMud_eDiMnqAN_3mmg3EeA_1772441068 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1772441067; x=1773045867; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=GZw/BcbNxpue2jC4Yvlz2s+D8d8gMaPadJTY8xEeIZBUIalb9OEu3W1uZqBc6CVRy0 HCvYIH7Ky5NLponUnVuKVJ5Ar1vvyX2PGNQJ5FLkzOdgj7TWBe+aFV7PC5LbBqLhWwK1 xFQiREBkojSdLWQk2wCb6dS56Oq1mXo3LraUT0/zvirhVBggfwx9F77ARVZMF9xv3w7t 2jtHTNchOn8/+JtDz35Y/GZq7UlSoeT/4uI/wC+w4ApPj4Bfv6Hf1RMKrJ5mXKAHpjFo lJx6OJbCFBix66vqkqAgM5ojxwSjTB5axZOwwe346UNUmGc10gsmfDceFf+MQYWy/0eN l2kA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772441067; x=1773045867; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gjvR+OkxZ7HxwHV/I2EnmhZdobN9zycIS9gtCz8oxR4=; b=fsBcCNoqtZ9WQvFQ7o55FemH/oiEKYuqVVD29R0wSqyLQrQyEpWowNpHLVNtE+v88r 5LYVvz8q8czM2ZKDbFI8VSqrRQeIS5ZnUYKKT2XTKT7Fw3muB4msjMlBe8rdEs/b1vnl ObOWIW0wPCO+cRwpQW4wtyI956Rgv22uBmdE3zXia+UAeG3Rel2maeQrMBKTbPwWdle3 AH/Lv73wwEm7KS2XTkv8cC3tDmChEy8roG9PN3ilbfBpLqGClQ4qc0E9H39PRd03WN7t bY1Yr4orxplJgECkU4mXU9s1PWCwd5KXahT4+5fp1iZBTMjgeve/7VYudlB7FNYwJe3Y us9A== X-Gm-Message-State: AOJu0Yy8z4tGHKxu8PAoeI3ps7O2r/ZWAZMKt5d/Q24wPQxI8WuGuR1X eJOUMV99dzXgVHZUDgmmFTGZ0oKyAWlmjMfyzyNfUsMraG/eCUvElaBShkQMIRJrYaohdyXs5Tz 9mYhwH+gBVoNan93P0vMM9XfVtWDP8h4zZugJfPm5WHLmIFeCn8ftyyJ4E04lKES6z3JhIASNPL AIXP6VFgB8JPb6upruCEA8hTBBPiq61BP96zk1himi X-Gm-Gg: ATEYQzyzc+DCm8SvS8pkQ3mBYEEICoRACBJScTXMsuNex4A10A4IDQ7hzark3NtwR9Y RF1Hck3v2t8nIzkKRqayGz/AAFrI3FZ96VwyVMvF8YdKlRG0aCMiiIahZuiRYhEAD935GdQjxRw QLuuejCdBms2eQuS5zOKLB87FykRL4n9VihgDYDiEoTd0l2+zeQHH3AadNM5hHrtlRKJpTwxo7h ptXPv2tQ8B9svXPt60JQ50znL1UJvRfLzJocDtOzmU/iXqsWVEONqqB/YJmdT7rcX+tei0U23wG LPQsf7MEn/B3X7MBzxLWhLAI/KKzSXrQbZOBPavjFP+tEP+IwodCm089pUxk0MUam1ZjOaK+wlF OLLK/1MDBsYFNnqVlvkOQfEnwZ43WXUfkK8rZGluRTLuS/MlBGuWoQOAXykYdg+cXl/DS/CyeKf NTjzAKwi1dwxJEEXkpoxYAf+iz6jU= X-Received: by 2002:a05:600c:630d:b0:483:7903:c3b1 with SMTP id 5b1f17b1804b1-483c9bedb42mr162623955e9.20.1772441067316; Mon, 02 Mar 2026 00:44:27 -0800 (PST) X-Received: by 2002:a05:600c:630d:b0:483:7903:c3b1 with SMTP id 5b1f17b1804b1-483c9bedb42mr162623575e9.20.1772441066769; Mon, 02 Mar 2026 00:44:26 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Mohamed Mediouni , Bernhard Beschow Subject: [PULL 017/102] whpx: i386: saving/restoring less state for WHPX_LEVEL_FAST_RUNTIME_STATE Date: Mon, 2 Mar 2026 09:42:12 +0100 Message-ID: <20260302084338.473368-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260302084338.473368-1-pbonzini@redhat.com> References: <20260302084338.473368-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -8 X-Spam_score: -0.9 X-Spam_bar: / X-Spam_report: (-0.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.012, RCVD_IN_VALIDITY_RPBL_BLOCKED=1.188, 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 @redhat.com) X-ZM-MESSAGEID: 1772441497334158500 Content-Type: text/plain; charset="utf-8" From: Mohamed Mediouni Optimise vmexits by save/restoring less state in those cases instead of the= full state. Signed-off-by: Mohamed Mediouni Reviewed-by: Bernhard Beschow Link: https://lore.kernel.org/r/20260223233950.96076-17-mohamed@unpredictab= le.fr Signed-off-by: Paolo Bonzini --- target/i386/whpx/whpx-all.c | 196 +++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 95 deletions(-) diff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c index c09d9affefa..ab583e922d4 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); + if (level > WHPX_LEVEL_FAST_RUNTIME_STATE) { + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->ldt, 0, 0); =20 - /* 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; + assert(idx =3D=3D WHvX64RegisterTr); + vcxt.values[idx++].Segment =3D whpx_seg_q2h(&env->tr, 0, 0); =20 - /* 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); - */ - } + 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; =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; + 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; =20 - /* 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; + /* 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; =20 - /* MSRs */ - assert(whpx_register_names[idx] =3D=3D WHvX64RegisterEfer); - vcxt.values[idx++].Reg64 =3D env->efer; + /* 8 Debug Registers - Skipped */ + + /* + * 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); + */ + } + + /* 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.53.0