forked from Minki/linux
Bug fixes.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJcclOnAAoJEL/70l94x66DAjIH/28XLAkaAtJIsm4nTy3sb6nC UC7suhEEst4zyRCzUlMdeaMkuWJitx5Bun0x9k5uYvMXqmndXcGq3wLmrRhOY2u2 iN1myLESOn0+lubVcK/+ht2rat2AO9XqpOKPojBRs/c6MW1UAIJIPKly/ls1++Ee TmdIKrgqGgE5Ywx4ObvXBDOeWSKUwxqqNi7FUkWpACJckvmQoKJX0Hre5ICW6lom +yUBC1rR9apMLTe2QIW2kBZ9JTKCX0aErdmnLXlyZbFOOk0udzNaDy+kXSs7w9Bk tu8biO7xBNJrcR5e+fEipVFIdN9au0aM5pJWq9s4yeqSnDKB1FRekoJj5yvTqus= =1GQR -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm Pull KVM fixes from Paolo Bonzini: "Bug fixes" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: MMU: record maximum physical address width in kvm_mmu_extended_role kvm: x86: Return LA57 feature based on hardware capability x86/kvm/mmu: fix switch between root and guest MMUs s390: vsie: Use effective CRYCBD.31 to check CRYCBD validity
This commit is contained in:
commit
c3619a482e
@ -297,7 +297,7 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|||||||
scb_s->crycbd = 0;
|
scb_s->crycbd = 0;
|
||||||
|
|
||||||
apie_h = vcpu->arch.sie_block->eca & ECA_APIE;
|
apie_h = vcpu->arch.sie_block->eca & ECA_APIE;
|
||||||
if (!apie_h && !key_msk)
|
if (!apie_h && (!key_msk || fmt_o == CRYCB_FORMAT0))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!crycb_addr)
|
if (!crycb_addr)
|
||||||
|
@ -299,6 +299,7 @@ union kvm_mmu_extended_role {
|
|||||||
unsigned int cr4_smap:1;
|
unsigned int cr4_smap:1;
|
||||||
unsigned int cr4_smep:1;
|
unsigned int cr4_smep:1;
|
||||||
unsigned int cr4_la57:1;
|
unsigned int cr4_la57:1;
|
||||||
|
unsigned int maxphyaddr:6;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -397,6 +398,7 @@ struct kvm_mmu {
|
|||||||
void (*update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
void (*update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||||
u64 *spte, const void *pte);
|
u64 *spte, const void *pte);
|
||||||
hpa_t root_hpa;
|
hpa_t root_hpa;
|
||||||
|
gpa_t root_cr3;
|
||||||
union kvm_mmu_role mmu_role;
|
union kvm_mmu_role mmu_role;
|
||||||
u8 root_level;
|
u8 root_level;
|
||||||
u8 shadow_root_level;
|
u8 shadow_root_level;
|
||||||
|
@ -335,6 +335,7 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|||||||
unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0;
|
unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0;
|
||||||
unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0;
|
unsigned f_umip = kvm_x86_ops->umip_emulated() ? F(UMIP) : 0;
|
||||||
unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0;
|
unsigned f_intel_pt = kvm_x86_ops->pt_supported() ? F(INTEL_PT) : 0;
|
||||||
|
unsigned f_la57 = 0;
|
||||||
|
|
||||||
/* cpuid 1.edx */
|
/* cpuid 1.edx */
|
||||||
const u32 kvm_cpuid_1_edx_x86_features =
|
const u32 kvm_cpuid_1_edx_x86_features =
|
||||||
@ -489,7 +490,10 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|||||||
// TSC_ADJUST is emulated
|
// TSC_ADJUST is emulated
|
||||||
entry->ebx |= F(TSC_ADJUST);
|
entry->ebx |= F(TSC_ADJUST);
|
||||||
entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
|
entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
|
||||||
|
f_la57 = entry->ecx & F(LA57);
|
||||||
cpuid_mask(&entry->ecx, CPUID_7_ECX);
|
cpuid_mask(&entry->ecx, CPUID_7_ECX);
|
||||||
|
/* Set LA57 based on hardware capability. */
|
||||||
|
entry->ecx |= f_la57;
|
||||||
entry->ecx |= f_umip;
|
entry->ecx |= f_umip;
|
||||||
/* PKU is not yet implemented for shadow paging. */
|
/* PKU is not yet implemented for shadow paging. */
|
||||||
if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))
|
if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))
|
||||||
|
@ -3555,6 +3555,7 @@ void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
|||||||
&invalid_list);
|
&invalid_list);
|
||||||
mmu->root_hpa = INVALID_PAGE;
|
mmu->root_hpa = INVALID_PAGE;
|
||||||
}
|
}
|
||||||
|
mmu->root_cr3 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
kvm_mmu_commit_zap_page(vcpu->kvm, &invalid_list);
|
kvm_mmu_commit_zap_page(vcpu->kvm, &invalid_list);
|
||||||
@ -3610,6 +3611,7 @@ static int mmu_alloc_direct_roots(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.mmu->root_hpa = __pa(vcpu->arch.mmu->pae_root);
|
vcpu->arch.mmu->root_hpa = __pa(vcpu->arch.mmu->pae_root);
|
||||||
} else
|
} else
|
||||||
BUG();
|
BUG();
|
||||||
|
vcpu->arch.mmu->root_cr3 = vcpu->arch.mmu->get_cr3(vcpu);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3618,10 +3620,11 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
struct kvm_mmu_page *sp;
|
struct kvm_mmu_page *sp;
|
||||||
u64 pdptr, pm_mask;
|
u64 pdptr, pm_mask;
|
||||||
gfn_t root_gfn;
|
gfn_t root_gfn, root_cr3;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
root_gfn = vcpu->arch.mmu->get_cr3(vcpu) >> PAGE_SHIFT;
|
root_cr3 = vcpu->arch.mmu->get_cr3(vcpu);
|
||||||
|
root_gfn = root_cr3 >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (mmu_check_root(vcpu, root_gfn))
|
if (mmu_check_root(vcpu, root_gfn))
|
||||||
return 1;
|
return 1;
|
||||||
@ -3646,7 +3649,7 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
|
|||||||
++sp->root_count;
|
++sp->root_count;
|
||||||
spin_unlock(&vcpu->kvm->mmu_lock);
|
spin_unlock(&vcpu->kvm->mmu_lock);
|
||||||
vcpu->arch.mmu->root_hpa = root;
|
vcpu->arch.mmu->root_hpa = root;
|
||||||
return 0;
|
goto set_root_cr3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3712,6 +3715,9 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.mmu->root_hpa = __pa(vcpu->arch.mmu->lm_root);
|
vcpu->arch.mmu->root_hpa = __pa(vcpu->arch.mmu->lm_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_root_cr3:
|
||||||
|
vcpu->arch.mmu->root_cr3 = root_cr3;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4163,7 +4169,7 @@ static bool cached_root_available(struct kvm_vcpu *vcpu, gpa_t new_cr3,
|
|||||||
struct kvm_mmu_root_info root;
|
struct kvm_mmu_root_info root;
|
||||||
struct kvm_mmu *mmu = vcpu->arch.mmu;
|
struct kvm_mmu *mmu = vcpu->arch.mmu;
|
||||||
|
|
||||||
root.cr3 = mmu->get_cr3(vcpu);
|
root.cr3 = mmu->root_cr3;
|
||||||
root.hpa = mmu->root_hpa;
|
root.hpa = mmu->root_hpa;
|
||||||
|
|
||||||
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++) {
|
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++) {
|
||||||
@ -4176,6 +4182,7 @@ static bool cached_root_available(struct kvm_vcpu *vcpu, gpa_t new_cr3,
|
|||||||
}
|
}
|
||||||
|
|
||||||
mmu->root_hpa = root.hpa;
|
mmu->root_hpa = root.hpa;
|
||||||
|
mmu->root_cr3 = root.cr3;
|
||||||
|
|
||||||
return i < KVM_MMU_NUM_PREV_ROOTS;
|
return i < KVM_MMU_NUM_PREV_ROOTS;
|
||||||
}
|
}
|
||||||
@ -4770,6 +4777,7 @@ static union kvm_mmu_extended_role kvm_calc_mmu_role_ext(struct kvm_vcpu *vcpu)
|
|||||||
ext.cr4_pse = !!is_pse(vcpu);
|
ext.cr4_pse = !!is_pse(vcpu);
|
||||||
ext.cr4_pke = !!kvm_read_cr4_bits(vcpu, X86_CR4_PKE);
|
ext.cr4_pke = !!kvm_read_cr4_bits(vcpu, X86_CR4_PKE);
|
||||||
ext.cr4_la57 = !!kvm_read_cr4_bits(vcpu, X86_CR4_LA57);
|
ext.cr4_la57 = !!kvm_read_cr4_bits(vcpu, X86_CR4_LA57);
|
||||||
|
ext.maxphyaddr = cpuid_maxphyaddr(vcpu);
|
||||||
|
|
||||||
ext.valid = 1;
|
ext.valid = 1;
|
||||||
|
|
||||||
@ -5516,11 +5524,13 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu)
|
|||||||
vcpu->arch.walk_mmu = &vcpu->arch.root_mmu;
|
vcpu->arch.walk_mmu = &vcpu->arch.root_mmu;
|
||||||
|
|
||||||
vcpu->arch.root_mmu.root_hpa = INVALID_PAGE;
|
vcpu->arch.root_mmu.root_hpa = INVALID_PAGE;
|
||||||
|
vcpu->arch.root_mmu.root_cr3 = 0;
|
||||||
vcpu->arch.root_mmu.translate_gpa = translate_gpa;
|
vcpu->arch.root_mmu.translate_gpa = translate_gpa;
|
||||||
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++)
|
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++)
|
||||||
vcpu->arch.root_mmu.prev_roots[i] = KVM_MMU_ROOT_INFO_INVALID;
|
vcpu->arch.root_mmu.prev_roots[i] = KVM_MMU_ROOT_INFO_INVALID;
|
||||||
|
|
||||||
vcpu->arch.guest_mmu.root_hpa = INVALID_PAGE;
|
vcpu->arch.guest_mmu.root_hpa = INVALID_PAGE;
|
||||||
|
vcpu->arch.guest_mmu.root_cr3 = 0;
|
||||||
vcpu->arch.guest_mmu.translate_gpa = translate_gpa;
|
vcpu->arch.guest_mmu.translate_gpa = translate_gpa;
|
||||||
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++)
|
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++)
|
||||||
vcpu->arch.guest_mmu.prev_roots[i] = KVM_MMU_ROOT_INFO_INVALID;
|
vcpu->arch.guest_mmu.prev_roots[i] = KVM_MMU_ROOT_INFO_INVALID;
|
||||||
|
Loading…
Reference in New Issue
Block a user