On Mon, Dec 18, 2023, Peter Gonda wrote: > Carve out space in the @mode passed to the various VM creation helpers to > allow using the mode to control the subtype of VM, e.g. to identify x86's > SEV VMs (which are "regular" VMs as far as KVM is concerned). > > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Cc: Sean Christopherson <seanjc@xxxxxxxxxx> > Cc: Vishal Annapurve <vannapurve@xxxxxxxxxx> > Cc: Ackerley Tng <ackerleytng@xxxxxxxxxx> > Cc: Andrew Jones <andrew.jones@xxxxxxxxx> > Cc: Tom Lendacky <thomas.lendacky@xxxxxxx> > Cc: Michael Roth <michael.roth@xxxxxxx> > Signed-off-by: Peter Gonda <pgonda@xxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> SoB order is messed up. > --- > .../selftests/kvm/include/kvm_util_base.h | 82 ++++++++++++------- > tools/testing/selftests/kvm/lib/guest_modes.c | 2 +- > tools/testing/selftests/kvm/lib/kvm_util.c | 34 ++++---- > 3 files changed, 73 insertions(+), 45 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h > index a18db6a7b3cf..ca99cc41685d 100644 > --- a/tools/testing/selftests/kvm/include/kvm_util_base.h > +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h > @@ -43,6 +43,48 @@ > typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */ > typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */ > > +enum vm_guest_mode { > + VM_MODE_P52V48_4K, > + VM_MODE_P52V48_64K, > + VM_MODE_P48V48_4K, > + VM_MODE_P48V48_16K, > + VM_MODE_P48V48_64K, > + VM_MODE_P40V48_4K, > + VM_MODE_P40V48_16K, > + VM_MODE_P40V48_64K, > + VM_MODE_PXXV48_4K, /* For 48bits VA but ANY bits PA */ > + VM_MODE_P47V64_4K, > + VM_MODE_P44V64_4K, > + VM_MODE_P36V48_4K, > + VM_MODE_P36V48_16K, > + VM_MODE_P36V48_64K, > + VM_MODE_P36V47_16K, > + NUM_VM_MODES, > +}; > + > +enum vm_subtype { > + VM_SUBTYPE_DEFAULT, > + VM_SUBTYPE_SEV, > + NUM_VM_SUBTYPES, > +}; Now that "struct vm_shape" exists, this can be much more simply: diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h index 9e5afc472c14..c62b3fa4e9f6 100644 --- a/tools/testing/selftests/kvm/include/kvm_util_base.h +++ b/tools/testing/selftests/kvm/include/kvm_util_base.h @@ -90,6 +90,7 @@ enum kvm_mem_region_type { struct kvm_vm { int mode; unsigned long type; + uint8_t subtype; int kvm_fd; int fd; unsigned int pgtable_levels; @@ -191,10 +192,14 @@ enum vm_guest_mode { }; struct vm_shape { - enum vm_guest_mode mode; - unsigned int type; + uint32_t type; + uint8_t mode; + uint8_t subtype; + uint16_t padding; }; +kvm_static_assert(sizeof(struct vm_shape) == sizeof(uint64_t)); + #define VM_TYPE_DEFAULT 0 #define VM_SHAPE(__mode) \ diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index 1b197426f29f..b95640c935e2 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->pa_bits = vm_guest_mode_params[vm->mode].pa_bits; vm->va_bits = vm_guest_mode_params[vm->mode].va_bits;