Commit 834cd93d authored by Quentin Perret's avatar Quentin Perret Committed by Marc Zyngier
Browse files

KVM: arm64: Use kvm_arch for stage 2 pgtable



In order to make use of the stage 2 pgtable code for the host stage 2,
use struct kvm_arch in lieu of struct kvm as the host will have the
former but not the latter.

Acked-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarQuentin Perret <qperret@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210319100146.1149909-20-qperret@google.com
parent bfa79a80
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -162,12 +162,13 @@ int kvm_pgtable_hyp_map(struct kvm_pgtable *pgt, u64 addr, u64 size, u64 phys,
/**
 * kvm_pgtable_stage2_init() - Initialise a guest stage-2 page-table.
 * @pgt:	Uninitialised page-table structure to initialise.
 * @kvm:	KVM structure representing the guest virtual machine.
 * @arch:	Arch-specific KVM structure representing the guest virtual
 *		machine.
 * @mm_ops:	Memory management callbacks.
 *
 * Return: 0 on success, negative error code on failure.
 */
int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm *kvm,
int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm_arch *arch,
			    struct kvm_pgtable_mm_ops *mm_ops);

/**
+3 −3
Original line number Diff line number Diff line
@@ -880,11 +880,11 @@ int kvm_pgtable_stage2_flush(struct kvm_pgtable *pgt, u64 addr, u64 size)
	return kvm_pgtable_walk(pgt, addr, size, &walker);
}

int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm *kvm,
int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm_arch *arch,
			    struct kvm_pgtable_mm_ops *mm_ops)
{
	size_t pgd_sz;
	u64 vtcr = kvm->arch.vtcr;
	u64 vtcr = arch->vtcr;
	u32 ia_bits = VTCR_EL2_IPA(vtcr);
	u32 sl0 = FIELD_GET(VTCR_EL2_SL0_MASK, vtcr);
	u32 start_level = VTCR_EL2_TGRAN_SL0_BASE - sl0;
@@ -897,7 +897,7 @@ int kvm_pgtable_stage2_init(struct kvm_pgtable *pgt, struct kvm *kvm,
	pgt->ia_bits		= ia_bits;
	pgt->start_level	= start_level;
	pgt->mm_ops		= mm_ops;
	pgt->mmu		= &kvm->arch.mmu;
	pgt->mmu		= &arch->mmu;

	/* Ensure zeroed PGD pages are visible to the hardware walker */
	dsb(ishst);
+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ int kvm_init_stage2_mmu(struct kvm *kvm, struct kvm_s2_mmu *mmu)
	if (!pgt)
		return -ENOMEM;

	err = kvm_pgtable_stage2_init(pgt, kvm, &kvm_s2_mm_ops);
	err = kvm_pgtable_stage2_init(pgt, &kvm->arch, &kvm_s2_mm_ops);
	if (err)
		goto out_free_pgtable;