mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/ehabkost/tags/x86-next-pull-request' into staging
x86 queue, 2018-10-30 * MSR-based feature support for MSR_IA32_ARCH_CAPABILITIES bits (Robert Hoo) * Cascadelake-Server CPU model (Tao Xu) * Add PKU on Skylake-Server CPU model (Tao Xu) * Correct cpu_x86_cpuid(0xd) (Sebastian Andrzej Siewior) * Remove dead code (Peter Maydell) # gpg: Signature made Wed 31 Oct 2018 14:05:25 GMT # gpg: using RSA key 2807936F984DC5A6 # gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>" # Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF D1AA 2807 936F 984D C5A6 * remotes/ehabkost/tags/x86-next-pull-request: i386: Add PKU on Skylake-Server CPU model i386: Add new model of Cascadelake-Server x86: define a new MSR based feature word -- FEATURE_WORDS_ARCH_CAPABILITIES x86: Data structure changes to support MSR based features kvm: Add support to KVM_GET_MSR_FEATURE_INDEX_LIST and KVM_GET_MSRS system ioctl target/i386: Remove #ifdeffed-out icebp debugging hack i386: correct cpu_x86_cpuid(0xd) Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -300,7 +300,15 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
||||
.driver = TYPE_X86_CPU,\
|
||||
.property = "x-hv-synic-kvm-only",\
|
||||
.value = "on",\
|
||||
}
|
||||
},{\
|
||||
.driver = "Skylake-Server" "-" TYPE_X86_CPU,\
|
||||
.property = "pku",\
|
||||
.value = "off",\
|
||||
},{\
|
||||
.driver = "Skylake-Server-IBRS" "-" TYPE_X86_CPU,\
|
||||
.property = "pku",\
|
||||
.value = "off",\
|
||||
},
|
||||
|
||||
#define PC_COMPAT_2_12 \
|
||||
HW_COMPAT_2_12 \
|
||||
|
||||
@@ -463,6 +463,8 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension);
|
||||
|
||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
|
||||
uint32_t index, int reg);
|
||||
uint32_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index);
|
||||
|
||||
|
||||
void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
|
||||
|
||||
|
||||
+223
-56
File diff suppressed because it is too large
Load Diff
@@ -502,6 +502,7 @@ typedef enum FeatureWord {
|
||||
FEAT_6_EAX, /* CPUID[6].EAX */
|
||||
FEAT_XSAVE_COMP_LO, /* CPUID[EAX=0xd,ECX=0].EAX */
|
||||
FEAT_XSAVE_COMP_HI, /* CPUID[EAX=0xd,ECX=0].EDX */
|
||||
FEAT_ARCH_CAPABILITIES,
|
||||
FEATURE_WORDS,
|
||||
} FeatureWord;
|
||||
|
||||
@@ -730,6 +731,13 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS];
|
||||
#define CPUID_TOPOLOGY_LEVEL_SMT (1U << 8)
|
||||
#define CPUID_TOPOLOGY_LEVEL_CORE (2U << 8)
|
||||
|
||||
/* MSR Feature Bits */
|
||||
#define MSR_ARCH_CAP_RDCL_NO (1U << 0)
|
||||
#define MSR_ARCH_CAP_IBRS_ALL (1U << 1)
|
||||
#define MSR_ARCH_CAP_RSBA (1U << 2)
|
||||
#define MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY (1U << 3)
|
||||
#define MSR_ARCH_CAP_SSB_NO (1U << 4)
|
||||
|
||||
#ifndef HYPERV_SPINLOCK_NEVER_RETRY
|
||||
#define HYPERV_SPINLOCK_NEVER_RETRY 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
@@ -107,6 +107,7 @@ static int has_pit_state2;
|
||||
static bool has_msr_mcg_ext_ctl;
|
||||
|
||||
static struct kvm_cpuid2 *cpuid_cache;
|
||||
static struct kvm_msr_list *kvm_feature_msrs;
|
||||
|
||||
int kvm_has_pit_state2(void)
|
||||
{
|
||||
@@ -420,6 +421,42 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint32_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index)
|
||||
{
|
||||
struct {
|
||||
struct kvm_msrs info;
|
||||
struct kvm_msr_entry entries[1];
|
||||
} msr_data;
|
||||
uint32_t ret;
|
||||
|
||||
if (kvm_feature_msrs == NULL) { /* Host doesn't support feature MSRs */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check if requested MSR is supported feature MSR */
|
||||
int i;
|
||||
for (i = 0; i < kvm_feature_msrs->nmsrs; i++)
|
||||
if (kvm_feature_msrs->indices[i] == index) {
|
||||
break;
|
||||
}
|
||||
if (i == kvm_feature_msrs->nmsrs) {
|
||||
return 0; /* if the feature MSR is not supported, simply return 0 */
|
||||
}
|
||||
|
||||
msr_data.info.nmsrs = 1;
|
||||
msr_data.entries[0].index = index;
|
||||
|
||||
ret = kvm_ioctl(s, KVM_GET_MSRS, &msr_data);
|
||||
if (ret != 1) {
|
||||
error_report("KVM get MSR (index=0x%x) feature failed, %s",
|
||||
index, strerror(-ret));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return msr_data.entries[0].data;
|
||||
}
|
||||
|
||||
|
||||
typedef struct HWPoisonPage {
|
||||
ram_addr_t ram_addr;
|
||||
QLIST_ENTRY(HWPoisonPage) list;
|
||||
@@ -1286,6 +1323,47 @@ void kvm_arch_do_init_vcpu(X86CPU *cpu)
|
||||
}
|
||||
}
|
||||
|
||||
static int kvm_get_supported_feature_msrs(KVMState *s)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (kvm_feature_msrs != NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!kvm_check_extension(s, KVM_CAP_GET_MSR_FEATURES)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct kvm_msr_list msr_list;
|
||||
|
||||
msr_list.nmsrs = 0;
|
||||
ret = kvm_ioctl(s, KVM_GET_MSR_FEATURE_INDEX_LIST, &msr_list);
|
||||
if (ret < 0 && ret != -E2BIG) {
|
||||
error_report("Fetch KVM feature MSR list failed: %s",
|
||||
strerror(-ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
assert(msr_list.nmsrs > 0);
|
||||
kvm_feature_msrs = (struct kvm_msr_list *) \
|
||||
g_malloc0(sizeof(msr_list) +
|
||||
msr_list.nmsrs * sizeof(msr_list.indices[0]));
|
||||
|
||||
kvm_feature_msrs->nmsrs = msr_list.nmsrs;
|
||||
ret = kvm_ioctl(s, KVM_GET_MSR_FEATURE_INDEX_LIST, kvm_feature_msrs);
|
||||
|
||||
if (ret < 0) {
|
||||
error_report("Fetch KVM feature MSR list failed: %s",
|
||||
strerror(-ret));
|
||||
g_free(kvm_feature_msrs);
|
||||
kvm_feature_msrs = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_get_supported_msrs(KVMState *s)
|
||||
{
|
||||
static int kvm_supported_msrs;
|
||||
@@ -1439,6 +1517,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||
return ret;
|
||||
}
|
||||
|
||||
kvm_get_supported_feature_msrs(s);
|
||||
|
||||
uname(&utsname);
|
||||
lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
|
||||
|
||||
@@ -1895,6 +1975,17 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If host supports feature MSR, write down. */
|
||||
if (kvm_feature_msrs) {
|
||||
int i;
|
||||
for (i = 0; i < kvm_feature_msrs->nmsrs; i++)
|
||||
if (kvm_feature_msrs->indices[i] == MSR_IA32_ARCH_CAPABILITIES) {
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_ARCH_CAPABILITIES,
|
||||
env->features[FEAT_ARCH_CAPABILITIES]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The following MSRs have side effects on the guest or are too heavy
|
||||
* for normal writeback. Limit them to reset or full state updates.
|
||||
|
||||
@@ -7028,13 +7028,7 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
#ifdef WANT_ICEBP
|
||||
case 0xf1: /* icebp (undocumented, exits to external debugger) */
|
||||
gen_svm_check_intercept(s, pc_start, SVM_EXIT_ICEBP);
|
||||
#if 1
|
||||
gen_debug(s, pc_start - s->cs_base);
|
||||
#else
|
||||
/* start debug */
|
||||
tb_flush(CPU(x86_env_get_cpu(env)));
|
||||
qemu_set_log(CPU_LOG_INT | CPU_LOG_TB_IN_ASM);
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
case 0xfa: /* cli */
|
||||
|
||||
Reference in New Issue
Block a user