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

Commit 3314bf6b authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull kvm fixes from Paolo Bonzini:
 "Last minute KVM/ARM fixes; even the generic change actually affects
  nothing but ARM"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
  kvm: fix kvm_is_mmio_pfn() and rename to kvm_is_reserved_pfn()
  arm/arm64: kvm: drop inappropriate use of kvm_is_mmio_pfn()
  arm/arm64: KVM: vgic: Fix error code in kvm_vgic_create()
  arm64: KVM: Handle traps of ICC_SRE_EL1 as RAZ/WI
  arm64: KVM: fix unmapping with 48-bit VAs
parents b914c5b2 d3fccc7e
Loading
Loading
Loading
Loading
+8 −2
Original line number Original line Diff line number Diff line
@@ -197,6 +197,7 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
	pgd = pgdp + pgd_index(addr);
	pgd = pgdp + pgd_index(addr);
	do {
	do {
		next = kvm_pgd_addr_end(addr, end);
		next = kvm_pgd_addr_end(addr, end);
		if (!pgd_none(*pgd))
			unmap_puds(kvm, pgd, addr, next);
			unmap_puds(kvm, pgd, addr, next);
	} while (pgd++, addr = next, addr != end);
	} while (pgd++, addr = next, addr != end);
}
}
@@ -834,6 +835,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
	return kvm_vcpu_dabt_iswrite(vcpu);
	return kvm_vcpu_dabt_iswrite(vcpu);
}
}


static bool kvm_is_device_pfn(unsigned long pfn)
{
	return !pfn_valid(pfn);
}

static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
			  struct kvm_memory_slot *memslot, unsigned long hva,
			  struct kvm_memory_slot *memslot, unsigned long hva,
			  unsigned long fault_status)
			  unsigned long fault_status)
@@ -904,7 +910,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
	if (is_error_pfn(pfn))
	if (is_error_pfn(pfn))
		return -EFAULT;
		return -EFAULT;


	if (kvm_is_mmio_pfn(pfn))
	if (kvm_is_device_pfn(pfn))
		mem_type = PAGE_S2_DEVICE;
		mem_type = PAGE_S2_DEVICE;


	spin_lock(&kvm->mmu_lock);
	spin_lock(&kvm->mmu_lock);
+9 −0
Original line number Original line Diff line number Diff line
@@ -424,6 +424,11 @@ static const struct sys_reg_desc sys_reg_descs[] = {
	/* VBAR_EL1 */
	/* VBAR_EL1 */
	{ Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000),
	{ Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000),
	  NULL, reset_val, VBAR_EL1, 0 },
	  NULL, reset_val, VBAR_EL1, 0 },

	/* ICC_SRE_EL1 */
	{ Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b1100), Op2(0b101),
	  trap_raz_wi },

	/* CONTEXTIDR_EL1 */
	/* CONTEXTIDR_EL1 */
	{ Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001),
	{ Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001),
	  access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 },
	  access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 },
@@ -690,6 +695,10 @@ static const struct sys_reg_desc cp15_regs[] = {
	{ Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR },
	{ Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR },
	{ Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 },
	{ Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 },
	{ Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },
	{ Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },

	/* ICC_SRE */
	{ Op1( 0), CRn(12), CRm(12), Op2( 5), trap_raz_wi },

	{ Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
	{ Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
};
};


+1 −1
Original line number Original line Diff line number Diff line
@@ -1563,7 +1563,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,


	for (i = 0; i < npages; i++) {
	for (i = 0; i < npages; i++) {
		pfn = gfn_to_pfn(kvm, base_gfn + i);
		pfn = gfn_to_pfn(kvm, base_gfn + i);
		if (!kvm_is_mmio_pfn(pfn)) {
		if (!kvm_is_reserved_pfn(pfn)) {
			kvm_set_pmt_entry(kvm, base_gfn + i,
			kvm_set_pmt_entry(kvm, base_gfn + i,
					pfn << PAGE_SHIFT,
					pfn << PAGE_SHIFT,
				_PAGE_AR_RWX | _PAGE_MA_WB);
				_PAGE_AR_RWX | _PAGE_MA_WB);
+3 −3
Original line number Original line Diff line number Diff line
@@ -630,7 +630,7 @@ static int mmu_spte_clear_track_bits(u64 *sptep)
	 * kvm mmu, before reclaiming the page, we should
	 * kvm mmu, before reclaiming the page, we should
	 * unmap it from mmu first.
	 * unmap it from mmu first.
	 */
	 */
	WARN_ON(!kvm_is_mmio_pfn(pfn) && !page_count(pfn_to_page(pfn)));
	WARN_ON(!kvm_is_reserved_pfn(pfn) && !page_count(pfn_to_page(pfn)));


	if (!shadow_accessed_mask || old_spte & shadow_accessed_mask)
	if (!shadow_accessed_mask || old_spte & shadow_accessed_mask)
		kvm_set_pfn_accessed(pfn);
		kvm_set_pfn_accessed(pfn);
@@ -2461,7 +2461,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
		spte |= PT_PAGE_SIZE_MASK;
		spte |= PT_PAGE_SIZE_MASK;
	if (tdp_enabled)
	if (tdp_enabled)
		spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
		spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
			kvm_is_mmio_pfn(pfn));
			kvm_is_reserved_pfn(pfn));


	if (host_writable)
	if (host_writable)
		spte |= SPTE_HOST_WRITEABLE;
		spte |= SPTE_HOST_WRITEABLE;
@@ -2737,7 +2737,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu,
	 * PT_PAGE_TABLE_LEVEL and there would be no adjustment done
	 * PT_PAGE_TABLE_LEVEL and there would be no adjustment done
	 * here.
	 * here.
	 */
	 */
	if (!is_error_noslot_pfn(pfn) && !kvm_is_mmio_pfn(pfn) &&
	if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
	    level == PT_PAGE_TABLE_LEVEL &&
	    level == PT_PAGE_TABLE_LEVEL &&
	    PageTransCompound(pfn_to_page(pfn)) &&
	    PageTransCompound(pfn_to_page(pfn)) &&
	    !has_wrprotected_page(vcpu->kvm, gfn, PT_DIRECTORY_LEVEL)) {
	    !has_wrprotected_page(vcpu->kvm, gfn, PT_DIRECTORY_LEVEL)) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -703,7 +703,7 @@ void kvm_arch_sync_events(struct kvm *kvm);
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
void kvm_vcpu_kick(struct kvm_vcpu *vcpu);
void kvm_vcpu_kick(struct kvm_vcpu *vcpu);


bool kvm_is_mmio_pfn(pfn_t pfn);
bool kvm_is_reserved_pfn(pfn_t pfn);


struct kvm_irq_ack_notifier {
struct kvm_irq_ack_notifier {
	struct hlist_node link;
	struct hlist_node link;
Loading