On Sun, Aug 28, 2022, Mingwei Zhang wrote: > Add support for posted interrupt handling in L2. This is done by adding > needed data structures in vmx_pages and APIs to allow an L2 receive posted > interrupts. > > Cc: Jim Mattson <jmattson@xxxxxxxxxx> > Signed-off-by: Mingwei Zhang <mizhang@xxxxxxxxxx> > --- > tools/testing/selftests/kvm/include/x86_64/vmx.h | 10 ++++++++++ > tools/testing/selftests/kvm/lib/x86_64/vmx.c | 14 ++++++++++++++ > 2 files changed, 24 insertions(+) > > diff --git a/tools/testing/selftests/kvm/include/x86_64/vmx.h b/tools/testing/selftests/kvm/include/x86_64/vmx.h > index 99fa1410964c..69784fc71bce 100644 > --- a/tools/testing/selftests/kvm/include/x86_64/vmx.h > +++ b/tools/testing/selftests/kvm/include/x86_64/vmx.h > @@ -577,6 +577,14 @@ struct vmx_pages { > void *apic_access_hva; > uint64_t apic_access_gpa; > void *apic_access; > + > + void *virtual_apic_hva; > + uint64_t virtual_apic_gpa; > + void *virtual_apic; > + > + void *posted_intr_desc_hva; > + uint64_t posted_intr_desc_gpa; > + void *posted_intr_desc; Can you add a prep patch to dedup the absurd amount of copy-paste code related to vmx_pages? I.e. take this and give all the other triplets the same treatment. --- tools/testing/selftests/kvm/include/x86_64/vmx.h | 10 +++++++--- tools/testing/selftests/kvm/lib/x86_64/vmx.c | 15 ++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/vmx.h b/tools/testing/selftests/kvm/include/x86_64/vmx.h index 99fa1410964c..ecc66d65acc1 100644 --- a/tools/testing/selftests/kvm/include/x86_64/vmx.h +++ b/tools/testing/selftests/kvm/include/x86_64/vmx.h @@ -537,10 +537,14 @@ static inline uint32_t vmcs_revision(void) return rdmsr(MSR_IA32_VMX_BASIC); } +struct vmx_page { + void *gva; + uint64_t gpa; + void *hva; +}; + struct vmx_pages { - void *vmxon_hva; - uint64_t vmxon_gpa; - void *vmxon; + struct vmx_page vmxon; void *vmcs_hva; uint64_t vmcs_gpa; diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c index 80a568c439b8..e4eeab85741a 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/vmx.c +++ b/tools/testing/selftests/kvm/lib/x86_64/vmx.c @@ -58,6 +58,13 @@ int vcpu_enable_evmcs(struct kvm_vcpu *vcpu) return evmcs_ver; } +static void vcpu_alloc_vmx_page(struct kvm_vm *vm, struct vmx_page *page) +{ + page->gva = (void *)vm_vaddr_alloc_page(vm); + page->hva = addr_gva2hva(vm, (uintptr_t)page->gva); + page->gpa = addr_gva2gpa(vm, (uintptr_t)page->gva); +} + /* Allocate memory regions for nested VMX tests. * * Input Args: @@ -76,9 +83,7 @@ vcpu_alloc_vmx(struct kvm_vm *vm, vm_vaddr_t *p_vmx_gva) struct vmx_pages *vmx = addr_gva2hva(vm, vmx_gva); /* Setup of a region of guest memory for the vmxon region. */ - vmx->vmxon = (void *)vm_vaddr_alloc_page(vm); - vmx->vmxon_hva = addr_gva2hva(vm, (uintptr_t)vmx->vmxon); - vmx->vmxon_gpa = addr_gva2gpa(vm, (uintptr_t)vmx->vmxon); + vcpu_alloc_vmx_page(vm, &vmx->vmxon); /* Setup of a region of guest memory for a vmcs. */ vmx->vmcs = (void *)vm_vaddr_alloc_page(vm); @@ -160,8 +165,8 @@ bool prepare_for_vmx_operation(struct vmx_pages *vmx) wrmsr(MSR_IA32_FEAT_CTL, feature_control | required); /* Enter VMX root operation. */ - *(uint32_t *)(vmx->vmxon) = vmcs_revision(); - if (vmxon(vmx->vmxon_gpa)) + *(uint32_t *)(vmx->vmxon.gva) = vmcs_revision(); + if (vmxon(vmx->vmxon.gpa)) return false; return true; base-commit: 372d07084593dc7a399bf9bee815711b1fb1bcf2 --