aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/mmu.c30
-rw-r--r--arch/x86/kvm/mmu.h2
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
4109reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context) 4109reset_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}
4123EXPORT_SYMBOL_GPL(reset_shadow_zero_bits_mask); 4135EXPORT_SYMBOL_GPL(reset_shadow_zero_bits_mask);
4124 4136
@@ -4136,17 +4148,29 @@ static void
4136reset_tdp_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, 4148reset_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
49static inline u64 rsvd_bits(int s, int e) 49static 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
54void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value); 54void kvm_mmu_set_mmio_spte_mask(u64 mmio_mask, u64 mmio_value);