Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbaff876 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull kvm fixes from Paolo Bonzini:
 "Another latent bug related to PCID, an out-of-bounds access, and a
  submaintainer change being finally made official"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
  MAINTAINERS: Add Paul Mackerras as maintainer for KVM/powerpc
  KVM: nVMX: fix guest CR4 loading when emulating L2 to L1 exit
  KVM: MMU: always terminate page walks at level 1
  KVM: nVMX: update last_nonleaf_level when initializing nested EPT
parents 73a752cc 8a60aea6
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -7571,7 +7571,7 @@ F: arch/mips/include/asm/kvm*
F:	arch/mips/kvm/
F:	arch/mips/kvm/


KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
KERNEL VIRTUAL MACHINE FOR POWERPC (KVM/powerpc)
M:	Alexander Graf <agraf@suse.com>
M:	Paul Mackerras <paulus@ozlabs.org>
L:	kvm-ppc@vger.kernel.org
L:	kvm-ppc@vger.kernel.org
W:	http://www.linux-kvm.org/
W:	http://www.linux-kvm.org/
T:	git git://github.com/agraf/linux-2.6.git
T:	git git://github.com/agraf/linux-2.6.git
+8 −7
Original line number Original line Diff line number Diff line
@@ -3973,13 +3973,6 @@ static bool sync_mmio_spte(struct kvm_vcpu *vcpu, u64 *sptep, gfn_t gfn,
static inline bool is_last_gpte(struct kvm_mmu *mmu,
static inline bool is_last_gpte(struct kvm_mmu *mmu,
				unsigned level, unsigned gpte)
				unsigned level, unsigned gpte)
{
{
	/*
	 * PT_PAGE_TABLE_LEVEL always terminates.  The RHS has bit 7 set
	 * iff level <= PT_PAGE_TABLE_LEVEL, which for our purpose means
	 * level == PT_PAGE_TABLE_LEVEL; set PT_PAGE_SIZE_MASK in gpte then.
	 */
	gpte |= level - PT_PAGE_TABLE_LEVEL - 1;

	/*
	/*
	 * The RHS has bit 7 set iff level < mmu->last_nonleaf_level.
	 * The RHS has bit 7 set iff level < mmu->last_nonleaf_level.
	 * If it is clear, there are no large pages at this level, so clear
	 * If it is clear, there are no large pages at this level, so clear
@@ -3987,6 +3980,13 @@ static inline bool is_last_gpte(struct kvm_mmu *mmu,
	 */
	 */
	gpte &= level - mmu->last_nonleaf_level;
	gpte &= level - mmu->last_nonleaf_level;


	/*
	 * PT_PAGE_TABLE_LEVEL always terminates.  The RHS has bit 7 set
	 * iff level <= PT_PAGE_TABLE_LEVEL, which for our purpose means
	 * level == PT_PAGE_TABLE_LEVEL; set PT_PAGE_SIZE_MASK in gpte then.
	 */
	gpte |= level - PT_PAGE_TABLE_LEVEL - 1;

	return gpte & PT_PAGE_SIZE_MASK;
	return gpte & PT_PAGE_SIZE_MASK;
}
}


@@ -4555,6 +4555,7 @@ void kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, bool execonly,


	update_permission_bitmask(vcpu, context, true);
	update_permission_bitmask(vcpu, context, true);
	update_pkru_bitmask(vcpu, context, true);
	update_pkru_bitmask(vcpu, context, true);
	update_last_nonleaf_level(vcpu, context);
	reset_rsvds_bits_mask_ept(vcpu, context, execonly);
	reset_rsvds_bits_mask_ept(vcpu, context, execonly);
	reset_ept_shadow_zero_bits_mask(vcpu, context, execonly);
	reset_ept_shadow_zero_bits_mask(vcpu, context, execonly);
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -334,10 +334,11 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
		--walker->level;
		--walker->level;


		index = PT_INDEX(addr, walker->level);
		index = PT_INDEX(addr, walker->level);

		table_gfn = gpte_to_gfn(pte);
		table_gfn = gpte_to_gfn(pte);
		offset    = index * sizeof(pt_element_t);
		offset    = index * sizeof(pt_element_t);
		pte_gpa   = gfn_to_gpa(table_gfn) + offset;
		pte_gpa   = gfn_to_gpa(table_gfn) + offset;

		BUG_ON(walker->level < 1);
		walker->table_gfn[walker->level - 1] = table_gfn;
		walker->table_gfn[walker->level - 1] = table_gfn;
		walker->pte_gpa[walker->level - 1] = pte_gpa;
		walker->pte_gpa[walker->level - 1] = pte_gpa;


+1 −1
Original line number Original line Diff line number Diff line
@@ -11297,7 +11297,7 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,


	/* Same as above - no reason to call set_cr4_guest_host_mask().  */
	/* Same as above - no reason to call set_cr4_guest_host_mask().  */
	vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK);
	vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK);
	kvm_set_cr4(vcpu, vmcs12->host_cr4);
	vmx_set_cr4(vcpu, vmcs12->host_cr4);


	nested_ept_uninit_mmu_context(vcpu);
	nested_ept_uninit_mmu_context(vcpu);