Currently, all the VMs are created with in-kernel APIC support in KVM
selftests because KVM_CREATE_IRQCHIP ioctl is called by default from
kvm_arch_vm_post_create().

Carve out space in the @shape passed to the various VM creation helpers to
allow using the shape to control creation of a VM without in-kernel APIC
support or with in-kernel APIC support.

This is a preparatory patch to create a vm without in-kernel APIC support for
the KVM_X86_DISABLE_EXITS_HLT test.

Suggested-by: Andrew Jones <ajo...@ventanamicro.com>
Signed-off-by: Manali Shukla <manali.shu...@amd.com>
---
 .../selftests/kvm/include/kvm_util_base.h       | 17 ++++++++++++++++-
 tools/testing/selftests/kvm/lib/kvm_util.c      |  1 +
 .../selftests/kvm/lib/x86_64/processor.c        |  4 +++-
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h 
b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 4a40b332115d..c94cfbdf0150 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -130,6 +130,7 @@ struct kvm_vm {
         * memslot.
         */
        uint32_t memslots[NR_MEM_REGIONS];
+       uint8_t flags;
 };
 
 struct vcpu_reg_sublist {
@@ -197,11 +198,14 @@ enum vm_guest_mode {
        NUM_VM_MODES,
 };
 
+#define NO_IRQCHIP  0x01
+
 struct vm_shape {
        uint32_t type;
        uint8_t  mode;
        uint8_t  subtype;
-       uint16_t padding;
+       uint8_t  flags;
+       uint8_t padding;
 };
 
 kvm_static_assert(sizeof(struct vm_shape) == sizeof(uint64_t));
@@ -218,6 +222,17 @@ kvm_static_assert(sizeof(struct vm_shape) == 
sizeof(uint64_t));
        shape;                                  \
 })
 
+#define VM_SHAPE_FLAGS(__FLAGS)                        \
+({                                             \
+       struct vm_shape shape = {               \
+               .mode = VM_MODE_DEFAULT,        \
+               .type = VM_TYPE_DEFAULT,        \
+               .flags = __FLAGS                \
+       };                                      \
+                                               \
+       shape;                                  \
+})
+
 #if defined(__aarch64__)
 
 extern enum vm_guest_mode vm_mode_default;
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c 
b/tools/testing/selftests/kvm/lib/kvm_util.c
index adc51b0712ca..86546f603959 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -226,6 +226,7 @@ struct kvm_vm *____vm_create(struct vm_shape shape)
        vm->mode = shape.mode;
        vm->type = shape.type;
        vm->subtype = shape.subtype;
+       vm->flags = shape.flags;
 
        vm->pa_bits = vm_guest_mode_params[vm->mode].pa_bits;
        vm->va_bits = vm_guest_mode_params[vm->mode].va_bits;
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c 
b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index 49288fe10cd3..e5ca92feae67 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -574,7 +574,9 @@ static void vcpu_setup(struct kvm_vm *vm, struct kvm_vcpu 
*vcpu)
 
 void kvm_arch_vm_post_create(struct kvm_vm *vm)
 {
-       vm_create_irqchip(vm);
+       if (!(vm->flags & NO_IRQCHIP))
+               vm_create_irqchip(vm);
+
        sync_global_to_guest(vm, host_cpu_is_intel);
        sync_global_to_guest(vm, host_cpu_is_amd);
 
-- 
2.34.1


Reply via email to