Commit 3338c639 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: SVM: Add helper to deduplicate code for getting AVIC backing page



Add a helper to get the physical address of the AVIC backing page, both
to deduplicate code and to prepare for getting the address directly from
apic->regs, at which point it won't be all that obvious that the address
in question is what SVM calls the AVIC backing page.

No functional change intended.

Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Tested-by: default avatarSairaj Kodilkar <sarunkod@amd.com>
Reviewed-by: default avatarNaveen N Rao (AMD) <naveen@kernel.org>
Link: https://lore.kernel.org/r/20250611224604.313496-12-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 2e002ddc
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -235,14 +235,18 @@ int avic_vm_init(struct kvm *kvm)
	return err;
}

static phys_addr_t avic_get_backing_page_address(struct vcpu_svm *svm)
{
	return __sme_set(page_to_phys(svm->avic_backing_page));
}

void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb)
{
	struct kvm_svm *kvm_svm = to_kvm_svm(svm->vcpu.kvm);
	phys_addr_t bpa = __sme_set(page_to_phys(svm->avic_backing_page));
	phys_addr_t lpa = __sme_set(page_to_phys(kvm_svm->avic_logical_id_table_page));
	phys_addr_t ppa = __sme_set(page_to_phys(kvm_svm->avic_physical_id_table_page));

	vmcb->control.avic_backing_page = bpa;
	vmcb->control.avic_backing_page = avic_get_backing_page_address(svm);
	vmcb->control.avic_logical_id = lpa;
	vmcb->control.avic_physical_id = ppa;
	vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE;
@@ -306,7 +310,7 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu)
	BUILD_BUG_ON(__PHYSICAL_MASK_SHIFT >
		     fls64(AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK));

	new_entry = __sme_set(page_to_phys(svm->avic_backing_page)) |
	new_entry = avic_get_backing_page_address(svm) |
		    AVIC_PHYSICAL_ID_ENTRY_VALID_MASK;
	WRITE_ONCE(*entry, new_entry);

@@ -846,7 +850,7 @@ get_pi_vcpu_info(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e,
	pr_debug("SVM: %s: use GA mode for irq %u\n", __func__,
		 irq.vector);
	*svm = to_svm(vcpu);
	vcpu_info->pi_desc_addr = __sme_set(page_to_phys((*svm)->avic_backing_page));
	vcpu_info->pi_desc_addr = avic_get_backing_page_address(*svm);
	vcpu_info->vector = irq.vector;

	return 0;
@@ -907,7 +911,7 @@ int avic_pi_update_irte(struct kvm_kernel_irqfd *irqfd, struct kvm *kvm,
			enable_remapped_mode = false;

			/* Try to enable guest_mode in IRTE */
			pi.base = __sme_set(page_to_phys(svm->avic_backing_page));
			pi.base = avic_get_backing_page_address(svm);
			pi.ga_tag = AVIC_GATAG(to_kvm_svm(kvm)->avic_vm_id,
						     svm->vcpu.vcpu_id);
			pi.is_guest_mode = true;