diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-03-02 22:40:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-03-02 22:40:43 -0500 |
commit | 03a6c2592f0020a43d0eb7d08010f2fa23c46fe7 (patch) | |
tree | 7d22a044ab7bcd3c7ef5d5a4713407fdbba498ef | |
parent | 329ad5e5445955b9de3438061303fdfbd03173de (diff) | |
parent | b7e31be385584afe7f073130e8e570d53c95f7fe (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM fixes from Radim Krčmář:
"x86:
- fix NULL dereference when using userspace lapic
- optimize spectre v1 mitigations by allowing guests to use LFENCE
- make microcode revision configurable to prevent guests from
unnecessarily blacklisting spectre v2 mitigation feature"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: x86: fix vcpu initialization with userspace lapic
KVM: X86: Allow userspace to define the microcode version
KVM: X86: Introduce kvm_get_msr_feature()
KVM: SVM: Add MSR-based feature support for serializing LFENCE
KVM: x86: Add a framework for supporting MSR-based features
-rw-r--r-- | Documentation/virtual/kvm/api.txt | 40 | ||||
-rw-r--r-- | arch/x86/include/asm/kvm_host.h | 3 | ||||
-rw-r--r-- | arch/x86/kvm/lapic.c | 10 | ||||
-rw-r--r-- | arch/x86/kvm/svm.c | 44 | ||||
-rw-r--r-- | arch/x86/kvm/vmx.c | 7 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 102 | ||||
-rw-r--r-- | include/uapi/linux/kvm.h | 2 |
7 files changed, 179 insertions, 29 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 792fa8717d13..d6b3ff51a14f 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt | |||
@@ -123,14 +123,15 @@ memory layout to fit in user mode), check KVM_CAP_MIPS_VZ and use the | |||
123 | flag KVM_VM_MIPS_VZ. | 123 | flag KVM_VM_MIPS_VZ. |
124 | 124 | ||
125 | 125 | ||
126 | 4.3 KVM_GET_MSR_INDEX_LIST | 126 | 4.3 KVM_GET_MSR_INDEX_LIST, KVM_GET_MSR_FEATURE_INDEX_LIST |
127 | 127 | ||
128 | Capability: basic | 128 | Capability: basic, KVM_CAP_GET_MSR_FEATURES for KVM_GET_MSR_FEATURE_INDEX_LIST |
129 | Architectures: x86 | 129 | Architectures: x86 |
130 | Type: system | 130 | Type: system ioctl |
131 | Parameters: struct kvm_msr_list (in/out) | 131 | Parameters: struct kvm_msr_list (in/out) |
132 | Returns: 0 on success; -1 on error | 132 | Returns: 0 on success; -1 on error |
133 | Errors: | 133 | Errors: |
134 | EFAULT: the msr index list cannot be read from or written to | ||
134 | E2BIG: the msr index list is to be to fit in the array specified by | 135 | E2BIG: the msr index list is to be to fit in the array specified by |
135 | the user. | 136 | the user. |
136 | 137 | ||
@@ -139,16 +140,23 @@ struct kvm_msr_list { | |||
139 | __u32 indices[0]; | 140 | __u32 indices[0]; |
140 | }; | 141 | }; |
141 | 142 | ||
142 | This ioctl returns the guest msrs that are supported. The list varies | 143 | The user fills in the size of the indices array in nmsrs, and in return |
143 | by kvm version and host processor, but does not change otherwise. The | 144 | kvm adjusts nmsrs to reflect the actual number of msrs and fills in the |
144 | user fills in the size of the indices array in nmsrs, and in return | 145 | indices array with their numbers. |
145 | kvm adjusts nmsrs to reflect the actual number of msrs and fills in | 146 | |
146 | the indices array with their numbers. | 147 | KVM_GET_MSR_INDEX_LIST returns the guest msrs that are supported. The list |
148 | varies by kvm version and host processor, but does not change otherwise. | ||
147 | 149 | ||
148 | Note: if kvm indicates supports MCE (KVM_CAP_MCE), then the MCE bank MSRs are | 150 | Note: if kvm indicates supports MCE (KVM_CAP_MCE), then the MCE bank MSRs are |
149 | not returned in the MSR list, as different vcpus can have a different number | 151 | not returned in the MSR list, as different vcpus can have a different number |
150 | of banks, as set via the KVM_X86_SETUP_MCE ioctl. | 152 | of banks, as set via the KVM_X86_SETUP_MCE ioctl. |
151 | 153 | ||
154 | KVM_GET_MSR_FEATURE_INDEX_LIST returns the list of MSRs that can be passed | ||
155 | to the KVM_GET_MSRS system ioctl. This lets userspace probe host capabilities | ||
156 | and processor features that are exposed via MSRs (e.g., VMX capabilities). | ||
157 | This list also varies by kvm version and host processor, but does not change | ||
158 | otherwise. | ||
159 | |||
152 | 160 | ||
153 | 4.4 KVM_CHECK_EXTENSION | 161 | 4.4 KVM_CHECK_EXTENSION |
154 | 162 | ||
@@ -475,14 +483,22 @@ Support for this has been removed. Use KVM_SET_GUEST_DEBUG instead. | |||
475 | 483 | ||
476 | 4.18 KVM_GET_MSRS | 484 | 4.18 KVM_GET_MSRS |
477 | 485 | ||
478 | Capability: basic | 486 | Capability: basic (vcpu), KVM_CAP_GET_MSR_FEATURES (system) |
479 | Architectures: x86 | 487 | Architectures: x86 |
480 | Type: vcpu ioctl | 488 | Type: system ioctl, vcpu ioctl |
481 | Parameters: struct kvm_msrs (in/out) | 489 | Parameters: struct kvm_msrs (in/out) |
482 | Returns: 0 on success, -1 on error | 490 | Returns: number of msrs successfully returned; |
491 | -1 on error | ||
492 | |||
493 | When used as a system ioctl: | ||
494 | Reads the values of MSR-based features that are available for the VM. This | ||
495 | is similar to KVM_GET_SUPPORTED_CPUID, but it returns MSR indices and values. | ||
496 | The list of msr-based features can be obtained using KVM_GET_MSR_FEATURE_INDEX_LIST | ||
497 | in a system ioctl. | ||
483 | 498 | ||
499 | When used as a vcpu ioctl: | ||
484 | Reads model-specific registers from the vcpu. Supported msr indices can | 500 | Reads model-specific registers from the vcpu. Supported msr indices can |
485 | be obtained using KVM_GET_MSR_INDEX_LIST. | 501 | be obtained using KVM_GET_MSR_INDEX_LIST in a system ioctl. |
486 | 502 | ||
487 | struct kvm_msrs { | 503 | struct kvm_msrs { |
488 | __u32 nmsrs; /* number of msrs in entries */ | 504 | __u32 nmsrs; /* number of msrs in entries */ |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 0a9e330b34f0..b605a5b6a30c 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h | |||
@@ -507,6 +507,7 @@ struct kvm_vcpu_arch { | |||
507 | u64 smi_count; | 507 | u64 smi_count; |
508 | bool tpr_access_reporting; | 508 | bool tpr_access_reporting; |
509 | u64 ia32_xss; | 509 | u64 ia32_xss; |
510 | u64 microcode_version; | ||
510 | 511 | ||
511 | /* | 512 | /* |
512 | * Paging state of the vcpu | 513 | * Paging state of the vcpu |
@@ -1095,6 +1096,8 @@ struct kvm_x86_ops { | |||
1095 | int (*mem_enc_op)(struct kvm *kvm, void __user *argp); | 1096 | int (*mem_enc_op)(struct kvm *kvm, void __user *argp); |
1096 | int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp); | 1097 | int (*mem_enc_reg_region)(struct kvm *kvm, struct kvm_enc_region *argp); |
1097 | int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp); | 1098 | int (*mem_enc_unreg_region)(struct kvm *kvm, struct kvm_enc_region *argp); |
1099 | |||
1100 | int (*get_msr_feature)(struct kvm_msr_entry *entry); | ||
1098 | }; | 1101 | }; |
1099 | 1102 | ||
1100 | struct kvm_arch_async_pf { | 1103 | struct kvm_arch_async_pf { |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index cc5fe7a50dde..391dda8d43b7 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -2002,14 +2002,13 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | |||
2002 | 2002 | ||
2003 | void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) | 2003 | void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) |
2004 | { | 2004 | { |
2005 | struct kvm_lapic *apic; | 2005 | struct kvm_lapic *apic = vcpu->arch.apic; |
2006 | int i; | 2006 | int i; |
2007 | 2007 | ||
2008 | apic_debug("%s\n", __func__); | 2008 | if (!apic) |
2009 | return; | ||
2009 | 2010 | ||
2010 | ASSERT(vcpu); | 2011 | apic_debug("%s\n", __func__); |
2011 | apic = vcpu->arch.apic; | ||
2012 | ASSERT(apic != NULL); | ||
2013 | 2012 | ||
2014 | /* Stop the timer in case it's a reset to an active apic */ | 2013 | /* Stop the timer in case it's a reset to an active apic */ |
2015 | hrtimer_cancel(&apic->lapic_timer.timer); | 2014 | hrtimer_cancel(&apic->lapic_timer.timer); |
@@ -2568,7 +2567,6 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) | |||
2568 | 2567 | ||
2569 | pe = xchg(&apic->pending_events, 0); | 2568 | pe = xchg(&apic->pending_events, 0); |
2570 | if (test_bit(KVM_APIC_INIT, &pe)) { | 2569 | if (test_bit(KVM_APIC_INIT, &pe)) { |
2571 | kvm_lapic_reset(vcpu, true); | ||
2572 | kvm_vcpu_reset(vcpu, true); | 2570 | kvm_vcpu_reset(vcpu, true); |
2573 | if (kvm_vcpu_is_bsp(apic->vcpu)) | 2571 | if (kvm_vcpu_is_bsp(apic->vcpu)) |
2574 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; | 2572 | vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index cbd7ab74952e..be9c839e2c89 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -179,6 +179,8 @@ struct vcpu_svm { | |||
179 | uint64_t sysenter_eip; | 179 | uint64_t sysenter_eip; |
180 | uint64_t tsc_aux; | 180 | uint64_t tsc_aux; |
181 | 181 | ||
182 | u64 msr_decfg; | ||
183 | |||
182 | u64 next_rip; | 184 | u64 next_rip; |
183 | 185 | ||
184 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; | 186 | u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS]; |
@@ -1906,6 +1908,7 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) | |||
1906 | u32 dummy; | 1908 | u32 dummy; |
1907 | u32 eax = 1; | 1909 | u32 eax = 1; |
1908 | 1910 | ||
1911 | vcpu->arch.microcode_version = 0x01000065; | ||
1909 | svm->spec_ctrl = 0; | 1912 | svm->spec_ctrl = 0; |
1910 | 1913 | ||
1911 | if (!init_event) { | 1914 | if (!init_event) { |
@@ -3870,6 +3873,22 @@ static int cr8_write_interception(struct vcpu_svm *svm) | |||
3870 | return 0; | 3873 | return 0; |
3871 | } | 3874 | } |
3872 | 3875 | ||
3876 | static int svm_get_msr_feature(struct kvm_msr_entry *msr) | ||
3877 | { | ||
3878 | msr->data = 0; | ||
3879 | |||
3880 | switch (msr->index) { | ||
3881 | case MSR_F10H_DECFG: | ||
3882 | if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC)) | ||
3883 | msr->data |= MSR_F10H_DECFG_LFENCE_SERIALIZE; | ||
3884 | break; | ||
3885 | default: | ||
3886 | return 1; | ||
3887 | } | ||
3888 | |||
3889 | return 0; | ||
3890 | } | ||
3891 | |||
3873 | static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | 3892 | static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) |
3874 | { | 3893 | { |
3875 | struct vcpu_svm *svm = to_svm(vcpu); | 3894 | struct vcpu_svm *svm = to_svm(vcpu); |
@@ -3945,9 +3964,6 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
3945 | 3964 | ||
3946 | msr_info->data = svm->spec_ctrl; | 3965 | msr_info->data = svm->spec_ctrl; |
3947 | break; | 3966 | break; |
3948 | case MSR_IA32_UCODE_REV: | ||
3949 | msr_info->data = 0x01000065; | ||
3950 | break; | ||
3951 | case MSR_F15H_IC_CFG: { | 3967 | case MSR_F15H_IC_CFG: { |
3952 | 3968 | ||
3953 | int family, model; | 3969 | int family, model; |
@@ -3965,6 +3981,9 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
3965 | msr_info->data = 0x1E; | 3981 | msr_info->data = 0x1E; |
3966 | } | 3982 | } |
3967 | break; | 3983 | break; |
3984 | case MSR_F10H_DECFG: | ||
3985 | msr_info->data = svm->msr_decfg; | ||
3986 | break; | ||
3968 | default: | 3987 | default: |
3969 | return kvm_get_msr_common(vcpu, msr_info); | 3988 | return kvm_get_msr_common(vcpu, msr_info); |
3970 | } | 3989 | } |
@@ -4143,6 +4162,24 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) | |||
4143 | case MSR_VM_IGNNE: | 4162 | case MSR_VM_IGNNE: |
4144 | vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); | 4163 | vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data); |
4145 | break; | 4164 | break; |
4165 | case MSR_F10H_DECFG: { | ||
4166 | struct kvm_msr_entry msr_entry; | ||
4167 | |||
4168 | msr_entry.index = msr->index; | ||
4169 | if (svm_get_msr_feature(&msr_entry)) | ||
4170 | return 1; | ||
4171 | |||
4172 | /* Check the supported bits */ | ||
4173 | if (data & ~msr_entry.data) | ||
4174 | return 1; | ||
4175 | |||
4176 | /* Don't allow the guest to change a bit, #GP */ | ||
4177 | if (!msr->host_initiated && (data ^ msr_entry.data)) | ||
4178 | return 1; | ||
4179 | |||
4180 | svm->msr_decfg = data; | ||
4181 | break; | ||
4182 | } | ||
4146 | case MSR_IA32_APICBASE: | 4183 | case MSR_IA32_APICBASE: |
4147 | if (kvm_vcpu_apicv_active(vcpu)) | 4184 | if (kvm_vcpu_apicv_active(vcpu)) |
4148 | avic_update_vapic_bar(to_svm(vcpu), data); | 4185 | avic_update_vapic_bar(to_svm(vcpu), data); |
@@ -6833,6 +6870,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { | |||
6833 | .vcpu_unblocking = svm_vcpu_unblocking, | 6870 | .vcpu_unblocking = svm_vcpu_unblocking, |
6834 | 6871 | ||
6835 | .update_bp_intercept = update_bp_intercept, | 6872 | .update_bp_intercept = update_bp_intercept, |
6873 | .get_msr_feature = svm_get_msr_feature, | ||
6836 | .get_msr = svm_get_msr, | 6874 | .get_msr = svm_get_msr, |
6837 | .set_msr = svm_set_msr, | 6875 | .set_msr = svm_set_msr, |
6838 | .get_segment_base = svm_get_segment_base, | 6876 | .get_segment_base = svm_get_segment_base, |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index cab6ea1f8be5..051dab74e4e9 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -3227,6 +3227,11 @@ static inline bool vmx_feature_control_msr_valid(struct kvm_vcpu *vcpu, | |||
3227 | return !(val & ~valid_bits); | 3227 | return !(val & ~valid_bits); |
3228 | } | 3228 | } |
3229 | 3229 | ||
3230 | static int vmx_get_msr_feature(struct kvm_msr_entry *msr) | ||
3231 | { | ||
3232 | return 1; | ||
3233 | } | ||
3234 | |||
3230 | /* | 3235 | /* |
3231 | * Reads an msr value (of 'msr_index') into 'pdata'. | 3236 | * Reads an msr value (of 'msr_index') into 'pdata'. |
3232 | * Returns 0 on success, non-0 otherwise. | 3237 | * Returns 0 on success, non-0 otherwise. |
@@ -5767,6 +5772,7 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) | |||
5767 | vmx->rmode.vm86_active = 0; | 5772 | vmx->rmode.vm86_active = 0; |
5768 | vmx->spec_ctrl = 0; | 5773 | vmx->spec_ctrl = 0; |
5769 | 5774 | ||
5775 | vcpu->arch.microcode_version = 0x100000000ULL; | ||
5770 | vmx->vcpu.arch.regs[VCPU_REGS_RDX] = get_rdx_init_val(); | 5776 | vmx->vcpu.arch.regs[VCPU_REGS_RDX] = get_rdx_init_val(); |
5771 | kvm_set_cr8(vcpu, 0); | 5777 | kvm_set_cr8(vcpu, 0); |
5772 | 5778 | ||
@@ -12297,6 +12303,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { | |||
12297 | .vcpu_put = vmx_vcpu_put, | 12303 | .vcpu_put = vmx_vcpu_put, |
12298 | 12304 | ||
12299 | .update_bp_intercept = update_exception_bitmap, | 12305 | .update_bp_intercept = update_exception_bitmap, |
12306 | .get_msr_feature = vmx_get_msr_feature, | ||
12300 | .get_msr = vmx_get_msr, | 12307 | .get_msr = vmx_get_msr, |
12301 | .set_msr = vmx_set_msr, | 12308 | .set_msr = vmx_set_msr, |
12302 | .get_segment_base = vmx_get_segment_base, | 12309 | .get_segment_base = vmx_get_segment_base, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 96edda878dbf..18b5ca7a3197 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1049,6 +1049,45 @@ static u32 emulated_msrs[] = { | |||
1049 | 1049 | ||
1050 | static unsigned num_emulated_msrs; | 1050 | static unsigned num_emulated_msrs; |
1051 | 1051 | ||
1052 | /* | ||
1053 | * List of msr numbers which are used to expose MSR-based features that | ||
1054 | * can be used by a hypervisor to validate requested CPU features. | ||
1055 | */ | ||
1056 | static u32 msr_based_features[] = { | ||
1057 | MSR_F10H_DECFG, | ||
1058 | MSR_IA32_UCODE_REV, | ||
1059 | }; | ||
1060 | |||
1061 | static unsigned int num_msr_based_features; | ||
1062 | |||
1063 | static int kvm_get_msr_feature(struct kvm_msr_entry *msr) | ||
1064 | { | ||
1065 | switch (msr->index) { | ||
1066 | case MSR_IA32_UCODE_REV: | ||
1067 | rdmsrl(msr->index, msr->data); | ||
1068 | break; | ||
1069 | default: | ||
1070 | if (kvm_x86_ops->get_msr_feature(msr)) | ||
1071 | return 1; | ||
1072 | } | ||
1073 | return 0; | ||
1074 | } | ||
1075 | |||
1076 | static int do_get_msr_feature(struct kvm_vcpu *vcpu, unsigned index, u64 *data) | ||
1077 | { | ||
1078 | struct kvm_msr_entry msr; | ||
1079 | int r; | ||
1080 | |||
1081 | msr.index = index; | ||
1082 | r = kvm_get_msr_feature(&msr); | ||
1083 | if (r) | ||
1084 | return r; | ||
1085 | |||
1086 | *data = msr.data; | ||
1087 | |||
1088 | return 0; | ||
1089 | } | ||
1090 | |||
1052 | bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer) | 1091 | bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer) |
1053 | { | 1092 | { |
1054 | if (efer & efer_reserved_bits) | 1093 | if (efer & efer_reserved_bits) |
@@ -2222,7 +2261,6 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2222 | 2261 | ||
2223 | switch (msr) { | 2262 | switch (msr) { |
2224 | case MSR_AMD64_NB_CFG: | 2263 | case MSR_AMD64_NB_CFG: |
2225 | case MSR_IA32_UCODE_REV: | ||
2226 | case MSR_IA32_UCODE_WRITE: | 2264 | case MSR_IA32_UCODE_WRITE: |
2227 | case MSR_VM_HSAVE_PA: | 2265 | case MSR_VM_HSAVE_PA: |
2228 | case MSR_AMD64_PATCH_LOADER: | 2266 | case MSR_AMD64_PATCH_LOADER: |
@@ -2230,6 +2268,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2230 | case MSR_AMD64_DC_CFG: | 2268 | case MSR_AMD64_DC_CFG: |
2231 | break; | 2269 | break; |
2232 | 2270 | ||
2271 | case MSR_IA32_UCODE_REV: | ||
2272 | if (msr_info->host_initiated) | ||
2273 | vcpu->arch.microcode_version = data; | ||
2274 | break; | ||
2233 | case MSR_EFER: | 2275 | case MSR_EFER: |
2234 | return set_efer(vcpu, data); | 2276 | return set_efer(vcpu, data); |
2235 | case MSR_K7_HWCR: | 2277 | case MSR_K7_HWCR: |
@@ -2525,7 +2567,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
2525 | msr_info->data = 0; | 2567 | msr_info->data = 0; |
2526 | break; | 2568 | break; |
2527 | case MSR_IA32_UCODE_REV: | 2569 | case MSR_IA32_UCODE_REV: |
2528 | msr_info->data = 0x100000000ULL; | 2570 | msr_info->data = vcpu->arch.microcode_version; |
2529 | break; | 2571 | break; |
2530 | case MSR_MTRRcap: | 2572 | case MSR_MTRRcap: |
2531 | case 0x200 ... 0x2ff: | 2573 | case 0x200 ... 0x2ff: |
@@ -2680,13 +2722,11 @@ static int __msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs *msrs, | |||
2680 | int (*do_msr)(struct kvm_vcpu *vcpu, | 2722 | int (*do_msr)(struct kvm_vcpu *vcpu, |
2681 | unsigned index, u64 *data)) | 2723 | unsigned index, u64 *data)) |
2682 | { | 2724 | { |
2683 | int i, idx; | 2725 | int i; |
2684 | 2726 | ||
2685 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
2686 | for (i = 0; i < msrs->nmsrs; ++i) | 2727 | for (i = 0; i < msrs->nmsrs; ++i) |
2687 | if (do_msr(vcpu, entries[i].index, &entries[i].data)) | 2728 | if (do_msr(vcpu, entries[i].index, &entries[i].data)) |
2688 | break; | 2729 | break; |
2689 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
2690 | 2730 | ||
2691 | return i; | 2731 | return i; |
2692 | } | 2732 | } |
@@ -2785,6 +2825,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
2785 | case KVM_CAP_SET_BOOT_CPU_ID: | 2825 | case KVM_CAP_SET_BOOT_CPU_ID: |
2786 | case KVM_CAP_SPLIT_IRQCHIP: | 2826 | case KVM_CAP_SPLIT_IRQCHIP: |
2787 | case KVM_CAP_IMMEDIATE_EXIT: | 2827 | case KVM_CAP_IMMEDIATE_EXIT: |
2828 | case KVM_CAP_GET_MSR_FEATURES: | ||
2788 | r = 1; | 2829 | r = 1; |
2789 | break; | 2830 | break; |
2790 | case KVM_CAP_ADJUST_CLOCK: | 2831 | case KVM_CAP_ADJUST_CLOCK: |
@@ -2899,6 +2940,31 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
2899 | goto out; | 2940 | goto out; |
2900 | r = 0; | 2941 | r = 0; |
2901 | break; | 2942 | break; |
2943 | case KVM_GET_MSR_FEATURE_INDEX_LIST: { | ||
2944 | struct kvm_msr_list __user *user_msr_list = argp; | ||
2945 | struct kvm_msr_list msr_list; | ||
2946 | unsigned int n; | ||
2947 | |||
2948 | r = -EFAULT; | ||
2949 | if (copy_from_user(&msr_list, user_msr_list, sizeof(msr_list))) | ||
2950 | goto out; | ||
2951 | n = msr_list.nmsrs; | ||
2952 | msr_list.nmsrs = num_msr_based_features; | ||
2953 | if (copy_to_user(user_msr_list, &msr_list, sizeof(msr_list))) | ||
2954 | goto out; | ||
2955 | r = -E2BIG; | ||
2956 | if (n < msr_list.nmsrs) | ||
2957 | goto out; | ||
2958 | r = -EFAULT; | ||
2959 | if (copy_to_user(user_msr_list->indices, &msr_based_features, | ||
2960 | num_msr_based_features * sizeof(u32))) | ||
2961 | goto out; | ||
2962 | r = 0; | ||
2963 | break; | ||
2964 | } | ||
2965 | case KVM_GET_MSRS: | ||
2966 | r = msr_io(NULL, argp, do_get_msr_feature, 1); | ||
2967 | break; | ||
2902 | } | 2968 | } |
2903 | default: | 2969 | default: |
2904 | r = -EINVAL; | 2970 | r = -EINVAL; |
@@ -3636,12 +3702,18 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
3636 | r = 0; | 3702 | r = 0; |
3637 | break; | 3703 | break; |
3638 | } | 3704 | } |
3639 | case KVM_GET_MSRS: | 3705 | case KVM_GET_MSRS: { |
3706 | int idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
3640 | r = msr_io(vcpu, argp, do_get_msr, 1); | 3707 | r = msr_io(vcpu, argp, do_get_msr, 1); |
3708 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
3641 | break; | 3709 | break; |
3642 | case KVM_SET_MSRS: | 3710 | } |
3711 | case KVM_SET_MSRS: { | ||
3712 | int idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
3643 | r = msr_io(vcpu, argp, do_set_msr, 0); | 3713 | r = msr_io(vcpu, argp, do_set_msr, 0); |
3714 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
3644 | break; | 3715 | break; |
3716 | } | ||
3645 | case KVM_TPR_ACCESS_REPORTING: { | 3717 | case KVM_TPR_ACCESS_REPORTING: { |
3646 | struct kvm_tpr_access_ctl tac; | 3718 | struct kvm_tpr_access_ctl tac; |
3647 | 3719 | ||
@@ -4464,6 +4536,19 @@ static void kvm_init_msr_list(void) | |||
4464 | j++; | 4536 | j++; |
4465 | } | 4537 | } |
4466 | num_emulated_msrs = j; | 4538 | num_emulated_msrs = j; |
4539 | |||
4540 | for (i = j = 0; i < ARRAY_SIZE(msr_based_features); i++) { | ||
4541 | struct kvm_msr_entry msr; | ||
4542 | |||
4543 | msr.index = msr_based_features[i]; | ||
4544 | if (kvm_get_msr_feature(&msr)) | ||
4545 | continue; | ||
4546 | |||
4547 | if (j < i) | ||
4548 | msr_based_features[j] = msr_based_features[i]; | ||
4549 | j++; | ||
4550 | } | ||
4551 | num_msr_based_features = j; | ||
4467 | } | 4552 | } |
4468 | 4553 | ||
4469 | static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len, | 4554 | static int vcpu_mmio_write(struct kvm_vcpu *vcpu, gpa_t addr, int len, |
@@ -7975,7 +8060,6 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
7975 | kvm_vcpu_mtrr_init(vcpu); | 8060 | kvm_vcpu_mtrr_init(vcpu); |
7976 | vcpu_load(vcpu); | 8061 | vcpu_load(vcpu); |
7977 | kvm_vcpu_reset(vcpu, false); | 8062 | kvm_vcpu_reset(vcpu, false); |
7978 | kvm_lapic_reset(vcpu, false); | ||
7979 | kvm_mmu_setup(vcpu); | 8063 | kvm_mmu_setup(vcpu); |
7980 | vcpu_put(vcpu); | 8064 | vcpu_put(vcpu); |
7981 | return 0; | 8065 | return 0; |
@@ -8018,6 +8102,8 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) | |||
8018 | 8102 | ||
8019 | void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) | 8103 | void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) |
8020 | { | 8104 | { |
8105 | kvm_lapic_reset(vcpu, init_event); | ||
8106 | |||
8021 | vcpu->arch.hflags = 0; | 8107 | vcpu->arch.hflags = 0; |
8022 | 8108 | ||
8023 | vcpu->arch.smi_pending = 0; | 8109 | vcpu->arch.smi_pending = 0; |
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 0fb5ef939732..7b26d4b0b052 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h | |||
@@ -761,6 +761,7 @@ struct kvm_ppc_resize_hpt { | |||
761 | #define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07 | 761 | #define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07 |
762 | #define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08 | 762 | #define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08 |
763 | #define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2) | 763 | #define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2) |
764 | #define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list) | ||
764 | 765 | ||
765 | /* | 766 | /* |
766 | * Extension capability list. | 767 | * Extension capability list. |
@@ -934,6 +935,7 @@ struct kvm_ppc_resize_hpt { | |||
934 | #define KVM_CAP_S390_AIS_MIGRATION 150 | 935 | #define KVM_CAP_S390_AIS_MIGRATION 150 |
935 | #define KVM_CAP_PPC_GET_CPU_CHAR 151 | 936 | #define KVM_CAP_PPC_GET_CPU_CHAR 151 |
936 | #define KVM_CAP_S390_BPB 152 | 937 | #define KVM_CAP_S390_BPB 152 |
938 | #define KVM_CAP_GET_MSR_FEATURES 153 | ||
937 | 939 | ||
938 | #ifdef KVM_CAP_IRQ_ROUTING | 940 | #ifdef KVM_CAP_IRQ_ROUTING |
939 | 941 | ||