|
|
4841a6 |
From 90a276ed72deab84f3fdd4b57e9ccfc6514934fb Mon Sep 17 00:00:00 2001
|
|
|
4841a6 |
From: Zeng Guang <guang.zeng@intel.com>
|
|
|
4841a6 |
Date: Wed, 16 Feb 2022 22:04:33 -0800
|
|
|
4841a6 |
Subject: [PATCH 11/24] x86: Support XFD and AMX xsave data migration
|
|
|
4841a6 |
|
|
|
4841a6 |
RH-Author: Paul Lai <plai@redhat.com>
|
|
|
4841a6 |
RH-MergeRequest: 176: Enable KVM AMX support
|
|
|
4841a6 |
RH-Commit: [11/13] 4ff6e5544ffdac4e6d2f568f7f63b937502ca6c5
|
|
|
4841a6 |
RH-Bugzilla: 1916415
|
|
|
4841a6 |
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
4841a6 |
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
4841a6 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
4841a6 |
|
|
|
4841a6 |
XFD(eXtended Feature Disable) allows to enable a
|
|
|
4841a6 |
feature on xsave state while preventing specific
|
|
|
4841a6 |
user threads from using the feature.
|
|
|
4841a6 |
|
|
|
4841a6 |
Support save and restore XFD MSRs if CPUID.D.1.EAX[4]
|
|
|
4841a6 |
enumerate to be valid. Likewise migrate the MSRs and
|
|
|
4841a6 |
related xsave state necessarily.
|
|
|
4841a6 |
|
|
|
4841a6 |
Signed-off-by: Zeng Guang <guang.zeng@intel.com>
|
|
|
4841a6 |
Signed-off-by: Wei Wang <wei.w.wang@intel.com>
|
|
|
4841a6 |
Signed-off-by: Yang Zhong <yang.zhong@intel.com>
|
|
|
4841a6 |
Message-Id: <20220217060434.52460-8-yang.zhong@intel.com>
|
|
|
4841a6 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
4841a6 |
(cherry picked from commit cdec2b753b487d9e8aab028231c35d87789ea083)
|
|
|
4841a6 |
Signed-off-by: Paul Lai <plai@redhat.com>
|
|
|
4841a6 |
---
|
|
|
4841a6 |
target/i386/cpu.h | 9 +++++++++
|
|
|
4841a6 |
target/i386/kvm/kvm.c | 18 +++++++++++++++++
|
|
|
4841a6 |
target/i386/machine.c | 46 +++++++++++++++++++++++++++++++++++++++++++
|
|
|
4841a6 |
3 files changed, 73 insertions(+)
|
|
|
4841a6 |
|
|
|
4841a6 |
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
|
4841a6 |
index 14a3501b87..8ab2a4042a 100644
|
|
|
4841a6 |
--- a/target/i386/cpu.h
|
|
|
4841a6 |
+++ b/target/i386/cpu.h
|
|
|
4841a6 |
@@ -505,6 +505,9 @@ typedef enum X86Seg {
|
|
|
4841a6 |
|
|
|
4841a6 |
#define MSR_VM_HSAVE_PA 0xc0010117
|
|
|
4841a6 |
|
|
|
4841a6 |
+#define MSR_IA32_XFD 0x000001c4
|
|
|
4841a6 |
+#define MSR_IA32_XFD_ERR 0x000001c5
|
|
|
4841a6 |
+
|
|
|
4841a6 |
#define MSR_IA32_BNDCFGS 0x00000d90
|
|
|
4841a6 |
#define MSR_IA32_XSS 0x00000da0
|
|
|
4841a6 |
#define MSR_IA32_UMWAIT_CONTROL 0xe1
|
|
|
4841a6 |
@@ -870,6 +873,8 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
|
|
|
4841a6 |
#define CPUID_7_1_EAX_AVX_VNNI (1U << 4)
|
|
|
4841a6 |
/* AVX512 BFloat16 Instruction */
|
|
|
4841a6 |
#define CPUID_7_1_EAX_AVX512_BF16 (1U << 5)
|
|
|
4841a6 |
+/* XFD Extend Feature Disabled */
|
|
|
4841a6 |
+#define CPUID_D_1_EAX_XFD (1U << 4)
|
|
|
4841a6 |
|
|
|
4841a6 |
/* Packets which contain IP payload have LIP values */
|
|
|
4841a6 |
#define CPUID_14_0_ECX_LIP (1U << 31)
|
|
|
4841a6 |
@@ -1610,6 +1615,10 @@ typedef struct CPUX86State {
|
|
|
4841a6 |
uint64_t msr_rtit_cr3_match;
|
|
|
4841a6 |
uint64_t msr_rtit_addrs[MAX_RTIT_ADDRS];
|
|
|
4841a6 |
|
|
|
4841a6 |
+ /* Per-VCPU XFD MSRs */
|
|
|
4841a6 |
+ uint64_t msr_xfd;
|
|
|
4841a6 |
+ uint64_t msr_xfd_err;
|
|
|
4841a6 |
+
|
|
|
4841a6 |
/* exception/interrupt handling */
|
|
|
4841a6 |
int error_code;
|
|
|
4841a6 |
int exception_is_int;
|
|
|
4841a6 |
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
|
|
4841a6 |
index d3d476df27..b1128b0e07 100644
|
|
|
4841a6 |
--- a/target/i386/kvm/kvm.c
|
|
|
4841a6 |
+++ b/target/i386/kvm/kvm.c
|
|
|
4841a6 |
@@ -3219,6 +3219,13 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
|
|
|
4841a6 |
env->msr_ia32_sgxlepubkeyhash[3]);
|
|
|
4841a6 |
}
|
|
|
4841a6 |
|
|
|
4841a6 |
+ if (env->features[FEAT_XSAVE] & CPUID_D_1_EAX_XFD) {
|
|
|
4841a6 |
+ kvm_msr_entry_add(cpu, MSR_IA32_XFD,
|
|
|
4841a6 |
+ env->msr_xfd);
|
|
|
4841a6 |
+ kvm_msr_entry_add(cpu, MSR_IA32_XFD_ERR,
|
|
|
4841a6 |
+ env->msr_xfd_err);
|
|
|
4841a6 |
+ }
|
|
|
4841a6 |
+
|
|
|
4841a6 |
/* Note: MSR_IA32_FEATURE_CONTROL is written separately, see
|
|
|
4841a6 |
* kvm_put_msr_feature_control. */
|
|
|
4841a6 |
}
|
|
|
4841a6 |
@@ -3571,6 +3578,11 @@ static int kvm_get_msrs(X86CPU *cpu)
|
|
|
4841a6 |
kvm_msr_entry_add(cpu, MSR_IA32_SGXLEPUBKEYHASH3, 0);
|
|
|
4841a6 |
}
|
|
|
4841a6 |
|
|
|
4841a6 |
+ if (env->features[FEAT_XSAVE] & CPUID_D_1_EAX_XFD) {
|
|
|
4841a6 |
+ kvm_msr_entry_add(cpu, MSR_IA32_XFD, 0);
|
|
|
4841a6 |
+ kvm_msr_entry_add(cpu, MSR_IA32_XFD_ERR, 0);
|
|
|
4841a6 |
+ }
|
|
|
4841a6 |
+
|
|
|
4841a6 |
ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_MSRS, cpu->kvm_msr_buf);
|
|
|
4841a6 |
if (ret < 0) {
|
|
|
4841a6 |
return ret;
|
|
|
4841a6 |
@@ -3870,6 +3882,12 @@ static int kvm_get_msrs(X86CPU *cpu)
|
|
|
4841a6 |
env->msr_ia32_sgxlepubkeyhash[index - MSR_IA32_SGXLEPUBKEYHASH0] =
|
|
|
4841a6 |
msrs[i].data;
|
|
|
4841a6 |
break;
|
|
|
4841a6 |
+ case MSR_IA32_XFD:
|
|
|
4841a6 |
+ env->msr_xfd = msrs[i].data;
|
|
|
4841a6 |
+ break;
|
|
|
4841a6 |
+ case MSR_IA32_XFD_ERR:
|
|
|
4841a6 |
+ env->msr_xfd_err = msrs[i].data;
|
|
|
4841a6 |
+ break;
|
|
|
4841a6 |
}
|
|
|
4841a6 |
}
|
|
|
4841a6 |
|
|
|
4841a6 |
diff --git a/target/i386/machine.c b/target/i386/machine.c
|
|
|
4841a6 |
index 83c2b91529..3977e9d8f8 100644
|
|
|
4841a6 |
--- a/target/i386/machine.c
|
|
|
4841a6 |
+++ b/target/i386/machine.c
|
|
|
4841a6 |
@@ -1455,6 +1455,48 @@ static const VMStateDescription vmstate_msr_intel_sgx = {
|
|
|
4841a6 |
}
|
|
|
4841a6 |
};
|
|
|
4841a6 |
|
|
|
4841a6 |
+static bool xfd_msrs_needed(void *opaque)
|
|
|
4841a6 |
+{
|
|
|
4841a6 |
+ X86CPU *cpu = opaque;
|
|
|
4841a6 |
+ CPUX86State *env = &cpu->env;
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+ return !!(env->features[FEAT_XSAVE] & CPUID_D_1_EAX_XFD);
|
|
|
4841a6 |
+}
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+static const VMStateDescription vmstate_msr_xfd = {
|
|
|
4841a6 |
+ .name = "cpu/msr_xfd",
|
|
|
4841a6 |
+ .version_id = 1,
|
|
|
4841a6 |
+ .minimum_version_id = 1,
|
|
|
4841a6 |
+ .needed = xfd_msrs_needed,
|
|
|
4841a6 |
+ .fields = (VMStateField[]) {
|
|
|
4841a6 |
+ VMSTATE_UINT64(env.msr_xfd, X86CPU),
|
|
|
4841a6 |
+ VMSTATE_UINT64(env.msr_xfd_err, X86CPU),
|
|
|
4841a6 |
+ VMSTATE_END_OF_LIST()
|
|
|
4841a6 |
+ }
|
|
|
4841a6 |
+};
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+#ifdef TARGET_X86_64
|
|
|
4841a6 |
+static bool amx_xtile_needed(void *opaque)
|
|
|
4841a6 |
+{
|
|
|
4841a6 |
+ X86CPU *cpu = opaque;
|
|
|
4841a6 |
+ CPUX86State *env = &cpu->env;
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+ return !!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE);
|
|
|
4841a6 |
+}
|
|
|
4841a6 |
+
|
|
|
4841a6 |
+static const VMStateDescription vmstate_amx_xtile = {
|
|
|
4841a6 |
+ .name = "cpu/intel_amx_xtile",
|
|
|
4841a6 |
+ .version_id = 1,
|
|
|
4841a6 |
+ .minimum_version_id = 1,
|
|
|
4841a6 |
+ .needed = amx_xtile_needed,
|
|
|
4841a6 |
+ .fields = (VMStateField[]) {
|
|
|
4841a6 |
+ VMSTATE_UINT8_ARRAY(env.xtilecfg, X86CPU, 64),
|
|
|
4841a6 |
+ VMSTATE_UINT8_ARRAY(env.xtiledata, X86CPU, 8192),
|
|
|
4841a6 |
+ VMSTATE_END_OF_LIST()
|
|
|
4841a6 |
+ }
|
|
|
4841a6 |
+};
|
|
|
4841a6 |
+#endif
|
|
|
4841a6 |
+
|
|
|
4841a6 |
const VMStateDescription vmstate_x86_cpu = {
|
|
|
4841a6 |
.name = "cpu",
|
|
|
4841a6 |
.version_id = 12,
|
|
|
4841a6 |
@@ -1593,6 +1635,10 @@ const VMStateDescription vmstate_x86_cpu = {
|
|
|
4841a6 |
#endif
|
|
|
4841a6 |
&vmstate_msr_tsx_ctrl,
|
|
|
4841a6 |
&vmstate_msr_intel_sgx,
|
|
|
4841a6 |
+ &vmstate_msr_xfd,
|
|
|
4841a6 |
+#ifdef TARGET_X86_64
|
|
|
4841a6 |
+ &vmstate_amx_xtile,
|
|
|
4841a6 |
+#endif
|
|
|
4841a6 |
NULL
|
|
|
4841a6 |
}
|
|
|
4841a6 |
};
|
|
|
4841a6 |
--
|
|
|
4841a6 |
2.35.3
|
|
|
4841a6 |
|