From nobody Wed May 1 06:32:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1617288527; cv=none; d=zohomail.com; s=zohoarc; b=FmblkPDulGF3bshJ63xrDsMmpgvpkWgg2oULAgfY0CB3qtAnuif20u8JKs7C1qoWvVyIPBH398EO4PMCmn74iNo+IBeceMupTkFxd4rHc+Ly+ADok1EprjuY/RlFH262Rv/6WHtPLV7qRR3SsdSfG99rw3IlV3Z2Zbk3Z7AGHkk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617288527; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UuqX1vaXGK/rRIbLo5826fQo7T0UET7bCEj3dtAWeOc=; b=CmdNGwyT8BgabRejGLWDXSFeOT1Npe8RCg+gZYmOAiBSPemwsQ0FmJdWFUpUnV/xrmbEvF7YHegrLXwuVFWl7TSFQGm+YSyHRVEki4hTbQIhRkA9K5YS3nUCKtLPnLgN2K8HwEXw2xwM9UHHFmAxDm8vCO012e1Z+jfF+pz4mLM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1617288527632282.29110455747696; Thu, 1 Apr 2021 07:48:47 -0700 (PDT) Received: from localhost ([::1]:42236 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRyco-0004l2-Gf for importer@patchew.org; Thu, 01 Apr 2021 10:48:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35604) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRyaa-00031j-C1 for qemu-devel@nongnu.org; Thu, 01 Apr 2021 10:46:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:43446) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRyaM-0000cu-WC for qemu-devel@nongnu.org; Thu, 01 Apr 2021 10:46:25 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-203-xZzA3Ac2M0ewcgkKFRjlbQ-1; Thu, 01 Apr 2021 10:46:11 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E30A88015B6; Thu, 1 Apr 2021 14:45:51 +0000 (UTC) Received: from localhost.localdomain (unknown [10.35.206.58]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9F96A5C8AA; Thu, 1 Apr 2021 14:45:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1617288372; 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=UuqX1vaXGK/rRIbLo5826fQo7T0UET7bCEj3dtAWeOc=; b=P8L/5yrptSSYHnO4q/6WZ6gHZTLOUGgEnfbW6Q3I/zILGllYEuyHrjv7UE1eMD7l/3hmRj guyE8iwktb0IHkbRnBtINsFRuWE5adT2psXRgeIQ1CgOigt9UYlHl/u0+3ydet7vhHvMDv X/WsD05U7mUlSnV08wQmREsqEq1/EuM= X-MC-Unique: xZzA3Ac2M0ewcgkKFRjlbQ-1 From: Maxim Levitsky To: qemu-devel@nongnu.org Subject: [PATCH 1/2] kvm: update kernel headers for KVM_{GET|SET}_SREGS2 Date: Thu, 1 Apr 2021 17:45:44 +0300 Message-Id: <20210401144545.1031704-2-mlevitsk@redhat.com> In-Reply-To: <20210401144545.1031704-1-mlevitsk@redhat.com> References: <20210401144545.1031704-1-mlevitsk@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 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=216.205.24.124; envelope-from=mlevitsk@redhat.com; helo=us-smtp-delivery-124.mimecast.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, 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_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Cornelia Huck , Eduardo Habkost , kvm@vger.kernel.org, "Michael S. Tsirkin" , Marcelo Tosatti , Richard Henderson , Maxim Levitsky , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Signed-off-by: Maxim Levitsky --- linux-headers/asm-x86/kvm.h | 13 +++++++++++++ linux-headers/linux/kvm.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h index 8e76d3701d..8c604e6bb1 100644 --- a/linux-headers/asm-x86/kvm.h +++ b/linux-headers/asm-x86/kvm.h @@ -158,6 +158,19 @@ struct kvm_sregs { __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64]; }; =20 +struct kvm_sregs2 { + /* out (KVM_GET_SREGS2) / in (KVM_SET_SREGS2) */ + struct kvm_segment cs, ds, es, fs, gs, ss; + struct kvm_segment tr, ldt; + struct kvm_dtable gdt, idt; + __u64 cr0, cr2, cr3, cr4, cr8; + __u64 efer; + __u64 apic_base; + __u64 flags; /* must be zero*/ + __u64 pdptrs[4]; + __u64 padding; +}; + /* for KVM_GET_FPU and KVM_SET_FPU */ struct kvm_fpu { __u8 fpr[8][16]; diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h index 020b62a619..a97f0f2d03 100644 --- a/linux-headers/linux/kvm.h +++ b/linux-headers/linux/kvm.h @@ -1056,6 +1056,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_ENFORCE_PV_FEATURE_CPUID 190 #define KVM_CAP_SYS_HYPERV_CPUID 191 #define KVM_CAP_DIRTY_LOG_RING 192 +#define KVM_CAP_SREGS2 196 =20 #ifdef KVM_CAP_IRQ_ROUTING =20 @@ -1563,6 +1564,10 @@ struct kvm_pv_cmd { /* Available with KVM_CAP_DIRTY_LOG_RING */ #define KVM_RESET_DIRTY_RINGS _IO(KVMIO, 0xc7) =20 + +#define KVM_GET_SREGS2 _IOR(KVMIO, 0xca, struct kvm_sregs2) +#define KVM_SET_SREGS2 _IOW(KVMIO, 0xcb, struct kvm_sregs2) + /* Secure Encrypted Virtualization command */ enum sev_cmd_id { /* Guest initialization commands */ --=20 2.26.2 From nobody Wed May 1 06:32:17 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1617288564; cv=none; d=zohomail.com; s=zohoarc; b=kb7F9usFNSs96fbfcErFWxdrjovVovZLMVxEzbtw3E4DSB3Hz2hiuQuVwWtIpbsKaf4yT68yDX07BMWuboUmh76F9ga/rRx6B9Ez388KGao81FlRVZ0njPdQ00V/1BVcMJSzsRT2vmLpkK6gihZ2rmnPmdd5ToI8QH/lJPOaC3Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617288564; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xgaCLmzhVP8BWkI8VaMq4SbWTSTLRgyQeKwSSE2Q0Jw=; b=gcUAm5wqZCGE5AqNdgn1rj7qmlMnZWmvxoTrAttJvk/HEZ6ni9jgZPn0GU0wHZ/8F4PYtSf7L9jA8wR2gah/rn2OTpJDohm68lkra0rzGWL2DevBspMQSWgR0f8CRxqZ9oXvP0EhyI26xieIXAYMxwhegGb29+PRmSfFfMSxIw8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1617288564475969.9904369569314; Thu, 1 Apr 2021 07:49:24 -0700 (PDT) Received: from localhost ([::1]:45700 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lRydP-00068x-7H for importer@patchew.org; Thu, 01 Apr 2021 10:49:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35624) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRyac-00033z-6q for qemu-devel@nongnu.org; Thu, 01 Apr 2021 10:46:30 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:26204) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lRyaT-0000g4-U7 for qemu-devel@nongnu.org; Thu, 01 Apr 2021 10:46:29 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-476-tq8aRKXoPX24TlKSLyD0VA-1; Thu, 01 Apr 2021 10:46:16 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 942F910055C3; Thu, 1 Apr 2021 14:45:54 +0000 (UTC) Received: from localhost.localdomain (unknown [10.35.206.58]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4F9595C649; Thu, 1 Apr 2021 14:45:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1617288379; 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=xgaCLmzhVP8BWkI8VaMq4SbWTSTLRgyQeKwSSE2Q0Jw=; b=Ml5DXzcu0LQYyC5wbiL2Uapc7GENg0zE7QciP08u7qYJveVz9uVpmsPxIWkzvYFLHABDHl PgC5dOdQISQxoZEIi6iaHF6298x7qXJsDipBqnEeq4G2NiDePmTOV8O+ZOuMCQTFf8Bh1F /BeOaZofk28LscAit924LDkZePBgrt4= X-MC-Unique: tq8aRKXoPX24TlKSLyD0VA-1 From: Maxim Levitsky To: qemu-devel@nongnu.org Subject: [PATCH 2/2] KVM: use KVM_{GET|SET}_SREGS2 when supported by kvm. Date: Thu, 1 Apr 2021 17:45:45 +0300 Message-Id: <20210401144545.1031704-3-mlevitsk@redhat.com> In-Reply-To: <20210401144545.1031704-1-mlevitsk@redhat.com> References: <20210401144545.1031704-1-mlevitsk@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 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=63.128.21.124; envelope-from=mlevitsk@redhat.com; helo=us-smtp-delivery-124.mimecast.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, 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_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Cornelia Huck , Eduardo Habkost , kvm@vger.kernel.org, "Michael S. Tsirkin" , Marcelo Tosatti , Richard Henderson , Maxim Levitsky , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" This allows qemu to make PDPTRs be part of the migration stream and thus not reload them after a migration which is against X86 spec. Signed-off-by: Maxim Levitsky --- accel/kvm/kvm-all.c | 4 ++ include/sysemu/kvm.h | 4 ++ target/i386/cpu.h | 1 + target/i386/kvm/kvm.c | 101 +++++++++++++++++++++++++++++++++++++++++- target/i386/machine.c | 33 ++++++++++++++ 5 files changed, 141 insertions(+), 2 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index b6d9f92f15..082b791b01 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -142,6 +142,7 @@ bool kvm_msi_via_irqfd_allowed; bool kvm_gsi_routing_allowed; bool kvm_gsi_direct_mapping; bool kvm_allowed; +bool kvm_sregs2; bool kvm_readonly_mem_allowed; bool kvm_vm_attributes_allowed; bool kvm_direct_msi_allowed; @@ -2186,6 +2187,9 @@ static int kvm_init(MachineState *ms) kvm_ioeventfd_any_length_allowed =3D (kvm_check_extension(s, KVM_CAP_IOEVENTFD_ANY_LENGTH) > 0); =20 + kvm_sregs2 =3D + (kvm_check_extension(s, KVM_CAP_SREGS2) > 0); + kvm_state =3D s; =20 ret =3D kvm_arch_init(ms, s); diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index a1ab1ee12d..b3d4538c55 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -32,6 +32,7 @@ #ifdef CONFIG_KVM_IS_POSSIBLE =20 extern bool kvm_allowed; +extern bool kvm_sregs2; extern bool kvm_kernel_irqchip; extern bool kvm_split_irqchip; extern bool kvm_async_interrupts_allowed; @@ -139,6 +140,9 @@ extern bool kvm_msi_use_devid; */ #define kvm_gsi_direct_mapping() (kvm_gsi_direct_mapping) =20 + +#define kvm_supports_sregs2() (kvm_sregs2) + /** * kvm_readonly_mem_enabled: * diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 570f916878..4595d47409 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1422,6 +1422,7 @@ typedef struct CPUX86State { SegmentCache idt; /* only base and limit are used */ =20 target_ulong cr[5]; /* NOTE: cr1 is unused */ + uint64_t pdptrs[4]; int32_t a20_mask; =20 BNDReg bnd_regs[4]; diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 7fe9f52710..71769f82ae 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -2514,6 +2514,59 @@ static int kvm_put_sregs(X86CPU *cpu) return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs); } =20 +static int kvm_put_sregs2(X86CPU *cpu) +{ + CPUX86State *env =3D &cpu->env; + struct kvm_sregs2 sregs; + int i; + + if ((env->eflags & VM_MASK)) { + set_v8086_seg(&sregs.cs, &env->segs[R_CS]); + set_v8086_seg(&sregs.ds, &env->segs[R_DS]); + set_v8086_seg(&sregs.es, &env->segs[R_ES]); + set_v8086_seg(&sregs.fs, &env->segs[R_FS]); + set_v8086_seg(&sregs.gs, &env->segs[R_GS]); + set_v8086_seg(&sregs.ss, &env->segs[R_SS]); + } else { + set_seg(&sregs.cs, &env->segs[R_CS]); + set_seg(&sregs.ds, &env->segs[R_DS]); + set_seg(&sregs.es, &env->segs[R_ES]); + set_seg(&sregs.fs, &env->segs[R_FS]); + set_seg(&sregs.gs, &env->segs[R_GS]); + set_seg(&sregs.ss, &env->segs[R_SS]); + } + + set_seg(&sregs.tr, &env->tr); + set_seg(&sregs.ldt, &env->ldt); + + sregs.idt.limit =3D env->idt.limit; + sregs.idt.base =3D env->idt.base; + memset(sregs.idt.padding, 0, sizeof sregs.idt.padding); + sregs.gdt.limit =3D env->gdt.limit; + sregs.gdt.base =3D env->gdt.base; + memset(sregs.gdt.padding, 0, sizeof sregs.gdt.padding); + + sregs.cr0 =3D env->cr[0]; + sregs.cr2 =3D env->cr[2]; + sregs.cr3 =3D env->cr[3]; + sregs.cr4 =3D env->cr[4]; + + sregs.cr8 =3D cpu_get_apic_tpr(cpu->apic_state); + sregs.apic_base =3D cpu_get_apic_base(cpu->apic_state); + + sregs.efer =3D env->efer; + + for (i =3D 0; i < 4; i++) { + sregs.pdptrs[i] =3D env->pdptrs[i]; + } + + sregs.flags =3D 0; + sregs.padding =3D 0; + + return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS2, &sregs); +} + + static void kvm_msr_buf_reset(X86CPU *cpu) { memset(cpu->kvm_msr_buf, 0, MSR_BUF_SIZE); @@ -3175,6 +3228,49 @@ static int kvm_get_sregs(X86CPU *cpu) return 0; } =20 +static int kvm_get_sregs2(X86CPU *cpu) +{ + CPUX86State *env =3D &cpu->env; + struct kvm_sregs2 sregs; + int i, ret; + + ret =3D kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS2, &sregs); + if (ret < 0) { + return ret; + } + + get_seg(&env->segs[R_CS], &sregs.cs); + get_seg(&env->segs[R_DS], &sregs.ds); + get_seg(&env->segs[R_ES], &sregs.es); + get_seg(&env->segs[R_FS], &sregs.fs); + get_seg(&env->segs[R_GS], &sregs.gs); + get_seg(&env->segs[R_SS], &sregs.ss); + + get_seg(&env->tr, &sregs.tr); + get_seg(&env->ldt, &sregs.ldt); + + env->idt.limit =3D sregs.idt.limit; + env->idt.base =3D sregs.idt.base; + env->gdt.limit =3D sregs.gdt.limit; + env->gdt.base =3D sregs.gdt.base; + + env->cr[0] =3D sregs.cr0; + env->cr[2] =3D sregs.cr2; + env->cr[3] =3D sregs.cr3; + env->cr[4] =3D sregs.cr4; + + env->efer =3D sregs.efer; + + for (i =3D 0; i < 4; i++) { + env->pdptrs[i] =3D sregs.pdptrs[i]; + } + + /* changes to apic base and cr8/tpr are read back via kvm_arch_post_ru= n */ + x86_update_hflags(env); + + return 0; +} + static int kvm_get_msrs(X86CPU *cpu) { CPUX86State *env =3D &cpu->env; @@ -4000,7 +4096,8 @@ int kvm_arch_put_registers(CPUState *cpu, int level) assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu)); =20 /* must be before kvm_put_nested_state so that EFER.SVME is set */ - ret =3D kvm_put_sregs(x86_cpu); + ret =3D kvm_supports_sregs2() ? kvm_put_sregs2(x86_cpu) : + kvm_put_sregs(x86_cpu); if (ret < 0) { return ret; } @@ -4105,7 +4202,7 @@ int kvm_arch_get_registers(CPUState *cs) if (ret < 0) { goto out; } - ret =3D kvm_get_sregs(cpu); + ret =3D kvm_supports_sregs2() ? kvm_get_sregs2(cpu) : kvm_get_sregs(cp= u); if (ret < 0) { goto out; } diff --git a/target/i386/machine.c b/target/i386/machine.c index 137604ddb8..c145a1cfb7 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1396,6 +1396,38 @@ static const VMStateDescription vmstate_msr_tsx_ctrl= =3D { } }; =20 +static bool pdptrs_needed(void *opaque) +{ + X86CPU *cpu =3D opaque; + CPUX86State *env =3D &cpu->env; + + if (!kvm_supports_sregs2()) { + return false; + } + + if (!(env->cr[0] & CR0_PG_MASK)) { + return false; + } + + if (env->efer & MSR_EFER_LMA) { + return false; + } + + return env->cr[4] & CR4_PAE_MASK; +} + +static const VMStateDescription vmstate_pdptrs =3D { + .name =3D "cpu/pdptrs", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D pdptrs_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64_ARRAY(env.pdptrs, X86CPU, 4), + VMSTATE_END_OF_LIST() + } +}; + + VMStateDescription vmstate_x86_cpu =3D { .name =3D "cpu", .version_id =3D 12, @@ -1531,6 +1563,7 @@ VMStateDescription vmstate_x86_cpu =3D { &vmstate_nested_state, #endif &vmstate_msr_tsx_ctrl, + &vmstate_pdptrs, NULL } }; --=20 2.26.2