diff options
-rw-r--r-- | arch/x86/kvm/mmu.c | 30 | ||||
-rw-r--r-- | arch/x86/kvm/mmu.h | 2 |
2 files changed, 28 insertions, 4 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index ccb70b8d16cc..04d750813c9d 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -4109,16 +4109,28 @@ void | |||
4109 | reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context) | 4109 | reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context) |
4110 | { | 4110 | { |
4111 | bool uses_nx = context->nx || context->base_role.smep_andnot_wp; | 4111 | bool uses_nx = context->nx || context->base_role.smep_andnot_wp; |
4112 | struct rsvd_bits_validate *shadow_zero_check; | ||
4113 | int i; | ||
4112 | 4114 | ||
4113 | /* | 4115 | /* |
4114 | * Passing "true" to the last argument is okay; it adds a check | 4116 | * Passing "true" to the last argument is okay; it adds a check |
4115 | * on bit 8 of the SPTEs which KVM doesn't use anyway. | 4117 | * on bit 8 of the SPTEs which KVM doesn't use anyway. |
4116 | */ | 4118 | */ |
4117 | __reset_rsvds_bits_mask(vcpu, &context->shadow_zero_check, | 4119 | shadow_zero_check = &context->shadow_zero_check; |
4120 | __reset_rsvds_bits_mask(vcpu, shadow_zero_check, | ||
4118 | boot_cpu_data.x86_phys_bits, | 4121 | boot_cpu_data.x86_phys_bits, |
4119 | context->shadow_root_level, uses_nx, | 4122 | context->shadow_root_level, uses_nx, |
4120 | guest_cpuid_has_gbpages(vcpu), is_pse(vcpu), | 4123 | guest_cpuid_has_gbpages(vcpu), is_pse(vcpu), |
4121 | true); | 4124 | true); |
4125 | |||
4126 | if (!shadow_me_mask) | ||
4127 | return; | ||
4128 | |||
4129 | for (i = context->shadow_root_level; --i >= 0;) { | ||
4130 | shadow_zero_check->rsvd_bits_mask[0][i] &= ~shadow_me_mask; | ||
4131 | shadow_zero_check->rsvd_bits_mask[1][i] &= ~shadow_me_mask; | ||
4132 | } | ||
4133 | |||
4122 | } | 4134 | } |
4123 | EXPORT_SYMBOL_GPL(reset_shadow_zero_bits_mask); | 4135 | EXPORT_SYMBOL_GPL(reset_shadow_zero_bits_mask); |
4124 | 4136 | ||
@@ -4136,17 +4148,29 @@ static void | |||
4136 | reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, | 4148 | reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, |
4137 | struct kvm_mmu *context) | 4149 | struct kvm_mmu *context) |
4138 | { | 4150 | { |
4151 | struct rsvd_bits_validate *shadow_zero_check; | ||
4152 | int i; | ||
4153 | |||
4154 | shadow_zero_check = &context->shadow_zero_check; | ||
4155 | |||
4139 | if (boot_cpu_is_amd()) | 4156 | if (boot_cpu_is_amd()) |
4140 | __reset_rsvds_bits_mask(vcpu, &context->shadow_zero_check, | 4157 | __reset_rsvds_bits_mask(vcpu, shadow_zero_check, |
4141 | boot_cpu_data.x86_phys_bits, | 4158 | boot_cpu_data.x86_phys_bits, |
4142 | context->shadow_root_level, false, | 4159 | context->shadow_root_level, false, |
4143 | boot_cpu_has(X86_FEATURE_GBPAGES), | 4160 | boot_cpu_has(X86_FEATURE_GBPAGES), |
4144 | true, true); | 4161 | true, true); |
4145 | else | 4162 | else |
4146 | __reset_rsvds_bits_mask_ept(&context->shadow_zero_check, | 4163 | __reset_rsvds_bits_mask_ept(shadow_zero_check, |
4147 | boot_cpu_data.x86_phys_bits, | 4164 | boot_cpu_data.x86_phys_bits, |
4148 | false); | 4165 | false); |
4149 | 4166 | ||
4167 | if (!shadow_me_mask) | ||
4168 | return; | ||
4169 | |||
4170 | for (i = context->shadow_root_level; --i >= 0;) { | ||
4171 | shadow_zero_check->rsvd_bits_mask[0][i] &= ~shadow_me_mask; | ||
4172 | shadow_zero_check->rsvd_bits_mask[1][i] &= ~shadow_me_mask; | ||
4173 | } | ||
4150 | } | 4174 | } |
4151 | 4175 | ||
4152 | /* | 4176 | /* |
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h index 3cc725590ab9..d7d248a000dd 100644 --- a/arch/x86/kvm/mmu.h +++ b/arch/x86/kvm/mmu.h | |||
@@ -48,7 +48,7 @@ | |||
48 | 48 | ||
49 | static inline u64 rsvd_bits(int s, int e) | 49 | static inline u64 rsvd_bits(int s, int e) |
50 | { | 50 | { |
51 | return __sme_clr(((1ULL << (e - s + 1)) - 1) << s); | 51 | return ((1ULL << (e - s + 1)) - 1) << s; |
52 | } | 52 | } |
53 | 53 | ||
54 | void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value); | 54 | void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value); |