2022-03-11 22:10:11

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

First off, hopefully I didn't just spam you with 106 emails. In theory,
unless you're subscribed to LKML, you should see only the cover letter
and everything else should be on lore if you want to pull down the mbox
(instead of saying "LOL, 105 patches!?!?", or maybe after you say that).

This is a (very) early RFC for overhauling KVM's selftests APIs. It's
compile tested only (maybe), there are no changelogs, etc...

My end goal with an overhaul is to get to a state where adding new
features and writing tests is less painful/disgusting (I feel dirty every
time I copy+paste VCPU_ID). I opted to directly send only the cover
letter because most of the individual patches aren't all that interesting,
there's still 46 patches even if the per-test conversions are omitted, and
it's the final state that I really care about and want to discuss.

The overarching theme of my take on where to go with selftests is to stop
treating tests like second class citizens. Stop hiding vcpu, kvm_vm, etc...
There's no sensitive data/constructs, and the encapsulation has led to
really, really bad and difficult to maintain code. E.g. Want to call a
vCPU ioctl()? Hope you have the VM...

The other theme in the rework is to deduplicate code and try to set us
up for success in the future. E.g. provide macros/helpers instead of
spamming CTRL-C => CTRL-V (see the -700 LoC).

I was hoping to get this into a less shabby state before posting, but I'm
I'm going to be OOO for the next few weeks and want to get the ball rolling
instead of waiting another month or so.

Based on an older version of kvm/queue. The full thing is also on github:

https://github.com/sean-jc/linux.git x86/selftests_overhaul

Cc: [email protected]
Cc: Paolo Bonzini <[email protected]>
Cc: Vitaly Kuznetsov <[email protected]>
Cc: Wanpeng Li <[email protected]>
Cc: Jim Mattson <[email protected]>
Cc: Joerg Roedel <[email protected]>
Cc: Andrew Jones <[email protected]>
Cc: Thomas Huth <[email protected]>
Cc: Janosch Frank <[email protected]>
Cc: Claudio Imbrenda <[email protected]>
Cc: David Hildenbrand <[email protected]>
Cc: David Matlack <[email protected]>
Cc: Ben Gardon <[email protected]>
Cc: Oliver Upton <[email protected]>

Sean Christopherson (105):
KVM: selftests: Fix buggy check in test_v3_new_redist_regions()
KVM: selftests: Always open VM file descriptors with O_RDWR
KVM: selftest: Add another underscore to inner ioctl helpers
KVM: selftests: Make vcpu_ioctl() a wrapper to pretty print ioctl name
KVM: selftests: Drop @mode from common vm_create() helper
KVM: selftests: Split vcpu_set_nested_state() into two helpers
KVM: selftests: Add hyperv_svm_test test binary to .gitignore
KVM: sefltests: Use vcpu_ioctl() and __vcpu_ioctl() helpers
KVM: selftests: Add __vcpu_run() helper
KVM: selftests: Use vcpu_access_device_attr() in arm64 code
KVM: selftests: Remove vcpu_get_fd()
KVM: selftests: Add vcpu_get() to retrieve and assert on vCPU
existence
KVM: selftests: Make vm_ioctl() a wrapper to pretty print ioctl name
KVM: sefltests: Use vm_ioctl() and __vm_ioctl() helpers
KVM: selftests: Make kvm_ioctl() a wrapper to pretty print ioctl name
KVM: selftests: Use kvm_ioctl() helpers
KVM: selftests: Make x86-64's register dump helpers static
KVM: selftests: Get rid of kvm_util_internal.h
KVM: selftests: Use KVM_IOCTL_ERROR() for one-off arm64 ioctls
KVM: selftests: Drop @test param from kvm_create_device()
KVM: selftests: Move KVM_CREATE_DEVICE_TEST code to separate helper
KVM: selftests: Multiplex return code and fd in __kvm_create_device()
KVM: selftests: Rename KVM_HAS_DEVICE_ATTR helpers for consistency
KVM: selftests: Drop 'int' return from asserting *_device_has_attr()
KVM: selftests: Split get/set device_attr helpers
KVM: selftests: Add a VM backpointer to 'struct vcpu'
KVM: selftests: Add vm_create_*() variants to expose/return 'struct
vcpu'
KVM: selftests: Rename vcpu.state => vcpu.run
KVM: selftests: Rename 'struct vcpu' to 'struct kvm_vcpu'
KVM: selftests: Return the created vCPU from vm_vcpu_add()
KVM: selftests: Convert memslot_perf_test away from VCPU_ID
KVM: selftests: Convert rseq_test away from VCPU_ID
KVM: selftests: Convert xss_msr_test away from VCPU_ID
KVM: selftests: Convert vmx_preemption_timer_test away from VCPU_ID
KVM: selftests: Convert vmx_pmu_msrs_test away from VCPU_ID
KVM: selftests: Convert vmx_set_nested_state_test away from VCPU_ID
KVM: selftests: Convert vmx_tsc_adjust_test away from VCPU_ID
KVM: selftests: Convert mmu_role_test away from VCPU_ID
KVM: selftests: Convert pmu_event_filter_test away from VCPU_ID
KVM: selftests: Convert smm_test away from VCPU_ID
KVM: selftests: Convert state_test away from VCPU_ID
KVM: selftests: Convert svm_int_ctl_test away from VCPU_ID
KVM: selftests: Convert svm_vmcall_test away from VCPU_ID
KVM: selftests: Convert sync_regs_test away from VCPU_ID
KVM: selftests: Convert hyperv_cpuid away from VCPU_ID
KVM: selftests: Convert kvm_pv_test away from VCPU_ID
KVM: selftests: Convert platform_info_test away from VCPU_ID
KVM: selftests: Convert vmx_nested_tsc_scaling_test away from VCPU_ID
KVM: selftests: Convert set_sregs_test away from VCPU_ID
KVM: selftests: Convert vmx_dirty_log_test away from VCPU_ID
KVM: selftests: Convert vmx_close_while_nested_test away from VCPU_ID
KVM: selftests: Convert vmx_apic_access_test away from VCPU_ID
KVM: selftests: Convert userspace_msr_exit_test away from VCPU_ID
KVM: selftests: Convert vmx_exception_with_invalid_guest_state away
from VCPU_ID
KVM: selftests: Convert tsc_msrs_test away from VCPU_ID
KVM: selftests: Convert kvm_clock_test away from VCPU_ID
KVM: selftests: Convert hyperv_svm_test away from VCPU_ID
KVM: selftests: Convert hyperv_features away from VCPU_ID
KVM: selftests: Convert hyperv_clock away from VCPU_ID
KVM: selftests: Convert evmcs_test away from VCPU_ID
KVM: selftests: Convert emulator_error_test away from VCPU_ID
KVM: selftests: Convert debug_regs away from VCPU_ID
KVM: selftests: Add proper helper for advancing RIP in debug_regs
KVM: selftests: Convert amx_test away from VCPU_ID
KVM: selftests: Convert cr4_cpuid_sync_test away from VCPU_ID
KVM: selftests: Convert cpuid_test away from VCPU_ID
KVM: selftests: Convert userspace_io_test away from VCPU_ID
KVM: selftests: Convert vmx_invalid_nested_guest_state away from
VCPU_ID
KVM: selftests: Convert xen_vmcall_test away from VCPU_ID
KVM: selftests: Convert xen_shinfo_test away from VCPU_ID
KVM: selftests: Convert dirty_log_test away from VCPU_ID
KVM: selftests: Convert set_memory_region_test away from VCPU_ID
KVM: selftests: Convert system_counter_offset_test away from VCPU_ID
KVM: selftests: Convert debug-exceptions away from VCPU_ID
KVM: selftests: Convert vgic_irq.c include/aarch64/vgic.h
lib/aarch64/vgic away from VCPU_ID
KVM: selftests: Make arm64's guest_get_vcpuid() declaration arm64-only
KVM: selftests: Move vm_is_unrestricted_guest() to x86-64
KVM: selftests: Add "arch" to common utils that have arch
implementations
KVM: selftests: Return created vcpu from vm_vcpu_add_default()
KVM: selftests: Rename vm_vcpu_add* helpers to better show
relationships
KVM: selftests: Convert set_boot_cpu_id away from VCPU_ID
KVM: selftests: Convert psci_cpu_on_test away from VCPU_ID
KVM: selftests: Convert hardware_disable_test away from VCPU_ID
KVM: selftests: Add VM creation helper that "returns" vCPUs
KVM: selftests: Convert steal_time away from VCPU_ID
KVM: selftests: Convert arch_timer away from VCPU_ID
KVM: selftests: Fix typo in vgic_init test
KVM: selftests: Convert vgic_init away from
vm_create_default_with_vcpus()
KVM: selftests: Convert xapic_ipi_test away from *_VCPU_ID
KVM: selftests: Convert sync_regs_test away from VCPU_ID
KVM: selftests: Convert resets away from VCPU_ID
KVM: selftests: Convert memop away from VCPU_ID
KVM: selftests: Convert s390x/diag318_test_handler away from VCPU_ID
KVM: selftests: Drop vm_create_default* helpers
KVM: selftests: Drop vcpuids param from VM creators
KVM: selftests: Convert kvm_page_table_test away from reliance on
vcpu_id
KVM: selftests: Convert kvm_binary_stats_test away from VCPU_ID
KVM: selftests: Convert get-reg-list away from VCPU_ID
KVM: selftests: Stop conflating vCPU index and ID in perf tests
KVM: selftests: Remove vcpu_get() usage from dirty_log_test
KVM: selftests: Require vCPU output array when creating VM with vCPUs
KVM: selftest: Purge vm+vcpu_id == vcpu silliness
KVM: selftests: Drop vcpu_get(), rename vcpu_find() => vcpu_exists()
KVM: selftests: Remove vcpu_state() helper
KVM: selftests: Open code and drop kvm_vm accessors

tools/testing/selftests/kvm/.gitignore | 1 +
.../selftests/kvm/aarch64/arch_timer.c | 68 +-
.../selftests/kvm/aarch64/debug-exceptions.c | 17 +-
.../selftests/kvm/aarch64/get-reg-list.c | 19 +-
.../selftests/kvm/aarch64/psci_cpu_on_test.c | 22 +-
.../testing/selftests/kvm/aarch64/vgic_init.c | 369 +++----
.../testing/selftests/kvm/aarch64/vgic_irq.c | 30 +-
.../selftests/kvm/access_tracking_perf_test.c | 81 +-
.../selftests/kvm/demand_paging_test.c | 39 +-
.../selftests/kvm/dirty_log_perf_test.c | 42 +-
tools/testing/selftests/kvm/dirty_log_test.c | 80 +-
.../selftests/kvm/hardware_disable_test.c | 27 +-
.../selftests/kvm/include/aarch64/processor.h | 20 +-
.../selftests/kvm/include/aarch64/vgic.h | 6 +-
.../selftests/kvm/include/kvm_util_base.h | 677 ++++++++----
.../selftests/kvm/include/perf_test_util.h | 5 +-
.../selftests/kvm/include/riscv/processor.h | 8 +-
.../selftests/kvm/include/ucall_common.h | 2 +-
.../selftests/kvm/include/x86_64/evmcs.h | 2 +-
.../selftests/kvm/include/x86_64/processor.h | 52 +-
.../selftests/kvm/kvm_binary_stats_test.c | 27 +-
.../selftests/kvm/kvm_create_max_vcpus.c | 4 +-
.../selftests/kvm/kvm_page_table_test.c | 66 +-
.../selftests/kvm/lib/aarch64/processor.c | 79 +-
.../testing/selftests/kvm/lib/aarch64/ucall.c | 9 +-
.../testing/selftests/kvm/lib/aarch64/vgic.c | 44 +-
tools/testing/selftests/kvm/lib/elf.c | 1 -
tools/testing/selftests/kvm/lib/guest_modes.c | 6 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 981 +++---------------
.../selftests/kvm/lib/kvm_util_internal.h | 128 ---
.../selftests/kvm/lib/perf_test_util.c | 84 +-
.../selftests/kvm/lib/riscv/processor.c | 110 +-
tools/testing/selftests/kvm/lib/riscv/ucall.c | 7 +-
.../kvm/lib/s390x/diag318_test_handler.c | 9 +-
.../selftests/kvm/lib/s390x/processor.c | 44 +-
tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 +-
.../selftests/kvm/lib/x86_64/processor.c | 311 ++----
tools/testing/selftests/kvm/lib/x86_64/svm.c | 1 -
.../testing/selftests/kvm/lib/x86_64/ucall.c | 10 +-
tools/testing/selftests/kvm/lib/x86_64/vmx.c | 5 +-
.../kvm/memslot_modification_stress_test.c | 13 +-
.../testing/selftests/kvm/memslot_perf_test.c | 28 +-
tools/testing/selftests/kvm/rseq_test.c | 9 +-
tools/testing/selftests/kvm/s390x/memop.c | 31 +-
tools/testing/selftests/kvm/s390x/resets.c | 137 +--
.../selftests/kvm/s390x/sync_regs_test.c | 37 +-
.../selftests/kvm/set_memory_region_test.c | 45 +-
tools/testing/selftests/kvm/steal_time.c | 120 +--
.../kvm/system_counter_offset_test.c | 29 +-
tools/testing/selftests/kvm/x86_64/amx_test.c | 33 +-
.../testing/selftests/kvm/x86_64/cpuid_test.c | 29 +-
.../kvm/x86_64/cr4_cpuid_sync_test.c | 17 +-
.../testing/selftests/kvm/x86_64/debug_regs.c | 72 +-
.../kvm/x86_64/emulator_error_test.c | 65 +-
.../testing/selftests/kvm/x86_64/evmcs_test.c | 51 +-
.../kvm/x86_64/get_msr_index_features.c | 16 +-
.../selftests/kvm/x86_64/hyperv_clock.c | 25 +-
.../selftests/kvm/x86_64/hyperv_cpuid.c | 25 +-
.../selftests/kvm/x86_64/hyperv_features.c | 51 +-
.../selftests/kvm/x86_64/hyperv_svm_test.c | 14 +-
.../selftests/kvm/x86_64/kvm_clock_test.c | 23 +-
.../selftests/kvm/x86_64/kvm_pv_test.c | 25 +-
.../selftests/kvm/x86_64/mmio_warning_test.c | 6 +-
.../selftests/kvm/x86_64/mmu_role_test.c | 20 +-
.../selftests/kvm/x86_64/platform_info_test.c | 34 +-
.../kvm/x86_64/pmu_event_filter_test.c | 60 +-
.../selftests/kvm/x86_64/set_boot_cpu_id.c | 87 +-
.../selftests/kvm/x86_64/set_sregs_test.c | 47 +-
.../selftests/kvm/x86_64/sev_migrate_tests.c | 17 +-
tools/testing/selftests/kvm/x86_64/smm_test.c | 37 +-
.../testing/selftests/kvm/x86_64/state_test.c | 29 +-
.../selftests/kvm/x86_64/svm_int_ctl_test.c | 21 +-
.../selftests/kvm/x86_64/svm_vmcall_test.c | 16 +-
.../selftests/kvm/x86_64/sync_regs_test.c | 52 +-
.../selftests/kvm/x86_64/tsc_msrs_test.c | 35 +-
.../selftests/kvm/x86_64/userspace_io_test.c | 18 +-
.../kvm/x86_64/userspace_msr_exit_test.c | 165 ++-
.../kvm/x86_64/vmx_apic_access_test.c | 18 +-
.../kvm/x86_64/vmx_close_while_nested_test.c | 17 +-
.../selftests/kvm/x86_64/vmx_dirty_log_test.c | 13 +-
.../vmx_exception_with_invalid_guest_state.c | 62 +-
.../x86_64/vmx_invalid_nested_guest_state.c | 18 +-
.../kvm/x86_64/vmx_nested_tsc_scaling_test.c | 19 +-
.../selftests/kvm/x86_64/vmx_pmu_msrs_test.c | 25 +-
.../kvm/x86_64/vmx_preemption_timer_test.c | 30 +-
.../kvm/x86_64/vmx_set_nested_state_test.c | 86 +-
.../kvm/x86_64/vmx_tsc_adjust_test.c | 12 +-
.../selftests/kvm/x86_64/xapic_ipi_test.c | 48 +-
.../selftests/kvm/x86_64/xen_shinfo_test.c | 35 +-
.../selftests/kvm/x86_64/xen_vmcall_test.c | 17 +-
.../selftests/kvm/x86_64/xss_msr_test.c | 10 +-
91 files changed, 2363 insertions(+), 3087 deletions(-)
delete mode 100644 tools/testing/selftests/kvm/lib/kvm_util_internal.h


base-commit: f6ae04ddb347f526b4620d1053690ecf1f87d77f
--
2.35.1.723.g4982287a31-goog


2022-03-11 22:11:08

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 029/105] KVM: selftests: Rename 'struct vcpu' to 'struct kvm_vcpu'

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 11 ++++---
tools/testing/selftests/kvm/lib/kvm_util.c | 32 +++++++++----------
.../selftests/kvm/lib/s390x/processor.c | 2 +-
.../selftests/kvm/lib/x86_64/processor.c | 8 ++---
4 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index a71b532f07b2..bf9fe3b17705 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -16,6 +16,7 @@
#include <linux/kvm.h>
#include "linux/rbtree.h"

+
#include <sys/ioctl.h>

#include "sparsebit.h"
@@ -43,7 +44,7 @@ struct userspace_mem_region {
struct hlist_node slot_node;
};

-struct vcpu {
+struct kvm_vcpu {
struct list_head list;
uint32_t id;
int fd;
@@ -92,7 +93,7 @@ struct kvm_vm {
continue; \
else

-struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);
+struct kvm_vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);

/*
* Virtual Translation Tables Dump
@@ -624,17 +625,17 @@ struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
* Create a VM with a single vCPU with reasonable defaults and @extra_mem_pages
* additional pages of guest memory. Returns the VM and vCPU (via out param).
*/
-struct kvm_vm *__vm_create_with_one_vcpu(struct vcpu **vcpu,
+struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,
uint64_t extra_mem_pages,
void *guest_code);

-static inline struct kvm_vm *vm_create_with_one_vcpu(struct vcpu **vcpu,
+static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,
void *guest_code)
{
return __vm_create_with_one_vcpu(vcpu, 0, guest_code);
}

-struct vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm);
+struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm);

/*
* Adds a vCPU with reasonable defaults (e.g. a stack)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index d164b3962bb7..7ce12a163483 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -365,7 +365,7 @@ struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
(uint32_t []){ vcpuid });
}

-struct kvm_vm *__vm_create_with_one_vcpu(struct vcpu **vcpu,
+struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,
uint64_t extra_mem_pages,
void *guest_code)
{
@@ -409,7 +409,7 @@ void kvm_vm_restart(struct kvm_vm *vmp)
}
}

-struct vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
+struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
{
kvm_vm_restart(vm);

@@ -488,23 +488,23 @@ kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
return &region->region;
}

-static struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid)
+static struct kvm_vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpu_id)
{
- struct vcpu *vcpu;
+ struct kvm_vcpu *vcpu;

list_for_each_entry(vcpu, &vm->vcpus, list) {
- if (vcpu->id == vcpuid)
+ if (vcpu->id == vcpu_id)
return vcpu;
}

return NULL;
}

-struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid)
+struct kvm_vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpu_id)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_find(vm, vcpu_id);

- TEST_ASSERT(vcpu, "vCPU %d does not exist", vcpuid);
+ TEST_ASSERT(vcpu, "vCPU %d does not exist", vcpu_id);
return vcpu;
}

@@ -520,7 +520,7 @@ struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid)
*
* Removes a vCPU from a VM and frees its resources.
*/
-static void vm_vcpu_rm(struct kvm_vm *vm, struct vcpu *vcpu)
+static void vm_vcpu_rm(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
{
int ret;

@@ -544,7 +544,7 @@ static void vm_vcpu_rm(struct kvm_vm *vm, struct vcpu *vcpu)

void kvm_vm_release(struct kvm_vm *vmp)
{
- struct vcpu *vcpu, *tmp;
+ struct kvm_vcpu *vcpu, *tmp;
int ret;

list_for_each_entry_safe(vcpu, tmp, &vmp->vcpus, list)
@@ -1073,7 +1073,7 @@ static int vcpu_mmap_sz(void)
*/
void vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu;
+ struct kvm_vcpu *vcpu;

/* Confirm a vcpu with the specified id doesn't already exist. */
TEST_ASSERT(!vcpu_find(vm, vcpuid), "vCPU%d already exists\n", vcpuid);
@@ -1448,7 +1448,7 @@ void vm_create_irqchip(struct kvm_vm *vm)
*/
struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);

return vcpu->run;
}
@@ -1489,7 +1489,7 @@ int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)

void vcpu_run_complete_io(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);
int ret;

vcpu->run->immediate_exit = 1;
@@ -1533,7 +1533,7 @@ struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid)
int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid,
unsigned long cmd, void *arg)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);

return ioctl(vcpu->fd, cmd, arg);
}
@@ -1548,7 +1548,7 @@ void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,

void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);
uint32_t size = vm->dirty_ring_size;

TEST_ASSERT(size > 0, "Should enable dirty ring first");
@@ -1765,7 +1765,7 @@ void vm_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
{
int ctr;
struct userspace_mem_region *region;
- struct vcpu *vcpu;
+ struct kvm_vcpu *vcpu;

fprintf(stream, "%*smode: 0x%x\n", indent, "", vm->mode);
fprintf(stream, "%*sfd: %i\n", indent, "", vm->fd);
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index df9d9650d916..aec15ca9d887 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -207,7 +207,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)

void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);

fprintf(stream, "%*spstate: psw: 0x%.16llx:0x%.16llx\n",
indent, "", vcpu->run->psw_mask, vcpu->run->psw_addr);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index e9b3f254e8f9..289a73262f8c 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -805,7 +805,7 @@ uint64_t kvm_get_feature_msr(uint64_t msr_index)
*/
struct kvm_cpuid2 *vcpu_get_cpuid(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);
struct kvm_cpuid2 *cpuid;
int max_ent;
int rc = -1;
@@ -982,7 +982,7 @@ struct kvm_msr_list *kvm_get_msr_index_list(void)
return list;
}

-static int vcpu_save_xsave_state(struct kvm_vm *vm, struct vcpu *vcpu,
+static int vcpu_save_xsave_state(struct kvm_vm *vm, struct kvm_vcpu *vcpu,
struct kvm_x86_state *state)
{
int size;
@@ -1000,7 +1000,7 @@ static int vcpu_save_xsave_state(struct kvm_vm *vm, struct vcpu *vcpu,

struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);
struct kvm_msr_list *list;
struct kvm_x86_state *state;
int nmsrs, r, i;
@@ -1081,7 +1081,7 @@ struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid)

void vcpu_load_state(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_x86_state *state)
{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
+ struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);
int r;

r = ioctl(vcpu->fd, KVM_SET_SREGS, &state->sregs);
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:12:44

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 084/105] KVM: selftests: Add VM creation helper that "returns" vCPUs

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 16 ++++++++++++----
.../testing/selftests/kvm/kvm_page_table_test.c | 4 ++--
tools/testing/selftests/kvm/lib/kvm_util.c | 17 ++++++++++-------
.../testing/selftests/kvm/lib/perf_test_util.c | 4 ++--
4 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 14457f98080b..051d9707e2e7 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -541,11 +541,19 @@ struct kvm_vm *vm_create_default_with_vcpus(uint32_t nr_vcpus, uint64_t extra_me
uint32_t vcpuids[]);

/* Like vm_create_default_with_vcpus, but accepts mode and slot0 memory as a parameter */
-struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
- uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
- uint32_t num_percpu_pages, void *guest_code,
- uint32_t vcpuids[]);
+struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
+ uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
+ uint32_t num_percpu_pages, void *guest_code,
+ uint32_t vcpuids[], struct kvm_vcpu *vcpus[]);

+static inline struct kvm_vm *vm_create_with_vcpus(uint32_t nr_vcpus,
+ void *guest_code,
+ struct kvm_vcpu *vcpus[])
+{
+ return __vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus,
+ DEFAULT_GUEST_PHY_PAGES, 0, 0,
+ guest_code, NULL, vcpus);
+}

/*
* Create a VM with a single vCPU with reasonable defaults and @extra_mem_pages
diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
index ba1fdc3dcf4a..b969257f646d 100644
--- a/tools/testing/selftests/kvm/kvm_page_table_test.c
+++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
@@ -268,8 +268,8 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)

/* Create a VM with enough guest pages */
guest_num_pages = test_mem_size / guest_page_size;
- vm = vm_create_with_vcpus(mode, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
- guest_num_pages, 0, guest_code, NULL);
+ vm = __vm_create_with_vcpus(mode, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
+ guest_num_pages, 0, guest_code, NULL, NULL);

/* Align down GPA of the testing memslot */
if (!p->phys_offset)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 1580d4888d74..de568d0a2ccc 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -305,12 +305,13 @@ struct kvm_vm *vm_create(uint64_t phy_pages)
* extra_mem_pages is only used to calculate the maximum page table size,
* no real memory allocation for non-slot0 memory in this function.
*/
-struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
- uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
- uint32_t num_percpu_pages, void *guest_code,
- uint32_t vcpuids[])
+struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
+ uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
+ uint32_t num_percpu_pages, void *guest_code,
+ uint32_t vcpuids[], struct kvm_vcpu *vcpus[])
{
uint64_t vcpu_pages, extra_pg_pages, pages;
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
int i;

@@ -344,7 +345,9 @@ struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
for (i = 0; i < nr_vcpus; ++i) {
uint32_t vcpuid = vcpuids ? vcpuids[i] : i;

- vm_vcpu_add(vm, vcpuid, guest_code);
+ vcpu = vm_vcpu_add(vm, vcpuid, guest_code);
+ if (vcpus)
+ vcpus[i] = vcpu;
}

return vm;
@@ -354,8 +357,8 @@ struct kvm_vm *vm_create_default_with_vcpus(uint32_t nr_vcpus, uint64_t extra_me
uint32_t num_percpu_pages, void *guest_code,
uint32_t vcpuids[])
{
- return vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
- extra_mem_pages, num_percpu_pages, guest_code, vcpuids);
+ return __vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
+ extra_mem_pages, num_percpu_pages, guest_code, vcpuids, NULL);
}

struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
diff --git a/tools/testing/selftests/kvm/lib/perf_test_util.c b/tools/testing/selftests/kvm/lib/perf_test_util.c
index 722df3a28791..5b80ba7f12e4 100644
--- a/tools/testing/selftests/kvm/lib/perf_test_util.c
+++ b/tools/testing/selftests/kvm/lib/perf_test_util.c
@@ -139,8 +139,8 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,
* The memory is also added to memslot 0, but that's a benign side
* effect as KVM allows aliasing HVAs in meslots.
*/
- vm = vm_create_with_vcpus(mode, vcpus, DEFAULT_GUEST_PHY_PAGES,
- guest_num_pages, 0, guest_code, NULL);
+ vm = __vm_create_with_vcpus(mode, vcpus, DEFAULT_GUEST_PHY_PAGES,
+ guest_num_pages, 0, guest_code, NULL, NULL);

pta->vm = vm;

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:13:36

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 019/105] KVM: selftests: Use KVM_IOCTL_ERROR() for one-off arm64 ioctls

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/lib/aarch64/processor.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 6fa52e141e1b..5f6967058647 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -472,15 +472,15 @@ void aarch64_get_supported_page_sizes(uint32_t ipa,
TEST_ASSERT(vm_fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_VM, vm_fd));

vcpu_fd = ioctl(vm_fd, KVM_CREATE_VCPU, 0);
- TEST_ASSERT(vcpu_fd >= 0, "Can't create vcpu");
+ TEST_ASSERT(vcpu_fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_VCPU, vcpu_fd));

err = ioctl(vm_fd, KVM_ARM_PREFERRED_TARGET, &preferred_init);
- TEST_ASSERT(err == 0, "Can't get target");
+ TEST_ASSERT(err == 0, KVM_IOCTL_ERROR(KVM_ARM_PREFERRED_TARGET, err));
err = ioctl(vcpu_fd, KVM_ARM_VCPU_INIT, &preferred_init);
- TEST_ASSERT(err == 0, "Can't get init vcpu");
+ TEST_ASSERT(err == 0, KVM_IOCTL_ERROR(KVM_ARM_VCPU_INIT, err));

err = ioctl(vcpu_fd, KVM_GET_ONE_REG, &reg);
- TEST_ASSERT(err == 0, "Can't get MMFR0");
+ TEST_ASSERT(err == 0, KVM_IOCTL_ERROR(KVM_GET_ONE_REG, vcpu_fd));

*ps4k = ((val >> 28) & 0xf) != 0xf;
*ps64k = ((val >> 24) & 0xf) == 0;
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:17:45

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 092/105] KVM: selftests: Convert memop away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/s390x/memop.c | 31 +++++++++++------------
1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/tools/testing/selftests/kvm/s390x/memop.c b/tools/testing/selftests/kvm/s390x/memop.c
index 460799cc2098..a09b1b654d7f 100644
--- a/tools/testing/selftests/kvm/s390x/memop.c
+++ b/tools/testing/selftests/kvm/s390x/memop.c
@@ -13,8 +13,6 @@
#include "test_util.h"
#include "kvm_util.h"

-#define VCPU_ID 1
-
static uint8_t mem1[65536];
static uint8_t mem2[65536];

@@ -31,6 +29,7 @@ static void guest_code(void)

int main(int argc, char *argv[])
{
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct kvm_run *run;
struct kvm_s390_mem_op ksmo;
@@ -47,8 +46,8 @@ int main(int argc, char *argv[])
maxsize = sizeof(mem1);

/* Create VM */
- vm = vm_create_default(VCPU_ID, 0, guest_code);
- run = vcpu_state(vm, VCPU_ID);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
+ run = vcpu->run;

for (i = 0; i < sizeof(mem1); i++)
mem1[i] = i * i + i;
@@ -60,10 +59,10 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);

/* Let the guest code copy the first array to the second */
- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
"Unexpected exit reason: %u (%s)\n",
run->exit_reason,
@@ -78,7 +77,7 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_READ;
ksmo.buf = (uintptr_t)mem2;
ksmo.ar = 0;
- vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);

TEST_ASSERT(!memcmp(mem1, mem2, maxsize),
"Memory contents do not match!");
@@ -90,7 +89,7 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && errno == E2BIG, "ioctl allows insane sizes");

/* Zero size: */
@@ -100,7 +99,7 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && (errno == EINVAL || errno == ENOMEM),
"ioctl allows 0 as size");

@@ -111,7 +110,7 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows all flags");

/* Bad operation: */
@@ -121,7 +120,7 @@ int main(int argc, char *argv[])
ksmo.op = -1;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows bad operations");

/* Bad guest address: */
@@ -131,7 +130,7 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv > 0, "ioctl does not report bad guest memory access");

/* Bad host address: */
@@ -141,24 +140,24 @@ int main(int argc, char *argv[])
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = 0;
ksmo.ar = 0;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && errno == EFAULT,
"ioctl does not report bad host memory address");

/* Bad access register: */
run->psw_mask &= ~(3UL << (63 - 17));
run->psw_mask |= 1UL << (63 - 17); /* Enable AR mode */
- vcpu_run(vm, VCPU_ID); /* To sync new state to SIE block */
+ vcpu_run(vm, vcpu->id); /* To sync new state to SIE block */
ksmo.gaddr = (uintptr_t)mem1;
ksmo.flags = 0;
ksmo.size = maxsize;
ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
ksmo.buf = (uintptr_t)mem1;
ksmo.ar = 17;
- rv = __vcpu_ioctl(vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
+ rv = __vcpu_ioctl(vm, vcpu->id, KVM_S390_MEM_OP, &ksmo);
TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows ARs > 15");
run->psw_mask &= ~(3UL << (63 - 17)); /* Disable AR mode */
- vcpu_run(vm, VCPU_ID); /* Run to sync new state */
+ vcpu_run(vm, vcpu->id); /* Run to sync new state */

kvm_vm_free(vm);

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:23:14

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 051/105] KVM: selftests: Convert vmx_close_while_nested_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../kvm/x86_64/vmx_close_while_nested_test.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/vmx_close_while_nested_test.c b/tools/testing/selftests/kvm/x86_64/vmx_close_while_nested_test.c
index edac8839e717..da0363076fba 100644
--- a/tools/testing/selftests/kvm/x86_64/vmx_close_while_nested_test.c
+++ b/tools/testing/selftests/kvm/x86_64/vmx_close_while_nested_test.c
@@ -18,15 +18,10 @@

#include "kselftest.h"

-#define VCPU_ID 5
-
enum {
PORT_L0_EXIT = 0x2000,
};

-/* The virtual machine object. */
-static struct kvm_vm *vm;
-
static void l2_guest_code(void)
{
/* Exit to L0 */
@@ -53,20 +48,22 @@ static void l1_guest_code(struct vmx_pages *vmx_pages)
int main(int argc, char *argv[])
{
vm_vaddr_t vmx_pages_gva;
+ struct kvm_vcpu *vcpu;
+ struct kvm_vm *vm;

nested_vmx_check_supported();

- vm = vm_create_default(VCPU_ID, 0, (void *) l1_guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code);

/* Allocate VMX pages and shared descriptors (vmx_pages). */
vcpu_alloc_vmx(vm, &vmx_pages_gva);
- vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
+ vcpu_args_set(vm, vcpu->id, 1, vmx_pages_gva);

for (;;) {
- volatile struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ volatile struct kvm_run *run = vcpu->run;
struct ucall uc;

- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Got exit_reason other than KVM_EXIT_IO: %u (%s)\n",
run->exit_reason,
@@ -75,7 +72,7 @@ int main(int argc, char *argv[])
if (run->io.port == PORT_L0_EXIT)
break;

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s", (const char *)uc.args[0]);
/* NOT REACHED */
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:23:31

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 005/105] KVM: selftests: Drop @mode from common vm_create() helper

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/aarch64/get-reg-list.c | 2 +-
.../selftests/kvm/aarch64/psci_cpu_on_test.c | 2 +-
tools/testing/selftests/kvm/dirty_log_test.c | 2 +-
.../selftests/kvm/hardware_disable_test.c | 2 +-
.../selftests/kvm/include/kvm_util_base.h | 3 +-
.../selftests/kvm/kvm_binary_stats_test.c | 3 +-
.../selftests/kvm/kvm_create_max_vcpus.c | 2 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 43 ++++++++++---------
.../selftests/kvm/set_memory_region_test.c | 4 +-
.../selftests/kvm/x86_64/set_boot_cpu_id.c | 2 +-
.../selftests/kvm/x86_64/set_sregs_test.c | 2 +-
.../selftests/kvm/x86_64/sev_migrate_tests.c | 8 ++--
12 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/get-reg-list.c b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
index 422f9a4792ba..0cbee268c953 100644
--- a/tools/testing/selftests/kvm/aarch64/get-reg-list.c
+++ b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
@@ -411,7 +411,7 @@ static void run_test(struct vcpu_config *c)

check_supported(c);

- vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES);
+ vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
prepare_vcpu_init(c, &init);
aarch64_vcpu_add_default(vm, 0, &init, NULL);
finalize_vcpu(vm, 0, c);
diff --git a/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c b/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
index 15f4b3544ee5..bde7bae20a6e 100644
--- a/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
+++ b/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
@@ -76,7 +76,7 @@ int main(void)
struct kvm_vm *vm;
struct ucall uc;

- vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES);
+ vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
kvm_vm_elf_load(vm, program_invocation_name);
ucall_init(vm, NULL);

diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 11bf606e3165..01c01d40201f 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -679,7 +679,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,

pr_info("Testing guest mode: %s\n", vm_guest_mode_string(mode));

- vm = vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages);
+ vm = __vm_create(mode, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages);
kvm_vm_elf_load(vm, program_invocation_name);
#ifdef __x86_64__
vm_create_irqchip(vm);
diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/testing/selftests/kvm/hardware_disable_test.c
index 1c9e2295c75b..81ba8645772a 100644
--- a/tools/testing/selftests/kvm/hardware_disable_test.c
+++ b/tools/testing/selftests/kvm/hardware_disable_test.c
@@ -104,7 +104,7 @@ static void run_test(uint32_t run)
for (i = 0; i < VCPU_NUM; i++)
CPU_SET(i, &cpu_set);

- vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES);
+ vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
kvm_vm_elf_load(vm, program_invocation_name);
vm_create_irqchip(vm);

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 28440c12ffbc..c29606be1268 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -110,7 +110,8 @@ int vcpu_enable_cap(struct kvm_vm *vm, uint32_t vcpu_id,
void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
const char *vm_guest_mode_string(uint32_t i);

-struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages);
+struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint64_t phy_pages);
+struct kvm_vm *vm_create(uint64_t phy_pages);
void kvm_vm_free(struct kvm_vm *vmp);
void kvm_vm_restart(struct kvm_vm *vmp);
void kvm_vm_release(struct kvm_vm *vmp);
diff --git a/tools/testing/selftests/kvm/kvm_binary_stats_test.c b/tools/testing/selftests/kvm/kvm_binary_stats_test.c
index 6217f4630e6c..4b149b383678 100644
--- a/tools/testing/selftests/kvm/kvm_binary_stats_test.c
+++ b/tools/testing/selftests/kvm/kvm_binary_stats_test.c
@@ -229,8 +229,7 @@ int main(int argc, char *argv[])
vms = malloc(sizeof(vms[0]) * max_vm);
TEST_ASSERT(vms, "Allocate memory for storing VM pointers");
for (i = 0; i < max_vm; ++i) {
- vms[i] = vm_create(VM_MODE_DEFAULT,
- DEFAULT_GUEST_PHY_PAGES);
+ vms[i] = vm_create(DEFAULT_GUEST_PHY_PAGES);
for (j = 0; j < max_vcpu; ++j)
vm_vcpu_add(vms[i], j);
}
diff --git a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
index bb69b75eac23..9de5e1376c49 100644
--- a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
+++ b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
@@ -28,7 +28,7 @@ void test_vcpu_creation(int first_vcpu_id, int num_vcpus)
pr_info("Testing creating %d vCPUs, with IDs %d...%d.\n",
num_vcpus, first_vcpu_id, first_vcpu_id + num_vcpus - 1);

- vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES);
+ vm = vm_create(DEFAULT_GUEST_PHY_PAGES);

for (i = first_vcpu_id; i < first_vcpu_id + num_vcpus; i++)
/* This asserts that the vCPU was created. */
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index a6675d9aa7d9..03178004a6c3 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -234,25 +234,7 @@ const struct vm_guest_mode_params vm_guest_mode_params[] = {
_Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES,
"Missing new mode params?");

-/*
- * VM Create
- *
- * Input Args:
- * mode - VM Mode (e.g. VM_MODE_P52V48_4K)
- * phy_pages - Physical memory pages
- *
- * Output Args: None
- *
- * Return:
- * Pointer to opaque structure that describes the created VM.
- *
- * Creates a VM with the mode specified by mode (e.g. VM_MODE_P52V48_4K).
- * When phy_pages is non-zero, a memory region of phy_pages physical pages
- * is created and mapped starting at guest physical address 0. The file
- * descriptor to control the created VM is created with the permissions
- * given by perm (e.g. O_RDWR).
- */
-struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages)
+struct kvm_vm *__vm_create(enum vm_guest_mode mode, uint64_t phy_pages)
{
struct kvm_vm *vm;

@@ -361,6 +343,27 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages)
return vm;
}

+
+/*
+ * VM Create
+ *
+ * Input Args:
+ * phy_pages - Physical memory pages
+ *
+ * Output Args: None
+ *
+ * Return:
+ * Pointer to opaque structure that describes the created VM.
+ *
+ * Creates a VM with the default physical/virtual address widths and page size.
+ * When phy_pages is non-zero, a memory region of phy_pages physical pages
+ * is created and mapped starting at guest physical address 0.
+ */
+struct kvm_vm *vm_create(uint64_t phy_pages)
+{
+ return __vm_create(VM_MODE_DEFAULT, phy_pages);
+}
+
/*
* VM Create with customized parameters
*
@@ -411,7 +414,7 @@ struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
nr_vcpus, kvm_check_cap(KVM_CAP_MAX_VCPUS));

pages = vm_adjust_num_guest_pages(mode, pages);
- vm = vm_create(mode, pages);
+ vm = __vm_create(mode, pages);

kvm_vm_elf_load(vm, program_invocation_name);

diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 6a115d8d2fe3..fa4613010091 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -314,7 +314,7 @@ static void test_zero_memory_regions(void)

pr_info("Testing KVM_RUN with zero added memory regions\n");

- vm = vm_create(VM_MODE_DEFAULT, 0);
+ vm = vm_create(0);
vm_vcpu_add(vm, VCPU_ID);

TEST_ASSERT(!ioctl(vm_get_fd(vm), KVM_SET_NR_MMU_PAGES, 64),
@@ -370,7 +370,7 @@ static void test_add_max_memory_regions(void)
"KVM_CAP_NR_MEMSLOTS should be greater than 0");
pr_info("Allowed number of memory slots: %i\n", max_mem_slots);

- vm = vm_create(VM_MODE_DEFAULT, 0);
+ vm = vm_create(0);

/* Check it can be added memory slots up to the maximum allowed */
pr_info("Adding slots 0..%i, each memory region with %dK size\n",
diff --git a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
index ee3d058a9fe1..b4da92ddc1c6 100644
--- a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
+++ b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
@@ -88,7 +88,7 @@ static struct kvm_vm *create_vm(void)
uint64_t pages = DEFAULT_GUEST_PHY_PAGES + vcpu_pages + extra_pg_pages;

pages = vm_adjust_num_guest_pages(VM_MODE_DEFAULT, pages);
- vm = vm_create(VM_MODE_DEFAULT, pages);
+ vm = vm_create(pages);

kvm_vm_elf_load(vm, program_invocation_name);
vm_create_irqchip(vm);
diff --git a/tools/testing/selftests/kvm/x86_64/set_sregs_test.c b/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
index 44711ab735c3..4dc7fd925023 100644
--- a/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
+++ b/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
* use it to verify all supported CR4 bits can be set prior to defining
* the vCPU model, i.e. without doing KVM_SET_CPUID2.
*/
- vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES);
+ vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
vm_vcpu_add(vm, VCPU_ID);

vcpu_sregs_get(vm, VCPU_ID, &sregs);
diff --git a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
index 7729ca60a9d7..d29cf773d7bf 100644
--- a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
+++ b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
@@ -52,7 +52,7 @@ static struct kvm_vm *sev_vm_create(bool es)
struct kvm_sev_launch_start start = { 0 };
int i;

- vm = vm_create(VM_MODE_DEFAULT, 0);
+ vm = vm_create(0);
sev_ioctl(vm->fd, es ? KVM_SEV_ES_INIT : KVM_SEV_INIT, NULL);
for (i = 0; i < NR_MIGRATE_TEST_VCPUS; ++i)
vm_vcpu_add(vm, i);
@@ -69,7 +69,7 @@ static struct kvm_vm *aux_vm_create(bool with_vcpus)
struct kvm_vm *vm;
int i;

- vm = vm_create(VM_MODE_DEFAULT, 0);
+ vm = vm_create(0);
if (!with_vcpus)
return vm;

@@ -174,9 +174,9 @@ static void test_sev_migrate_parameters(void)

sev_vm = sev_vm_create(/* es= */ false);
sev_es_vm = sev_vm_create(/* es= */ true);
- vm_no_vcpu = vm_create(VM_MODE_DEFAULT, 0);
+ vm_no_vcpu = vm_create(0);
vm_no_sev = aux_vm_create(true);
- sev_es_vm_no_vmsa = vm_create(VM_MODE_DEFAULT, 0);
+ sev_es_vm_no_vmsa = vm_create(0);
sev_ioctl(sev_es_vm_no_vmsa->fd, KVM_SEV_ES_INIT, NULL);
vm_vcpu_add(sev_es_vm_no_vmsa, 1);

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:24:53

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 023/105] KVM: selftests: Rename KVM_HAS_DEVICE_ATTR helpers for consistency

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/vgic_init.c | 12 +++++-------
tools/testing/selftests/kvm/include/kvm_util_base.h | 6 +++---
tools/testing/selftests/kvm/lib/kvm_util.c | 12 ++++++------
.../selftests/kvm/system_counter_offset_test.c | 2 +-
4 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 1015f6fc352c..223fef4c1f62 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -127,14 +127,12 @@ static void subtest_dist_rdist(struct vm_gic *v)
: gic_v2_dist_region;

/* Check existing group/attributes */
- kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- dist.attr);
+ kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, dist.attr);

- kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr);
+ kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, rdist.attr);

/* check non existing attribute */
- ret = _kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, -1);
+ ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, -1);
TEST_ASSERT(ret && errno == ENXIO, "attribute not supported");

/* misaligned DIST and REDIST address settings */
@@ -176,7 +174,7 @@ static void subtest_dist_rdist(struct vm_gic *v)
rdist.attr, &addr, true);
TEST_ASSERT(ret && errno == EEXIST, "GIC redist base set again");

- ret = _kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST);
if (!ret) {
/* Attempt to mix legacy and new redistributor regions */
@@ -203,7 +201,7 @@ static void subtest_v3_redist_regions(struct vm_gic *v)
uint64_t addr, expected_addr;
int ret;

- ret = kvm_device_check_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ ret = kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST);
TEST_ASSERT(!ret, "Multiple redist regions advertised");

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index df1202bacc04..97cdeeac4db6 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -477,8 +477,8 @@ void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid);
*/
void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);

-int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
-int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
+int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
+int kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
int __kvm_create_device(struct kvm_vm *vm, uint64_t type);
int kvm_create_device(struct kvm_vm *vm, uint64_t type);
@@ -489,7 +489,7 @@ int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
void kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level);
int _kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level);

-int _vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr);
int vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e10894cc2bc1..f9547edb30ad 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1581,7 +1581,7 @@ void _vm_ioctl(struct kvm_vm *vm, unsigned long cmd, const char *name, void *arg
* Device Ioctl
*/

-int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr)
+int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
{
struct kvm_device_attr attribute = {
.group = group,
@@ -1592,9 +1592,9 @@ int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr)
return ioctl(dev_fd, KVM_HAS_DEVICE_ATTR, &attribute);
}

-int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr)
+int kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
{
- int ret = _kvm_device_check_attr(dev_fd, group, attr);
+ int ret = __kvm_has_device_attr(dev_fd, group, attr);

TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR failed, rc: %i errno: %i", ret, errno);
return ret;
@@ -1657,18 +1657,18 @@ int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
return ret;
}

-int _vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr)
{
struct vcpu *vcpu = vcpu_get(vm, vcpuid);

- return _kvm_device_check_attr(vcpu->fd, group, attr);
+ return __kvm_has_device_attr(vcpu->fd, group, attr);
}

int vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr)
{
- int ret = _vcpu_has_device_attr(vm, vcpuid, group, attr);
+ int ret = __vcpu_has_device_attr(vm, vcpuid, group, attr);

TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR IOCTL failed, rc: %i errno: %i", ret, errno);
return ret;
diff --git a/tools/testing/selftests/kvm/system_counter_offset_test.c b/tools/testing/selftests/kvm/system_counter_offset_test.c
index b337bbbfa41f..2b10c53abf4f 100644
--- a/tools/testing/selftests/kvm/system_counter_offset_test.c
+++ b/tools/testing/selftests/kvm/system_counter_offset_test.c
@@ -30,7 +30,7 @@ static struct test_case test_cases[] = {

static void check_preconditions(struct kvm_vm *vm)
{
- if (!_vcpu_has_device_attr(vm, VCPU_ID, KVM_VCPU_TSC_CTRL, KVM_VCPU_TSC_OFFSET))
+ if (!__vcpu_has_device_attr(vm, VCPU_ID, KVM_VCPU_TSC_CTRL, KVM_VCPU_TSC_OFFSET))
return;

print_skip("KVM_VCPU_TSC_OFFSET not supported; skipping test");
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:30:00

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 080/105] KVM: selftests: Rename vm_vcpu_add* helpers to better show relationships

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/get-reg-list.c | 2 +-
tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c | 4 ++--
tools/testing/selftests/kvm/aarch64/vgic_init.c | 10 +++++-----
tools/testing/selftests/kvm/dirty_log_test.c | 2 +-
tools/testing/selftests/kvm/hardware_disable_test.c | 2 +-
.../testing/selftests/kvm/include/aarch64/processor.h | 5 ++---
tools/testing/selftests/kvm/include/kvm_util_base.h | 7 +++----
tools/testing/selftests/kvm/kvm_binary_stats_test.c | 2 +-
tools/testing/selftests/kvm/kvm_create_max_vcpus.c | 2 +-
tools/testing/selftests/kvm/lib/aarch64/processor.c | 9 ++++-----
tools/testing/selftests/kvm/lib/kvm_util.c | 6 +++---
tools/testing/selftests/kvm/lib/riscv/processor.c | 2 +-
tools/testing/selftests/kvm/lib/s390x/processor.c | 2 +-
tools/testing/selftests/kvm/lib/x86_64/processor.c | 2 +-
tools/testing/selftests/kvm/set_memory_region_test.c | 2 +-
tools/testing/selftests/kvm/steal_time.c | 2 +-
tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c | 4 ++--
tools/testing/selftests/kvm/x86_64/set_sregs_test.c | 2 +-
tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c | 8 ++++----
tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c | 2 +-
20 files changed, 37 insertions(+), 40 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/get-reg-list.c b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
index 0cbee268c953..f486223ac98c 100644
--- a/tools/testing/selftests/kvm/aarch64/get-reg-list.c
+++ b/tools/testing/selftests/kvm/aarch64/get-reg-list.c
@@ -413,7 +413,7 @@ static void run_test(struct vcpu_config *c)

vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
prepare_vcpu_init(c, &init);
- aarch64_vcpu_add_default(vm, 0, &init, NULL);
+ aarch64_vcpu_add(vm, 0, &init, NULL);
finalize_vcpu(vm, 0, c);

reg_list = vcpu_get_reg_list(vm, 0);
diff --git a/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c b/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
index bde7bae20a6e..3677cb2df19c 100644
--- a/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
+++ b/tools/testing/selftests/kvm/aarch64/psci_cpu_on_test.c
@@ -83,13 +83,13 @@ int main(void)
vm_ioctl(vm, KVM_ARM_PREFERRED_TARGET, &init);
init.features[0] |= (1 << KVM_ARM_VCPU_PSCI_0_2);

- aarch64_vcpu_add_default(vm, VCPU_ID_SOURCE, &init, guest_main);
+ aarch64_vcpu_add(vm, VCPU_ID_SOURCE, &init, guest_main);

/*
* make sure the target is already off when executing the test.
*/
init.features[0] |= (1 << KVM_ARM_VCPU_POWER_OFF);
- aarch64_vcpu_add_default(vm, VCPU_ID_TARGET, &init, guest_main);
+ aarch64_vcpu_add(vm, VCPU_ID_TARGET, &init, guest_main);

get_reg(vm, VCPU_ID_TARGET, KVM_ARM64_SYS_REG(SYS_MPIDR_EL1), &target_mpidr);
vcpu_args_set(vm, VCPU_ID_SOURCE, 1, target_mpidr & MPIDR_HWID_BITMASK);
diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 0329aa04da31..32dac03f5600 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -314,7 +314,7 @@ static void test_vgic_then_vcpus(uint32_t gic_dev_type)

/* Add the rest of the VCPUs */
for (i = 1; i < NR_VCPUS; ++i)
- vm_vcpu_add_default(v.vm, i, guest_code);
+ vm_vcpu_add(v.vm, i, guest_code);

ret = run_vcpu(v.vm, 3);
TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run");
@@ -402,17 +402,17 @@ static void test_v3_typer_accesses(void)

v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

- vm_vcpu_add_default(v.vm, 3, guest_code);
+ vm_vcpu_add(v.vm, 3, guest_code);

ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EINVAL, "attempting to read GICR_TYPER of non created vcpu");

- vm_vcpu_add_default(v.vm, 1, guest_code);
+ vm_vcpu_add(v.vm, 1, guest_code);

ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EBUSY, "read GICR_TYPER before GIC initialized");

- vm_vcpu_add_default(v.vm, 2, guest_code);
+ vm_vcpu_add(v.vm, 2, guest_code);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
@@ -576,7 +576,7 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)

/* Add the rest of the VCPUs */
for (i = 1; i < NR_VCPUS; ++i)
- vm_vcpu_add_default(v.vm, i, guest_code);
+ vm_vcpu_add(v.vm, i, guest_code);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 1c7d25bf4a5a..e480b503c08b 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -682,7 +682,7 @@ static struct kvm_vm *create_vm(enum vm_guest_mode mode, uint32_t vcpuid,
vm_create_irqchip(vm);
#endif
log_mode_create_vm_done(vm);
- vm_vcpu_add_default(vm, vcpuid, guest_code);
+ vm_vcpu_add(vm, vcpuid, guest_code);
return vm;
}

diff --git a/tools/testing/selftests/kvm/hardware_disable_test.c b/tools/testing/selftests/kvm/hardware_disable_test.c
index 81ba8645772a..c31af07fae97 100644
--- a/tools/testing/selftests/kvm/hardware_disable_test.c
+++ b/tools/testing/selftests/kvm/hardware_disable_test.c
@@ -110,7 +110,7 @@ static void run_test(uint32_t run)

pr_debug("%s: [%d] start vcpus\n", __func__, run);
for (i = 0; i < VCPU_NUM; ++i) {
- vm_vcpu_add_default(vm, i, guest_code);
+ vm_vcpu_add(vm, i, guest_code);
payloads[i].vm = vm;
payloads[i].index = i;

diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h
index 5999e7ae7b29..f64607c136df 100644
--- a/tools/testing/selftests/kvm/include/aarch64/processor.h
+++ b/tools/testing/selftests/kvm/include/aarch64/processor.h
@@ -64,9 +64,8 @@ static inline void set_reg(struct kvm_vm *vm, uint32_t vcpuid, uint64_t id, uint
}

void aarch64_vcpu_setup(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_vcpu_init *init);
-struct kvm_vcpu *aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpu_id,
- struct kvm_vcpu_init *init,
- void *guest_code);
+struct kvm_vcpu *aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ struct kvm_vcpu_init *init, void *guest_code);

struct ex_regs {
u64 regs[31];
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 19a7e507b8e7..14457f98080b 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -276,7 +276,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot);
-struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
+struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid);
vm_vaddr_t vm_vaddr_alloc(struct kvm_vm *vm, size_t sz, vm_vaddr_t vaddr_min);
vm_vaddr_t vm_vaddr_alloc_pages(struct kvm_vm *vm, int nr_pages);
vm_vaddr_t vm_vaddr_alloc_page(struct kvm_vm *vm);
@@ -640,9 +640,8 @@ static inline void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
void *guest_code);

-static inline struct kvm_vcpu *vm_vcpu_add_default(struct kvm_vm *vm,
- uint32_t vcpu_id,
- void *guest_code)
+static inline struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code)
{
return vm_arch_vcpu_add(vm, vcpu_id, guest_code);
}
diff --git a/tools/testing/selftests/kvm/kvm_binary_stats_test.c b/tools/testing/selftests/kvm/kvm_binary_stats_test.c
index 0a27b0f85009..77b8967fe702 100644
--- a/tools/testing/selftests/kvm/kvm_binary_stats_test.c
+++ b/tools/testing/selftests/kvm/kvm_binary_stats_test.c
@@ -223,7 +223,7 @@ int main(int argc, char *argv[])
for (i = 0; i < max_vm; ++i) {
vms[i] = vm_create(DEFAULT_GUEST_PHY_PAGES);
for (j = 0; j < max_vcpu; ++j)
- vm_vcpu_add(vms[i], j);
+ __vm_vcpu_add(vms[i], j);
}

/* Check stats read for every VM and VCPU */
diff --git a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
index 9de5e1376c49..8fa8db12d452 100644
--- a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
+++ b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c
@@ -32,7 +32,7 @@ void test_vcpu_creation(int first_vcpu_id, int num_vcpus)

for (i = first_vcpu_id; i < first_vcpu_id + num_vcpus; i++)
/* This asserts that the vCPU was created. */
- vm_vcpu_add(vm, i);
+ __vm_vcpu_add(vm, i);

kvm_vm_free(vm);
}
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 089e6de2160c..35bec85f43b0 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -314,16 +314,15 @@ void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t in
indent, "", pstate, pc);
}

-struct kvm_vcpu *aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpu_id,
- struct kvm_vcpu_init *init,
- void *guest_code)
+struct kvm_vcpu *aarch64_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ struct kvm_vcpu_init *init, void *guest_code)
{
size_t stack_size = vm->page_size == 4096 ?
DEFAULT_STACK_PGS * vm->page_size :
vm->page_size;
uint64_t stack_vaddr = vm_vaddr_alloc(vm, stack_size,
DEFAULT_ARM64_GUEST_STACK_VADDR_MIN);
- struct kvm_vcpu *vcpu = vm_vcpu_add(vm, vcpu_id);
+ struct kvm_vcpu *vcpu = __vm_vcpu_add(vm, vcpu_id);

aarch64_vcpu_setup(vm, vcpu_id, init);

@@ -336,7 +335,7 @@ struct kvm_vcpu *aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpu_id,
struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
void *guest_code)
{
- return aarch64_vcpu_add_default(vm, vcpu_id, NULL, guest_code);
+ return aarch64_vcpu_add(vm, vcpu_id, NULL, guest_code);
}

void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 23de0335f22b..1580d4888d74 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -344,7 +344,7 @@ struct kvm_vm *vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
for (i = 0; i < nr_vcpus; ++i) {
uint32_t vcpuid = vcpuids ? vcpuids[i] : i;

- vm_vcpu_add_default(vm, vcpuid, guest_code);
+ vm_vcpu_add(vm, vcpuid, guest_code);
}

return vm;
@@ -413,7 +413,7 @@ struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm)
{
kvm_vm_restart(vm);

- return vm_vcpu_add(vm, 0);
+ return __vm_vcpu_add(vm, 0);
}

/*
@@ -1060,7 +1060,7 @@ static int vcpu_mmap_sz(void)
* Adds a virtual CPU to the VM specified by vm with the ID given by vcpu_id.
* No additional vCPU setup is done. Returns the vCPU.
*/
-struct kvm_vcpu *vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
+struct kvm_vcpu *__vm_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id)
{
struct kvm_vcpu *vcpu;

diff --git a/tools/testing/selftests/kvm/lib/riscv/processor.c b/tools/testing/selftests/kvm/lib/riscv/processor.c
index 34a9f0cf05ba..5a57494751e1 100644
--- a/tools/testing/selftests/kvm/lib/riscv/processor.c
+++ b/tools/testing/selftests/kvm/lib/riscv/processor.c
@@ -286,7 +286,7 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
struct kvm_mp_state mps;
struct kvm_vcpu *vcpu;

- vcpu = vm_vcpu_add(vm, vcpuid);
+ vcpu = __vm_vcpu_add(vm, vcpuid);
riscv_vcpu_mmu_setup(vm, vcpuid);

/*
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index 5c59a1d7ec6d..f8170e97eeb7 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -170,7 +170,7 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
stack_vaddr = vm_vaddr_alloc(vm, stack_size,
DEFAULT_GUEST_STACK_VADDR_MIN);

- vcpu = vm_vcpu_add(vm, vcpuid);
+ vcpu = __vm_vcpu_add(vm, vcpu_id);

/* Setup guest registers */
vcpu_regs_get(vm, vcpu_id, &regs);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index 24ec376c5d6d..c773f7b1ed4c 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -682,7 +682,7 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
stack_vaddr = vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(),
DEFAULT_GUEST_STACK_VADDR_MIN);

- vcpu = vm_vcpu_add(vm, vcpu_id);
+ vcpu = __vm_vcpu_add(vm, vcpu_id);
vcpu_set_cpuid(vm, vcpu_id, kvm_get_supported_cpuid());
vcpu_setup(vm, vcpu_id);

diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 13859b37e28d..4913d6a5b311 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -315,7 +315,7 @@ static void test_zero_memory_regions(void)
pr_info("Testing KVM_RUN with zero added memory regions\n");

vm = vm_create(0);
- vcpu = vm_vcpu_add(vm, 0);
+ vcpu = __vm_vcpu_add(vm, 0);

vm_ioctl(vm, KVM_SET_NR_MMU_PAGES, (void *)64ul);
vcpu_run(vm, vcpu->id);
diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c
index 1d6a91a53eae..741892cec1ea 100644
--- a/tools/testing/selftests/kvm/steal_time.c
+++ b/tools/testing/selftests/kvm/steal_time.c
@@ -282,7 +282,7 @@ int main(int ac, char **av)

/* Add the rest of the VCPUs */
for (i = 1; i < NR_VCPUS; ++i)
- vm_vcpu_add_default(vm, i, guest_code);
+ vm_vcpu_add(vm, i, guest_code);

steal_time_init(vm);

diff --git a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
index b4da92ddc1c6..b6a1dceb2be9 100644
--- a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
+++ b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
@@ -99,9 +99,9 @@ static struct kvm_vm *create_vm(void)
static void add_x86_vcpu(struct kvm_vm *vm, uint32_t vcpuid, bool bsp_code)
{
if (bsp_code)
- vm_vcpu_add_default(vm, vcpuid, guest_bsp_vcpu);
+ vm_vcpu_add(vm, vcpuid, guest_bsp_vcpu);
else
- vm_vcpu_add_default(vm, vcpuid, guest_not_bsp_vcpu);
+ vm_vcpu_add(vm, vcpuid, guest_not_bsp_vcpu);
}

static void run_vm_bsp(uint32_t bsp_vcpu)
diff --git a/tools/testing/selftests/kvm/x86_64/set_sregs_test.c b/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
index 2b3cae9a1d5b..9bc1d6b33172 100644
--- a/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
+++ b/tools/testing/selftests/kvm/x86_64/set_sregs_test.c
@@ -95,7 +95,7 @@ int main(int argc, char *argv[])
* the vCPU model, i.e. without doing KVM_SET_CPUID2.
*/
vm = vm_create(DEFAULT_GUEST_PHY_PAGES);
- vcpu = vm_vcpu_add(vm, 0);
+ vcpu = __vm_vcpu_add(vm, 0);

vcpu_sregs_get(vm, vcpu->id, &sregs);

diff --git a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
index fb26d0d85fcb..d8ebae374f88 100644
--- a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
+++ b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
@@ -54,7 +54,7 @@ static struct kvm_vm *sev_vm_create(bool es)
vm = vm_create(0);
sev_ioctl(vm->fd, es ? KVM_SEV_ES_INIT : KVM_SEV_INIT, NULL);
for (i = 0; i < NR_MIGRATE_TEST_VCPUS; ++i)
- vm_vcpu_add(vm, i);
+ __vm_vcpu_add(vm, i);
if (es)
start.policy |= SEV_POLICY_ES;
sev_ioctl(vm->fd, KVM_SEV_LAUNCH_START, &start);
@@ -73,7 +73,7 @@ static struct kvm_vm *aux_vm_create(bool with_vcpus)
return vm;

for (i = 0; i < NR_MIGRATE_TEST_VCPUS; ++i)
- vm_vcpu_add(vm, i);
+ __vm_vcpu_add(vm, i);

return vm;
}
@@ -177,7 +177,7 @@ static void test_sev_migrate_parameters(void)
vm_no_sev = aux_vm_create(true);
sev_es_vm_no_vmsa = vm_create(0);
sev_ioctl(sev_es_vm_no_vmsa->fd, KVM_SEV_ES_INIT, NULL);
- vm_vcpu_add(sev_es_vm_no_vmsa, 1);
+ __vm_vcpu_add(sev_es_vm_no_vmsa, 1);

ret = __sev_migrate_from(sev_vm->fd, sev_es_vm->fd);
TEST_ASSERT(
@@ -282,7 +282,7 @@ static void test_sev_mirror(bool es)

/* Check that we can complete creation of the mirror VM. */
for (i = 0; i < NR_MIGRATE_TEST_VCPUS; ++i)
- vm_vcpu_add(dst_vm, i);
+ __vm_vcpu_add(dst_vm, i);

if (es)
sev_ioctl(dst_vm->fd, KVM_SEV_LAUNCH_UPDATE_VMSA, NULL);
diff --git a/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c b/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c
index afbbc40df884..8b366652be31 100644
--- a/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c
+++ b/tools/testing/selftests/kvm/x86_64/xapic_ipi_test.c
@@ -425,7 +425,7 @@ int main(int argc, char *argv[])

virt_pg_map(vm, APIC_DEFAULT_GPA, APIC_DEFAULT_GPA);

- vm_vcpu_add_default(vm, SENDER_VCPU_ID, sender_guest_code);
+ vm_vcpu_add(vm, SENDER_VCPU_ID, sender_guest_code);

test_data_page_vaddr = vm_vaddr_alloc_page(vm);
data =
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:30:46

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 069/105] KVM: selftests: Convert xen_vmcall_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/xen_vmcall_test.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/xen_vmcall_test.c b/tools/testing/selftests/kvm/x86_64/xen_vmcall_test.c
index adc94452b57c..6badb0c8b2f7 100644
--- a/tools/testing/selftests/kvm/x86_64/xen_vmcall_test.c
+++ b/tools/testing/selftests/kvm/x86_64/xen_vmcall_test.c
@@ -11,14 +11,10 @@
#include "kvm_util.h"
#include "processor.h"

-#define VCPU_ID 5
-
#define HCALL_REGION_GPA 0xc0000000ULL
#define HCALL_REGION_SLOT 10
#define PAGE_SIZE 4096

-static struct kvm_vm *vm;
-
#define INPUTVALUE 17
#define ARGVALUE(x) (0xdeadbeef5a5a0000UL + x)
#define RETVALUE 0xcafef00dfbfbffffUL
@@ -85,14 +81,17 @@ static void guest_code(void)

int main(int argc, char *argv[])
{
+ struct kvm_vcpu *vcpu;
+ struct kvm_vm *vm;
+
if (!(kvm_check_cap(KVM_CAP_XEN_HVM) &
KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL) ) {
print_skip("KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL not available");
exit(KSFT_SKIP);
}

- vm = vm_create_default(VCPU_ID, 0, (void *) guest_code);
- vcpu_set_hv_cpuid(vm, VCPU_ID);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
+ vcpu_set_hv_cpuid(vm, vcpu->id);

struct kvm_xen_hvm_config hvmc = {
.flags = KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL,
@@ -106,10 +105,10 @@ int main(int argc, char *argv[])
virt_map(vm, HCALL_REGION_GPA, HCALL_REGION_GPA, 2);

for (;;) {
- volatile struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ volatile struct kvm_run *run = vcpu->run;
struct ucall uc;

- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);

if (run->exit_reason == KVM_EXIT_XEN) {
ASSERT_EQ(run->xen.type, KVM_EXIT_XEN_HCALL);
@@ -131,7 +130,7 @@ int main(int argc, char *argv[])
run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s", (const char *)uc.args[0]);
/* NOT REACHED */
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:35:26

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 033/105] KVM: selftests: Convert xss_msr_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/x86_64/xss_msr_test.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/xss_msr_test.c b/tools/testing/selftests/kvm/x86_64/xss_msr_test.c
index 3529376747c2..c5672d2949db 100644
--- a/tools/testing/selftests/kvm/x86_64/xss_msr_test.c
+++ b/tools/testing/selftests/kvm/x86_64/xss_msr_test.c
@@ -12,7 +12,6 @@
#include "kvm_util.h"
#include "vmx.h"

-#define VCPU_ID 1
#define MSR_BITS 64

#define X86_FEATURE_XSAVES (1<<3)
@@ -40,11 +39,12 @@ int main(int argc, char *argv[])
struct kvm_cpuid_entry2 *entry;
bool xss_supported = false;
struct kvm_vm *vm;
+ struct kvm_vcpu *vcpu;
uint64_t xss_val;
int i, r;

/* Create VM */
- vm = vm_create_default(VCPU_ID, 0, 0);
+ vm = vm_create_with_one_vcpu(&vcpu, NULL);

if (kvm_get_cpuid_max_basic() >= 0xd) {
entry = kvm_get_supported_cpuid_index(0xd, 1);
@@ -55,11 +55,11 @@ int main(int argc, char *argv[])
exit(KSFT_SKIP);
}

- xss_val = vcpu_get_msr(vm, VCPU_ID, MSR_IA32_XSS);
+ xss_val = vcpu_get_msr(vm, vcpu->id, MSR_IA32_XSS);
TEST_ASSERT(xss_val == 0,
"MSR_IA32_XSS should be initialized to zero\n");

- vcpu_set_msr(vm, VCPU_ID, MSR_IA32_XSS, xss_val);
+ vcpu_set_msr(vm, vcpu->id, MSR_IA32_XSS, xss_val);
/*
* At present, KVM only supports a guest IA32_XSS value of 0. Verify
* that trying to set the guest IA32_XSS to an unsupported value fails.
@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
* IA32_XSS is in the KVM_GET_MSR_INDEX_LIST.
*/
for (i = 0; i < MSR_BITS; ++i) {
- r = _vcpu_set_msr(vm, VCPU_ID, MSR_IA32_XSS, 1ull << i);
+ r = _vcpu_set_msr(vm, vcpu->id, MSR_IA32_XSS, 1ull << i);
TEST_ASSERT(r == 0 || is_supported_msr(MSR_IA32_XSS),
"IA32_XSS was able to be set, but was not found in KVM_GET_MSR_INDEX_LIST.\n");
}
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:36:14

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 022/105] KVM: selftests: Multiplex return code and fd in __kvm_create_device()

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/vgic_init.c | 6 +++---
.../selftests/kvm/include/kvm_util_base.h | 2 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 16 +++++++---------
3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 18d1d0335108..1015f6fc352c 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -642,8 +642,8 @@ static void test_v3_its_region(void)
int test_kvm_device(uint32_t gic_dev_type)
{
struct vm_gic v;
- int ret, fd;
uint32_t other;
+ int ret;

v.vm = vm_create_default_with_vcpus(NR_VCPUS, 0, 0, guest_code, NULL);

@@ -657,8 +657,8 @@ int test_kvm_device(uint32_t gic_dev_type)
return ret;
v.gic_fd = kvm_create_device(v.vm, gic_dev_type);

- ret = __kvm_create_device(v.vm, gic_dev_type, &fd);
- TEST_ASSERT(ret && errno == EEXIST, "create GIC device twice");
+ ret = __kvm_create_device(v.vm, gic_dev_type);
+ TEST_ASSERT(ret < 0 && errno == EEXIST, "create GIC device twice");

/* try to create the other gic_dev_type */
other = VGIC_DEV_IS_V2(gic_dev_type) ? KVM_DEV_TYPE_ARM_VGIC_V3
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 081ba04e5df3..df1202bacc04 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -480,7 +480,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);
int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
-int __kvm_create_device(struct kvm_vm *vm, uint64_t type, int *fd);
+int __kvm_create_device(struct kvm_vm *vm, uint64_t type);
int kvm_create_device(struct kvm_vm *vm, uint64_t type);
int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
void *val, bool write);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index f0a08de67f0f..e10894cc2bc1 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1610,27 +1610,25 @@ int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type)
return __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
}

-int __kvm_create_device(struct kvm_vm *vm, uint64_t type, int *fd)
+int __kvm_create_device(struct kvm_vm *vm, uint64_t type)
{
struct kvm_create_device create_dev = {
.type = type,
.fd = -1,
.flags = 0,
};
- int ret;
+ int err;

- ret = __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
- *fd = create_dev.fd;
- return ret;
+ err = __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
+ TEST_ASSERT(err <= 0, "KVM_CREATE_DEVICE shouldn't return a positive value");
+ return err ? : create_dev.fd;
}

int kvm_create_device(struct kvm_vm *vm, uint64_t type)
{
- int fd, ret;
+ int fd = __kvm_create_device(vm, type);

- ret = __kvm_create_device(vm, type, &fd);
-
- TEST_ASSERT(!ret, "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", ret, errno);
+ TEST_ASSERT(fd >= 0, "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", fd, errno);
return fd;
}

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:38:21

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 020/105] KVM: selftests: Drop @test param from kvm_create_device()

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/vgic_init.c | 14 ++++++--------
.../testing/selftests/kvm/include/kvm_util_base.h | 2 +-
tools/testing/selftests/kvm/lib/aarch64/vgic.c | 2 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 12 ++++--------
4 files changed, 12 insertions(+), 18 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 9a153b2ea3de..9cd58f22f5bd 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -65,7 +65,7 @@ static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type, uint32_t nr

v.gic_dev_type = gic_dev_type;
v.vm = vm_create_default_with_vcpus(nr_vcpus, 0, 0, guest_code, NULL);
- v.gic_fd = kvm_create_device(v.vm, gic_dev_type, false);
+ v.gic_fd = kvm_create_device(v.vm, gic_dev_type);

return v;
}
@@ -406,7 +406,7 @@ static void test_v3_typer_accesses(void)

v.vm = vm_create_default(0, 0, guest_code);

- v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false);
+ v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

vm_vcpu_add_default(v.vm, 3, guest_code);

@@ -486,7 +486,7 @@ static void test_v3_last_bit_redist_regions(void)

v.vm = vm_create_default_with_vcpus(6, 0, 0, guest_code, vcpuids);

- v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false);
+ v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
@@ -535,7 +535,7 @@ static void test_v3_last_bit_single_rdist(void)

v.vm = vm_create_default_with_vcpus(6, 0, 0, guest_code, vcpuids);

- v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3, false);
+ v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
@@ -602,7 +602,7 @@ static void test_v3_its_region(void)
int its_fd, ret;

v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
- its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
+ its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS);

addr = 0x401000;
ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
@@ -655,13 +655,11 @@ int test_kvm_device(uint32_t gic_dev_type)
ret = _kvm_create_device(v.vm, gic_dev_type, true, &fd);
if (ret)
return ret;
- v.gic_fd = kvm_create_device(v.vm, gic_dev_type, false);
+ v.gic_fd = kvm_create_device(v.vm, gic_dev_type);

ret = _kvm_create_device(v.vm, gic_dev_type, false, &fd);
TEST_ASSERT(ret && errno == EEXIST, "create GIC device twice");

- kvm_create_device(v.vm, gic_dev_type, true);
-
/* try to create the other gic_dev_type */
other = VGIC_DEV_IS_V2(gic_dev_type) ? KVM_DEV_TYPE_ARM_VGIC_V3
: KVM_DEV_TYPE_ARM_VGIC_V2;
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index d2550c6e82c1..03575063ee13 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -480,7 +480,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);
int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
int _kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test, int *fd);
-int kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test);
+int kvm_create_device(struct kvm_vm *vm, uint64_t type);
int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
void *val, bool write);
int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
diff --git a/tools/testing/selftests/kvm/lib/aarch64/vgic.c b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
index a169e662d6ae..f0ef9530fefe 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/vgic.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
@@ -51,7 +51,7 @@ int vgic_v3_setup(struct kvm_vm *vm, unsigned int nr_vcpus, uint32_t nr_irqs,
nr_vcpus, nr_vcpus_created);

/* Distributor setup */
- gic_fd = kvm_create_device(vm, KVM_DEV_TYPE_ARM_VGIC_V3, false);
+ gic_fd = kvm_create_device(vm, KVM_DEV_TYPE_ARM_VGIC_V3);

kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_NR_IRQS,
0, &nr_irqs, true);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index c6fee457735b..bfa7174a7892 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1613,18 +1613,14 @@ int _kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test, int *fd)
return ret;
}

-int kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test)
+int kvm_create_device(struct kvm_vm *vm, uint64_t type)
{
int fd, ret;

- ret = _kvm_create_device(vm, type, test, &fd);
+ ret = _kvm_create_device(vm, type, false, &fd);

- if (!test) {
- TEST_ASSERT(!ret,
- "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", ret, errno);
- return fd;
- }
- return ret;
+ TEST_ASSERT(!ret, "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", ret, errno);
+ return fd;
}

int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:43:10

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 042/105] KVM: selftests: Convert svm_int_ctl_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/svm_int_ctl_test.c | 21 +++++++++----------
1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/svm_int_ctl_test.c b/tools/testing/selftests/kvm/x86_64/svm_int_ctl_test.c
index 30a81038df46..8e90e463895a 100644
--- a/tools/testing/selftests/kvm/x86_64/svm_int_ctl_test.c
+++ b/tools/testing/selftests/kvm/x86_64/svm_int_ctl_test.c
@@ -13,10 +13,6 @@
#include "svm_util.h"
#include "apic.h"

-#define VCPU_ID 0
-
-static struct kvm_vm *vm;
-
bool vintr_irq_called;
bool intr_irq_called;

@@ -88,31 +84,34 @@ static void l1_guest_code(struct svm_test_data *svm)

int main(int argc, char *argv[])
{
+ struct kvm_vcpu *vcpu;
+ struct kvm_run *run;
vm_vaddr_t svm_gva;
+ struct kvm_vm *vm;
+ struct ucall uc;

nested_svm_check_supported();

- vm = vm_create_default(VCPU_ID, 0, (void *) l1_guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code);

vm_init_descriptor_tables(vm);
- vcpu_init_descriptor_tables(vm, VCPU_ID);
+ vcpu_init_descriptor_tables(vm, vcpu->id);

vm_install_exception_handler(vm, VINTR_IRQ_NUMBER, vintr_irq_handler);
vm_install_exception_handler(vm, INTR_IRQ_NUMBER, intr_irq_handler);

vcpu_alloc_svm(vm, &svm_gva);
- vcpu_args_set(vm, VCPU_ID, 1, svm_gva);
+ vcpu_args_set(vm, vcpu->id, 1, svm_gva);

- struct kvm_run *run = vcpu_state(vm, VCPU_ID);
- struct ucall uc;
+ run = vcpu->run;

- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Got exit_reason other than KVM_EXIT_IO: %u (%s)\n",
run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s", (const char *)uc.args[0]);
break;
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:47:01

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 050/105] KVM: selftests: Convert vmx_dirty_log_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/vmx_dirty_log_test.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c b/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
index 68f26a8b4f42..fb8c7f7236f7 100644
--- a/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
+++ b/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
@@ -17,8 +17,6 @@
#include "processor.h"
#include "vmx.h"

-#define VCPU_ID 1
-
/* The memory slot index to track dirty pages */
#define TEST_MEM_SLOT_INDEX 1
#define TEST_MEM_PAGES 3
@@ -73,6 +71,7 @@ int main(int argc, char *argv[])
unsigned long *bmap;
uint64_t *host_test_mem;

+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct kvm_run *run;
struct ucall uc;
@@ -81,10 +80,10 @@ int main(int argc, char *argv[])
nested_vmx_check_supported();

/* Create VM */
- vm = vm_create_default(VCPU_ID, 0, l1_guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code);
vmx = vcpu_alloc_vmx(vm, &vmx_pages_gva);
- vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
- run = vcpu_state(vm, VCPU_ID);
+ vcpu_args_set(vm, vcpu->id, 1, vmx_pages_gva);
+ run = vcpu->run;

/* Add an extra memory slot for testing dirty logging */
vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
@@ -116,13 +115,13 @@ int main(int argc, char *argv[])

while (!done) {
memset(host_test_mem, 0xaa, TEST_MEM_PAGES * 4096);
- _vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Unexpected exit reason: %u (%s),\n",
run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0],
__FILE__, uc.args[1]);
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:47:13

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 004/105] KVM: selftests: Make vcpu_ioctl() a wrapper to pretty print ioctl name

Deliberately do not use __stringify(), as that will expand the ioctl all
the way down to its numerical sequence, the intent is print the name of
the macro.

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 12 +++++--
tools/testing/selftests/kvm/lib/kvm_util.c | 31 +++++--------------
2 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 77aaac4d344e..28440c12ffbc 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -152,10 +152,18 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
uint64_t guest_paddr, uint32_t slot, uint64_t npages,
uint32_t flags);

-void vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
- void *arg);
+#define __KVM_IOCTL_ERROR(_name, _ret) \
+ "%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errno)
+
+#define KVM_IOCTL_ERROR(_ioctl, _ret) __KVM_IOCTL_ERROR(#_ioctl, _ret)
+
+void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
+ const char *name, void *arg);
int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
void *arg);
+#define vcpu_ioctl(vm, vcpuid, ioctl, arg) \
+ _vcpu_ioctl(vm, vcpuid, ioctl, #ioctl, arg)
+
void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
int __vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg);
void kvm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 6f515333abe0..a6675d9aa7d9 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1898,29 +1898,6 @@ void vcpu_set_reg(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_one_reg *reg)
ret, errno, strerror(errno));
}

-/*
- * VCPU Ioctl
- *
- * Input Args:
- * vm - Virtual Machine
- * vcpuid - VCPU ID
- * cmd - Ioctl number
- * arg - Argument to pass to the ioctl
- *
- * Return: None
- *
- * Issues an arbitrary ioctl on a VCPU fd.
- */
-void vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid,
- unsigned long cmd, void *arg)
-{
- int ret;
-
- ret = __vcpu_ioctl(vm, vcpuid, cmd, arg);
- TEST_ASSERT(ret == 0, "vcpu ioctl %lu failed, rc: %i errno: %i (%s)",
- cmd, ret, errno, strerror(errno));
-}
-
int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid,
unsigned long cmd, void *arg)
{
@@ -1934,6 +1911,14 @@ int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid,
return ret;
}

+void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,
+ const char *name, void *arg)
+{
+ int ret = __vcpu_ioctl(vm, vcpuid, cmd, arg);
+
+ TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(name, ret));
+}
+
void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid)
{
struct vcpu *vcpu;
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:49:50

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 090/105] KVM: selftests: Convert sync_regs_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/s390x/sync_regs_test.c | 37 +++++++++----------
1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/tools/testing/selftests/kvm/s390x/sync_regs_test.c b/tools/testing/selftests/kvm/s390x/sync_regs_test.c
index caf7b8859a94..bf52cabeaed6 100644
--- a/tools/testing/selftests/kvm/s390x/sync_regs_test.c
+++ b/tools/testing/selftests/kvm/s390x/sync_regs_test.c
@@ -22,8 +22,6 @@
#include "kvm_util.h"
#include "diag318_test_handler.h"

-#define VCPU_ID 5
-
static void guest_code(void)
{
/*
@@ -76,6 +74,7 @@ static void compare_sregs(struct kvm_sregs *left, struct kvm_sync_regs *right)

int main(int argc, char *argv[])
{
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct kvm_run *run;
struct kvm_regs regs;
@@ -92,43 +91,43 @@ int main(int argc, char *argv[])
}

/* Create VM */
- vm = vm_create_default(VCPU_ID, 0, guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);

- run = vcpu_state(vm, VCPU_ID);
+ run = vcpu->run;

/* Request reading invalid register set from VCPU. */
run->kvm_valid_regs = INVALID_SYNC_FIELD;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv < 0 && errno == EINVAL,
"Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n",
rv);
- vcpu_state(vm, VCPU_ID)->kvm_valid_regs = 0;
+ run->kvm_valid_regs = 0;

run->kvm_valid_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv < 0 && errno == EINVAL,
"Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n",
rv);
- vcpu_state(vm, VCPU_ID)->kvm_valid_regs = 0;
+ run->kvm_valid_regs = 0;

/* Request setting invalid register set into VCPU. */
run->kvm_dirty_regs = INVALID_SYNC_FIELD;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv < 0 && errno == EINVAL,
"Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n",
rv);
- vcpu_state(vm, VCPU_ID)->kvm_dirty_regs = 0;
+ run->kvm_dirty_regs = 0;

run->kvm_dirty_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv < 0 && errno == EINVAL,
"Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n",
rv);
- vcpu_state(vm, VCPU_ID)->kvm_dirty_regs = 0;
+ run->kvm_dirty_regs = 0;

/* Request and verify all valid register sets. */
run->kvm_valid_regs = TEST_SYNC_FIELDS;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
"Unexpected exit reason: %u (%s)\n",
@@ -141,10 +140,10 @@ int main(int argc, char *argv[])
run->s390_sieic.icptcode, run->s390_sieic.ipa,
run->s390_sieic.ipb);

- vcpu_regs_get(vm, VCPU_ID, &regs);
+ vcpu_regs_get(vm, vcpu->id, &regs);
compare_regs(&regs, &run->s.regs);

- vcpu_sregs_get(vm, VCPU_ID, &sregs);
+ vcpu_sregs_get(vm, vcpu->id, &sregs);
compare_sregs(&sregs, &run->s.regs);

/* Set and verify various register values */
@@ -159,7 +158,7 @@ int main(int argc, char *argv[])
run->kvm_dirty_regs |= KVM_SYNC_DIAG318;
}

- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
"Unexpected exit reason: %u (%s)\n",
@@ -175,10 +174,10 @@ int main(int argc, char *argv[])
"diag318 sync regs value incorrect 0x%llx.",
run->s.regs.diag318);

- vcpu_regs_get(vm, VCPU_ID, &regs);
+ vcpu_regs_get(vm, vcpu->id, &regs);
compare_regs(&regs, &run->s.regs);

- vcpu_sregs_get(vm, VCPU_ID, &sregs);
+ vcpu_sregs_get(vm, vcpu->id, &sregs);
compare_sregs(&sregs, &run->s.regs);

/* Clear kvm_dirty_regs bits, verify new s.regs values are
@@ -188,7 +187,7 @@ int main(int argc, char *argv[])
run->kvm_dirty_regs = 0;
run->s.regs.gprs[11] = 0xDEADBEEF;
run->s.regs.diag318 = 0x4B1D;
- rv = _vcpu_run(vm, VCPU_ID);
+ rv = _vcpu_run(vm, vcpu->id);
TEST_ASSERT(rv == 0, "vcpu_run failed: %d\n", rv);
TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
"Unexpected exit reason: %u (%s)\n",
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:52:18

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 079/105] KVM: selftests: Return created vcpu from vm_vcpu_add_default()

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/aarch64/processor.h | 5 +++--
.../selftests/kvm/include/kvm_util_base.h | 10 ++++++----
.../selftests/kvm/lib/aarch64/processor.c | 20 +++++++++++--------
.../selftests/kvm/lib/riscv/processor.c | 18 ++++++++++-------
.../selftests/kvm/lib/s390x/processor.c | 18 ++++++++++-------
.../selftests/kvm/lib/x86_64/processor.c | 20 +++++++++++--------
6 files changed, 55 insertions(+), 36 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h
index 9a430980100e..5999e7ae7b29 100644
--- a/tools/testing/selftests/kvm/include/aarch64/processor.h
+++ b/tools/testing/selftests/kvm/include/aarch64/processor.h
@@ -64,8 +64,9 @@ static inline void set_reg(struct kvm_vm *vm, uint32_t vcpuid, uint64_t id, uint
}

void aarch64_vcpu_setup(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_vcpu_init *init);
-void aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid,
- struct kvm_vcpu_init *init, void *guest_code);
+struct kvm_vcpu *aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpu_id,
+ struct kvm_vcpu_init *init,
+ void *guest_code);

struct ex_regs {
u64 regs[31];
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index aa2e68bca741..19a7e507b8e7 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -637,12 +637,14 @@ static inline void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
* vcpuid - The id of the VCPU to add to the VM.
* guest_code - The vCPU's entry point
*/
-void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code);
+struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code);

-static inline void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid,
- void *guest_code)
+static inline struct kvm_vcpu *vm_vcpu_add_default(struct kvm_vm *vm,
+ uint32_t vcpu_id,
+ void *guest_code)
{
- vm_arch_vcpu_add(vm, vcpuid, guest_code);
+ return vm_arch_vcpu_add(vm, vcpu_id, guest_code);
}

void virt_arch_pgd_alloc(struct kvm_vm *vm);
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 653e740c46b1..089e6de2160c 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -314,25 +314,29 @@ void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t in
indent, "", pstate, pc);
}

-void aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid,
- struct kvm_vcpu_init *init, void *guest_code)
+struct kvm_vcpu *aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpu_id,
+ struct kvm_vcpu_init *init,
+ void *guest_code)
{
size_t stack_size = vm->page_size == 4096 ?
DEFAULT_STACK_PGS * vm->page_size :
vm->page_size;
uint64_t stack_vaddr = vm_vaddr_alloc(vm, stack_size,
DEFAULT_ARM64_GUEST_STACK_VADDR_MIN);
+ struct kvm_vcpu *vcpu = vm_vcpu_add(vm, vcpu_id);

- vm_vcpu_add(vm, vcpuid);
- aarch64_vcpu_setup(vm, vcpuid, init);
+ aarch64_vcpu_setup(vm, vcpu_id, init);

- set_reg(vm, vcpuid, ARM64_CORE_REG(sp_el1), stack_vaddr + stack_size);
- set_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), (uint64_t)guest_code);
+ set_reg(vm, vcpu_id, ARM64_CORE_REG(sp_el1), stack_vaddr + stack_size);
+ set_reg(vm, vcpu_id, ARM64_CORE_REG(regs.pc), (uint64_t)guest_code);
+
+ return vcpu;
}

-void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code)
{
- aarch64_vcpu_add_default(vm, vcpuid, NULL, guest_code);
+ return aarch64_vcpu_add_default(vm, vcpu_id, NULL, guest_code);
}

void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
diff --git a/tools/testing/selftests/kvm/lib/riscv/processor.c b/tools/testing/selftests/kvm/lib/riscv/processor.c
index 8f415633ed12..34a9f0cf05ba 100644
--- a/tools/testing/selftests/kvm/lib/riscv/processor.c
+++ b/tools/testing/selftests/kvm/lib/riscv/processor.c
@@ -273,7 +273,8 @@ static void guest_hang(void)
;
}

-void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code)
{
int r;
size_t stack_size = vm->page_size == 4096 ?
@@ -283,8 +284,9 @@ void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
DEFAULT_RISCV_GUEST_STACK_VADDR_MIN);
unsigned long current_gp = 0;
struct kvm_mp_state mps;
+ struct kvm_vcpu *vcpu;

- vm_vcpu_add(vm, vcpuid);
+ vcpu = vm_vcpu_add(vm, vcpuid);
riscv_vcpu_mmu_setup(vm, vcpuid);

/*
@@ -293,23 +295,25 @@ void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
* are powered-on using KVM_SET_MP_STATE ioctl().
*/
mps.mp_state = KVM_MP_STATE_RUNNABLE;
- r = __vcpu_ioctl(vm, vcpuid, KVM_SET_MP_STATE, &mps);
+ r = __vcpu_ioctl(vm, vcpu_id, KVM_SET_MP_STATE, &mps);
TEST_ASSERT(!r, "IOCTL KVM_SET_MP_STATE failed (error %d)", r);

/* Setup global pointer of guest to be same as the host */
asm volatile (
"add %0, gp, zero" : "=r" (current_gp) : : "memory");
- set_reg(vm, vcpuid, RISCV_CORE_REG(regs.gp), current_gp);
+ set_reg(vm, vcpu_id, RISCV_CORE_REG(regs.gp), current_gp);

/* Setup stack pointer and program counter of guest */
- set_reg(vm, vcpuid, RISCV_CORE_REG(regs.sp),
+ set_reg(vm, vcpu_id, RISCV_CORE_REG(regs.sp),
stack_vaddr + stack_size);
- set_reg(vm, vcpuid, RISCV_CORE_REG(regs.pc),
+ set_reg(vm, vcpu_id, RISCV_CORE_REG(regs.pc),
(unsigned long)guest_code);

/* Setup default exception vector of guest */
- set_reg(vm, vcpuid, RISCV_CSR_REG(stvec),
+ set_reg(vm, vcpu_id, RISCV_CSR_REG(stvec),
(unsigned long)guest_hang);
+
+ return vcpu;
}

void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index c2fe56a3fb74..5c59a1d7ec6d 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -154,12 +154,14 @@ void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
virt_dump_region(stream, vm, indent, vm->pgd);
}

-void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code)
{
size_t stack_size = DEFAULT_STACK_PGS * getpagesize();
uint64_t stack_vaddr;
struct kvm_regs regs;
struct kvm_sregs sregs;
+ struct kvm_vcpu *vcpu;
struct kvm_run *run;

TEST_ASSERT(vm->page_size == 4096, "Unsupported page size: 0x%x",
@@ -168,21 +170,23 @@ void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
stack_vaddr = vm_vaddr_alloc(vm, stack_size,
DEFAULT_GUEST_STACK_VADDR_MIN);

- vm_vcpu_add(vm, vcpuid);
+ vcpu = vm_vcpu_add(vm, vcpuid);

/* Setup guest registers */
- vcpu_regs_get(vm, vcpuid, &regs);
+ vcpu_regs_get(vm, vcpu_id, &regs);
regs.gprs[15] = stack_vaddr + (DEFAULT_STACK_PGS * getpagesize()) - 160;
- vcpu_regs_set(vm, vcpuid, &regs);
+ vcpu_regs_set(vm, vcpu_id, &regs);

- vcpu_sregs_get(vm, vcpuid, &sregs);
+ vcpu_sregs_get(vm, vcpu_id, &sregs);
sregs.crs[0] |= 0x00040000; /* Enable floating point regs */
sregs.crs[1] = vm->pgd | 0xf; /* Primary region table */
- vcpu_sregs_set(vm, vcpuid, &sregs);
+ vcpu_sregs_set(vm, vcpu_id, &sregs);

- run = vcpu_state(vm, vcpuid);
+ run = vcpu_state(vm, vcpu_id);
run->psw_mask = 0x0400000180000000ULL; /* DAT enabled + 64 bit mode */
run->psw_addr = (uintptr_t)guest_code;
+
+ return vcpu;
}

void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index fd14351a3835..24ec376c5d6d 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -671,29 +671,33 @@ void vm_xsave_req_perm(int bit)
bitmask);
}

-void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,
+ void *guest_code)
{
struct kvm_mp_state mp_state;
struct kvm_regs regs;
vm_vaddr_t stack_vaddr;
+ struct kvm_vcpu *vcpu;
+
stack_vaddr = vm_vaddr_alloc(vm, DEFAULT_STACK_PGS * getpagesize(),
DEFAULT_GUEST_STACK_VADDR_MIN);

- /* Create VCPU */
- vm_vcpu_add(vm, vcpuid);
- vcpu_set_cpuid(vm, vcpuid, kvm_get_supported_cpuid());
- vcpu_setup(vm, vcpuid);
+ vcpu = vm_vcpu_add(vm, vcpu_id);
+ vcpu_set_cpuid(vm, vcpu_id, kvm_get_supported_cpuid());
+ vcpu_setup(vm, vcpu_id);

/* Setup guest general purpose registers */
- vcpu_regs_get(vm, vcpuid, &regs);
+ vcpu_regs_get(vm, vcpu_id, &regs);
regs.rflags = regs.rflags | 0x2;
regs.rsp = stack_vaddr + (DEFAULT_STACK_PGS * getpagesize());
regs.rip = (unsigned long) guest_code;
- vcpu_regs_set(vm, vcpuid, &regs);
+ vcpu_regs_set(vm, vcpu_id, &regs);

/* Setup the MP state */
mp_state.mp_state = 0;
- vcpu_set_mp_state(vm, vcpuid, &mp_state);
+ vcpu_set_mp_state(vm, vcpu_id, &mp_state);
+
+ return vcpu;
}

/*
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:52:32

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 076/105] KVM: selftests: Make arm64's guest_get_vcpuid() declaration arm64-only

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/include/aarch64/processor.h | 2 ++
tools/testing/selftests/kvm/include/kvm_util_base.h | 2 --
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/aarch64/processor.h b/tools/testing/selftests/kvm/include/aarch64/processor.h
index 8f9f46979a00..9a430980100e 100644
--- a/tools/testing/selftests/kvm/include/aarch64/processor.h
+++ b/tools/testing/selftests/kvm/include/aarch64/processor.h
@@ -185,4 +185,6 @@ static inline void local_irq_disable(void)
asm volatile("msr daifset, #3" : : : "memory");
}

+uint32_t guest_get_vcpuid(void);
+
#endif /* SELFTEST_KVM_PROCESSOR_H */
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index c64e99b9b6b3..e1e25ec09158 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -694,6 +694,4 @@ void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid);

int vm_get_stats_fd(struct kvm_vm *vm);

-uint32_t guest_get_vcpuid(void);
-
#endif /* SELFTEST_KVM_UTIL_BASE_H */
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:53:09

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 040/105] KVM: selftests: Convert smm_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/x86_64/smm_test.c | 37 +++++++++----------
1 file changed, 18 insertions(+), 19 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/smm_test.c b/tools/testing/selftests/kvm/x86_64/smm_test.c
index 9757c45575ff..dfb2e92e8e12 100644
--- a/tools/testing/selftests/kvm/x86_64/smm_test.c
+++ b/tools/testing/selftests/kvm/x86_64/smm_test.c
@@ -19,8 +19,6 @@
#include "vmx.h"
#include "svm_util.h"

-#define VCPU_ID 1
-
#define PAGE_SIZE 4096

#define SMRAM_SIZE 65536
@@ -118,22 +116,23 @@ static void guest_code(void *arg)
sync_with_host(DONE);
}

-void inject_smi(struct kvm_vm *vm)
+void inject_smi(struct kvm_vcpu *vcpu)
{
struct kvm_vcpu_events events;

- vcpu_events_get(vm, VCPU_ID, &events);
+ vcpu_events_get(vcpu->vm, vcpu->id, &events);

events.smi.pending = 1;
events.flags |= KVM_VCPUEVENT_VALID_SMM;

- vcpu_events_set(vm, VCPU_ID, &events);
+ vcpu_events_set(vcpu->vm, vcpu->id, &events);
}

int main(int argc, char *argv[])
{
vm_vaddr_t nested_gva = 0;

+ struct kvm_vcpu *vcpu;
struct kvm_regs regs;
struct kvm_vm *vm;
struct kvm_run *run;
@@ -141,9 +140,9 @@ int main(int argc, char *argv[])
int stage, stage_reported;

/* Create VM */
- vm = vm_create_default(VCPU_ID, 0, guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);

- run = vcpu_state(vm, VCPU_ID);
+ run = vcpu->run;

vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, SMRAM_GPA,
SMRAM_MEMSLOT, SMRAM_PAGES, 0);
@@ -154,7 +153,7 @@ int main(int argc, char *argv[])
memcpy(addr_gpa2hva(vm, SMRAM_GPA) + 0x8000, smi_handler,
sizeof(smi_handler));

- vcpu_set_msr(vm, VCPU_ID, MSR_IA32_SMBASE, SMRAM_GPA);
+ vcpu_set_msr(vm, vcpu->id, MSR_IA32_SMBASE, SMRAM_GPA);

if (kvm_check_cap(KVM_CAP_NESTED_STATE)) {
if (nested_svm_supported())
@@ -166,17 +165,17 @@ int main(int argc, char *argv[])
if (!nested_gva)
pr_info("will skip SMM test with VMX enabled\n");

- vcpu_args_set(vm, VCPU_ID, 1, nested_gva);
+ vcpu_args_set(vm, vcpu->id, 1, nested_gva);

for (stage = 1;; stage++) {
- _vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Stage %d: unexpected exit reason: %u (%s),\n",
stage, run->exit_reason,
exit_reason_str(run->exit_reason));

memset(&regs, 0, sizeof(regs));
- vcpu_regs_get(vm, VCPU_ID, &regs);
+ vcpu_regs_get(vm, vcpu->id, &regs);

stage_reported = regs.rax & 0xff;

@@ -193,7 +192,7 @@ int main(int argc, char *argv[])
* return from it. Do not perform save/restore while in SMM yet.
*/
if (stage == 8) {
- inject_smi(vm);
+ inject_smi(vcpu);
continue;
}

@@ -202,15 +201,15 @@ int main(int argc, char *argv[])
* during L2 execution.
*/
if (stage == 10)
- inject_smi(vm);
+ inject_smi(vcpu);

- state = vcpu_save_state(vm, VCPU_ID);
+ state = vcpu_save_state(vm, vcpu->id);
kvm_vm_release(vm);
- kvm_vm_restart(vm);
- vm_vcpu_add(vm, VCPU_ID);
- vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
- vcpu_load_state(vm, VCPU_ID, state);
- run = vcpu_state(vm, VCPU_ID);
+
+ vcpu = vm_recreate_with_one_vcpu(vm);
+ vcpu_set_cpuid(vm, vcpu->id, kvm_get_supported_cpuid());
+ vcpu_load_state(vm, vcpu->id, state);
+ run = vcpu->run;
kvm_x86_state_cleanup(state);
}

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:53:20

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 021/105] KVM: selftests: Move KVM_CREATE_DEVICE_TEST code to separate helper

Signed-off-by: Sean Christopherson <[email protected]>
---
.../testing/selftests/kvm/aarch64/vgic_init.c | 10 ++++----
.../selftests/kvm/include/kvm_util_base.h | 3 ++-
tools/testing/selftests/kvm/lib/kvm_util.c | 23 ++++++++++++++-----
3 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 9cd58f22f5bd..18d1d0335108 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -648,24 +648,24 @@ int test_kvm_device(uint32_t gic_dev_type)
v.vm = vm_create_default_with_vcpus(NR_VCPUS, 0, 0, guest_code, NULL);

/* try to create a non existing KVM device */
- ret = _kvm_create_device(v.vm, 0, true, &fd);
+ ret = __kvm_test_create_device(v.vm, 0);
TEST_ASSERT(ret && errno == ENODEV, "unsupported device");

/* trial mode */
- ret = _kvm_create_device(v.vm, gic_dev_type, true, &fd);
+ ret = __kvm_test_create_device(v.vm, gic_dev_type);
if (ret)
return ret;
v.gic_fd = kvm_create_device(v.vm, gic_dev_type);

- ret = _kvm_create_device(v.vm, gic_dev_type, false, &fd);
+ ret = __kvm_create_device(v.vm, gic_dev_type, &fd);
TEST_ASSERT(ret && errno == EEXIST, "create GIC device twice");

/* try to create the other gic_dev_type */
other = VGIC_DEV_IS_V2(gic_dev_type) ? KVM_DEV_TYPE_ARM_VGIC_V3
: KVM_DEV_TYPE_ARM_VGIC_V2;

- if (!_kvm_create_device(v.vm, other, true, &fd)) {
- ret = _kvm_create_device(v.vm, other, false, &fd);
+ if (!__kvm_test_create_device(v.vm, other)) {
+ ret = __kvm_test_create_device(v.vm, other);
TEST_ASSERT(ret && errno == EINVAL,
"create GIC device while other version exists");
}
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 03575063ee13..081ba04e5df3 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -479,7 +479,8 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);

int _kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr);
-int _kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test, int *fd);
+int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
+int __kvm_create_device(struct kvm_vm *vm, uint64_t type, int *fd);
int kvm_create_device(struct kvm_vm *vm, uint64_t type);
int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
void *val, bool write);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index bfa7174a7892..f0a08de67f0f 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1600,14 +1600,25 @@ int kvm_device_check_attr(int dev_fd, uint32_t group, uint64_t attr)
return ret;
}

-int _kvm_create_device(struct kvm_vm *vm, uint64_t type, bool test, int *fd)
+int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type)
{
- struct kvm_create_device create_dev;
+ struct kvm_create_device create_dev = {
+ .type = type,
+ .flags = KVM_CREATE_DEVICE_TEST,
+ };
+
+ return __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
+}
+
+int __kvm_create_device(struct kvm_vm *vm, uint64_t type, int *fd)
+{
+ struct kvm_create_device create_dev = {
+ .type = type,
+ .fd = -1,
+ .flags = 0,
+ };
int ret;

- create_dev.type = type;
- create_dev.fd = -1;
- create_dev.flags = test ? KVM_CREATE_DEVICE_TEST : 0;
ret = __vm_ioctl(vm, KVM_CREATE_DEVICE, &create_dev);
*fd = create_dev.fd;
return ret;
@@ -1617,7 +1628,7 @@ int kvm_create_device(struct kvm_vm *vm, uint64_t type)
{
int fd, ret;

- ret = _kvm_create_device(vm, type, false, &fd);
+ ret = __kvm_create_device(vm, type, &fd);

TEST_ASSERT(!ret, "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", ret, errno);
return fd;
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:53:32

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 093/105] KVM: selftests: Convert s390x/diag318_test_handler away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/lib/s390x/diag318_test_handler.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.c b/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.c
index 86b9e611ad87..21c31fe10c1a 100644
--- a/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.c
+++ b/tools/testing/selftests/kvm/lib/s390x/diag318_test_handler.c
@@ -8,8 +8,6 @@
#include "test_util.h"
#include "kvm_util.h"

-#define VCPU_ID 6
-
#define ICPT_INSTRUCTION 0x04
#define IPA0_DIAG 0x8300

@@ -27,14 +25,15 @@ static void guest_code(void)
*/
static uint64_t diag318_handler(void)
{
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct kvm_run *run;
uint64_t reg;
uint64_t diag318_info;

- vm = vm_create_default(VCPU_ID, 0, guest_code);
- vcpu_run(vm, VCPU_ID);
- run = vcpu_state(vm, VCPU_ID);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
+ vcpu_run(vm, vcpu->id);
+ run = vcpu->run;

TEST_ASSERT(run->exit_reason == KVM_EXIT_S390_SIEIC,
"DIAGNOSE 0x0318 instruction was not intercepted");
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:54:00

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 081/105] KVM: selftests: Convert set_boot_cpu_id away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/set_boot_cpu_id.c | 85 ++++++++-----------
1 file changed, 34 insertions(+), 51 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
index b6a1dceb2be9..5b0c61127dd7 100644
--- a/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
+++ b/tools/testing/selftests/kvm/x86_64/set_boot_cpu_id.c
@@ -16,10 +16,6 @@
#include "processor.h"
#include "apic.h"

-#define N_VCPU 2
-#define VCPU_ID0 0
-#define VCPU_ID1 1
-
static void guest_bsp_vcpu(void *arg)
{
GUEST_SYNC(1);
@@ -38,31 +34,30 @@ static void guest_not_bsp_vcpu(void *arg)
GUEST_DONE();
}

-static void test_set_boot_busy(struct kvm_vm *vm)
+static void test_set_bsp_busy(struct kvm_vcpu *vcpu, const char *msg)
{
- int res;
+ int r = __vm_ioctl(vcpu->vm, KVM_SET_BOOT_CPU_ID,
+ (void *)(unsigned long)vcpu->id);

- res = __vm_ioctl(vm, KVM_SET_BOOT_CPU_ID, (void *) VCPU_ID0);
- TEST_ASSERT(res == -1 && errno == EBUSY,
- "KVM_SET_BOOT_CPU_ID set while running vm");
+ TEST_ASSERT(r == -1 && errno == EBUSY, "KVM_SET_BOOT_CPU_ID set %s", msg);
}

-static void run_vcpu(struct kvm_vm *vm, uint32_t vcpuid)
+static void run_vcpu(struct kvm_vcpu *vcpu)
{
struct ucall uc;
int stage;

for (stage = 0; stage < 2; stage++) {

- vcpu_run(vm, vcpuid);
+ vcpu_run(vcpu->vm, vcpu->id);

- switch (get_ucall(vm, vcpuid, &uc)) {
+ switch (get_ucall(vcpu->vm, vcpu->id, &uc)) {
case UCALL_SYNC:
TEST_ASSERT(!strcmp((const char *)uc.args[0], "hello") &&
uc.args[1] == stage + 1,
"Stage %d: Unexpected register values vmexit, got %lx",
stage + 1, (ulong)uc.args[1]);
- test_set_boot_busy(vm);
+ test_set_bsp_busy(vcpu, "while running vm");
break;
case UCALL_DONE:
TEST_ASSERT(stage == 1,
@@ -75,17 +70,19 @@ static void run_vcpu(struct kvm_vm *vm, uint32_t vcpuid)
uc.args[1], uc.args[2], uc.args[3]);
default:
TEST_ASSERT(false, "Unexpected exit: %s",
- exit_reason_str(vcpu_state(vm, vcpuid)->exit_reason));
+ exit_reason_str(vcpu->run->exit_reason));
}
}
}

-static struct kvm_vm *create_vm(void)
+static struct kvm_vm *create_vm(uint32_t nr_vcpus, uint32_t bsp_vcpu_id,
+ struct kvm_vcpu *vcpus[])
{
- struct kvm_vm *vm;
- uint64_t vcpu_pages = (DEFAULT_STACK_PGS) * 2;
- uint64_t extra_pg_pages = vcpu_pages / PTES_PER_MIN_PAGE * N_VCPU;
+ uint64_t vcpu_pages = (DEFAULT_STACK_PGS) * nr_vcpus;
+ uint64_t extra_pg_pages = vcpu_pages / PTES_PER_MIN_PAGE * nr_vcpus;
uint64_t pages = DEFAULT_GUEST_PHY_PAGES + vcpu_pages + extra_pg_pages;
+ struct kvm_vm *vm;
+ uint32_t i;

pages = vm_adjust_num_guest_pages(VM_MODE_DEFAULT, pages);
vm = vm_create(pages);
@@ -93,54 +90,40 @@ static struct kvm_vm *create_vm(void)
kvm_vm_elf_load(vm, program_invocation_name);
vm_create_irqchip(vm);

+ vm_ioctl(vm, KVM_SET_BOOT_CPU_ID, (void *)(unsigned long)bsp_vcpu_id);
+
+ for (i = 0; i < nr_vcpus; i++)
+ vcpus[i] = vm_vcpu_add(vm, i, i == bsp_vcpu_id ? guest_bsp_vcpu :
+ guest_not_bsp_vcpu);
return vm;
}

-static void add_x86_vcpu(struct kvm_vm *vm, uint32_t vcpuid, bool bsp_code)
-{
- if (bsp_code)
- vm_vcpu_add(vm, vcpuid, guest_bsp_vcpu);
- else
- vm_vcpu_add(vm, vcpuid, guest_not_bsp_vcpu);
-}
-
-static void run_vm_bsp(uint32_t bsp_vcpu)
+static void run_vm_bsp(uint32_t bsp_vcpu_id)
{
+ struct kvm_vcpu *vcpus[2];
struct kvm_vm *vm;
- bool is_bsp_vcpu1 = bsp_vcpu == VCPU_ID1;

- vm = create_vm();
+ vm = create_vm(ARRAY_SIZE(vcpus), bsp_vcpu_id, vcpus);

- if (is_bsp_vcpu1)
- vm_ioctl(vm, KVM_SET_BOOT_CPU_ID, (void *) VCPU_ID1);
-
- add_x86_vcpu(vm, VCPU_ID0, !is_bsp_vcpu1);
- add_x86_vcpu(vm, VCPU_ID1, is_bsp_vcpu1);
-
- run_vcpu(vm, VCPU_ID0);
- run_vcpu(vm, VCPU_ID1);
+ run_vcpu(vcpus[0]);
+ run_vcpu(vcpus[1]);

kvm_vm_free(vm);
}

static void check_set_bsp_busy(void)
{
+ struct kvm_vcpu *vcpus[2];
struct kvm_vm *vm;
- int res;

- vm = create_vm();
+ vm = create_vm(ARRAY_SIZE(vcpus), 0, vcpus);

- add_x86_vcpu(vm, VCPU_ID0, true);
- add_x86_vcpu(vm, VCPU_ID1, false);
+ test_set_bsp_busy(vcpus[1], "after adding vcpu");

- res = __vm_ioctl(vm, KVM_SET_BOOT_CPU_ID, (void *) VCPU_ID1);
- TEST_ASSERT(res == -1 && errno == EBUSY, "KVM_SET_BOOT_CPU_ID set after adding vcpu");
+ run_vcpu(vcpus[0]);
+ run_vcpu(vcpus[1]);

- run_vcpu(vm, VCPU_ID0);
- run_vcpu(vm, VCPU_ID1);
-
- res = __vm_ioctl(vm, KVM_SET_BOOT_CPU_ID, (void *) VCPU_ID1);
- TEST_ASSERT(res == -1 && errno == EBUSY, "KVM_SET_BOOT_CPU_ID set to a terminated vcpu");
+ test_set_bsp_busy(vcpus[1], "to a terminated vcpu");

kvm_vm_free(vm);
}
@@ -152,9 +135,9 @@ int main(int argc, char *argv[])
return 0;
}

- run_vm_bsp(VCPU_ID0);
- run_vm_bsp(VCPU_ID1);
- run_vm_bsp(VCPU_ID0);
+ run_vm_bsp(0);
+ run_vm_bsp(1);
+ run_vm_bsp(0);

check_set_bsp_busy();
}
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:54:22

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 087/105] KVM: selftests: Fix typo in vgic_init test

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/vgic_init.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 32dac03f5600..f8d41f12bdca 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -418,7 +418,7 @@ static void test_v3_typer_accesses(void)
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

for (i = 0; i < NR_VCPUS ; i++) {
- ret = v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, &val);
+ ret = v3_redist_reg_get(v.gic_fd, i, GICR_TYPER, &val);
TEST_ASSERT(!ret && !val, "read GICR_TYPER before rdist region setting");
}

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:54:25

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 024/105] KVM: selftests: Drop 'int' return from asserting *_device_has_attr()

Signed-off-by: Sean Christopherson <[email protected]>
---
.../testing/selftests/kvm/aarch64/vgic_init.c | 4 ++--
.../selftests/kvm/include/kvm_util_base.h | 20 ++++++++++++++++---
tools/testing/selftests/kvm/lib/kvm_util.c | 17 ----------------
3 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 223fef4c1f62..2425894b3775 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -201,8 +201,8 @@ static void subtest_v3_redist_regions(struct vm_gic *v)
uint64_t addr, expected_addr;
int ret;

- ret = kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST);
+ ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST);
TEST_ASSERT(!ret, "Multiple redist regions advertised");

addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 2, 0);
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 97cdeeac4db6..4cc2553887f7 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -478,7 +478,14 @@ void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid);
void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);

int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
-int kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
+
+static inline void kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
+{
+ int ret = __kvm_has_device_attr(dev_fd, group, attr);
+
+ TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR failed, rc: %i errno: %i", ret, errno);
+}
+
int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
int __kvm_create_device(struct kvm_vm *vm, uint64_t type);
int kvm_create_device(struct kvm_vm *vm, uint64_t type);
@@ -491,8 +498,15 @@ int _kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level);

int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr);
-int vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr);
+
+static inline void vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid,
+ uint32_t group, uint64_t attr)
+{
+ int ret = __vcpu_has_device_attr(vm, vcpuid, group, attr);
+
+ TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_HAS_DEVICE_ATTR, ret));
+}
+
int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr, void *val, bool write);
int vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index f9547edb30ad..e635241e3ee5 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1592,14 +1592,6 @@ int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
return ioctl(dev_fd, KVM_HAS_DEVICE_ATTR, &attribute);
}

-int kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
-{
- int ret = __kvm_has_device_attr(dev_fd, group, attr);
-
- TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR failed, rc: %i errno: %i", ret, errno);
- return ret;
-}
-
int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type)
{
struct kvm_create_device create_dev = {
@@ -1665,15 +1657,6 @@ int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
return __kvm_has_device_attr(vcpu->fd, group, attr);
}

-int vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr)
-{
- int ret = __vcpu_has_device_attr(vm, vcpuid, group, attr);
-
- TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR IOCTL failed, rc: %i errno: %i", ret, errno);
- return ret;
-}
-
int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr, void *val, bool write)
{
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:54:51

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 059/105] KVM: selftests: Convert hyperv_clock away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/hyperv_clock.c | 25 +++++++++----------
1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/hyperv_clock.c b/tools/testing/selftests/kvm/x86_64/hyperv_clock.c
index e0b2bb1339b1..43584ddc4de0 100644
--- a/tools/testing/selftests/kvm/x86_64/hyperv_clock.c
+++ b/tools/testing/selftests/kvm/x86_64/hyperv_clock.c
@@ -171,22 +171,20 @@ static void guest_main(struct ms_hyperv_tsc_page *tsc_page, vm_paddr_t tsc_page_
GUEST_DONE();
}

-#define VCPU_ID 0
-
-static void host_check_tsc_msr_rdtsc(struct kvm_vm *vm)
+static void host_check_tsc_msr_rdtsc(struct kvm_vcpu *vcpu)
{
u64 tsc_freq, r1, r2, t1, t2;
s64 delta_ns;

- tsc_freq = vcpu_get_msr(vm, VCPU_ID, HV_X64_MSR_TSC_FREQUENCY);
+ tsc_freq = vcpu_get_msr(vcpu->vm, vcpu->id, HV_X64_MSR_TSC_FREQUENCY);
TEST_ASSERT(tsc_freq > 0, "TSC frequency must be nonzero");

/* First, check MSR-based clocksource */
r1 = rdtsc();
- t1 = vcpu_get_msr(vm, VCPU_ID, HV_X64_MSR_TIME_REF_COUNT);
+ t1 = vcpu_get_msr(vcpu->vm, vcpu->id, HV_X64_MSR_TIME_REF_COUNT);
nop_loop();
r2 = rdtsc();
- t2 = vcpu_get_msr(vm, VCPU_ID, HV_X64_MSR_TIME_REF_COUNT);
+ t2 = vcpu_get_msr(vcpu->vm, vcpu->id, HV_X64_MSR_TIME_REF_COUNT);

TEST_ASSERT(t2 > t1, "Time reference MSR is not monotonic (%ld <= %ld)", t1, t2);

@@ -203,33 +201,34 @@ static void host_check_tsc_msr_rdtsc(struct kvm_vm *vm)

int main(void)
{
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct kvm_run *run;
struct ucall uc;
vm_vaddr_t tsc_page_gva;
int stage;

- vm = vm_create_default(VCPU_ID, 0, guest_main);
- run = vcpu_state(vm, VCPU_ID);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_main);
+ run = vcpu->run;

- vcpu_set_hv_cpuid(vm, VCPU_ID);
+ vcpu_set_hv_cpuid(vm, vcpu->id);

tsc_page_gva = vm_vaddr_alloc_page(vm);
memset(addr_gva2hva(vm, tsc_page_gva), 0x0, getpagesize());
TEST_ASSERT((addr_gva2gpa(vm, tsc_page_gva) & (getpagesize() - 1)) == 0,
"TSC page has to be page aligned\n");
- vcpu_args_set(vm, VCPU_ID, 2, tsc_page_gva, addr_gva2gpa(vm, tsc_page_gva));
+ vcpu_args_set(vm, vcpu->id, 2, tsc_page_gva, addr_gva2gpa(vm, tsc_page_gva));

- host_check_tsc_msr_rdtsc(vm);
+ host_check_tsc_msr_rdtsc(vcpu);

for (stage = 1;; stage++) {
- _vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Stage %d: unexpected exit reason: %u (%s),\n",
stage, run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s at %s:%ld", (const char *)uc.args[0],
__FILE__, uc.args[1]);
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:55:20

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 012/105] KVM: selftests: Add vcpu_get() to retrieve and assert on vCPU existence

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/lib/kvm_util.c | 56 ++++++-------------
.../selftests/kvm/lib/kvm_util_internal.h | 2 +-
.../selftests/kvm/lib/s390x/processor.c | 5 +-
.../selftests/kvm/lib/x86_64/processor.c | 6 +-
4 files changed, 21 insertions(+), 48 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 52fefa51071a..d45f2ec7b13e 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -553,23 +553,7 @@ kvm_userspace_memory_region_find(struct kvm_vm *vm, uint64_t start,
return &region->region;
}

-/*
- * VCPU Find
- *
- * Input Args:
- * vm - Virtual Machine
- * vcpuid - VCPU ID
- *
- * Output Args: None
- *
- * Return:
- * Pointer to VCPU structure
- *
- * Locates a vcpu structure that describes the VCPU specified by vcpuid and
- * returns a pointer to it. Returns NULL if the VM doesn't contain a VCPU
- * for the specified vcpuid.
- */
-struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid)
+static struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid)
{
struct vcpu *vcpu;

@@ -581,6 +565,14 @@ struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid)
return NULL;
}

+struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid)
+{
+ struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+
+ TEST_ASSERT(vcpu, "vCPU %d does not exist", vcpuid);
+ return vcpu;
+}
+
/*
* VM VCPU Remove
*
@@ -1530,8 +1522,7 @@ void vm_create_irqchip(struct kvm_vm *vm)
*/
struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
- TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);

return vcpu->state;
}
@@ -1572,11 +1563,9 @@ int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)

void vcpu_run_complete_io(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);
int ret;

- TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
-
vcpu->state->immediate_exit = 1;
ret = __vcpu_run(vm, vcpuid);
vcpu->state->immediate_exit = 0;
@@ -1618,14 +1607,9 @@ struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid)
int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid,
unsigned long cmd, void *arg)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
- int ret;
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);

- TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
-
- ret = ioctl(vcpu->fd, cmd, arg);
-
- return ret;
+ return ioctl(vcpu->fd, cmd, arg);
}

void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,
@@ -1638,15 +1622,11 @@ void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,

void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu;
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);
uint32_t size = vm->dirty_ring_size;

TEST_ASSERT(size > 0, "Should enable dirty ring first");

- vcpu = vcpu_find(vm, vcpuid);
-
- TEST_ASSERT(vcpu, "Cannot find vcpu %u", vcpuid);
-
if (!vcpu->dirty_gfns) {
void *addr;

@@ -1802,9 +1782,7 @@ int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
int _vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
-
- TEST_ASSERT(vcpu, "nonexistent vcpu id: %d", vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);

return _kvm_device_check_attr(vcpu->fd, group, attr);
}
@@ -1821,9 +1799,7 @@ int vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
uint64_t attr, void *val, bool write)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
-
- TEST_ASSERT(vcpu, "nonexistent vcpu id: %d", vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);

return _kvm_device_access(vcpu->fd, group, attr, val, write);
}
diff --git a/tools/testing/selftests/kvm/lib/kvm_util_internal.h b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
index a03febc24ba6..0c7c44499129 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util_internal.h
+++ b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
@@ -69,7 +69,7 @@ struct kvm_vm {
uint32_t dirty_ring_size;
};

-struct vcpu *vcpu_find(struct kvm_vm *vm, uint32_t vcpuid);
+struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);

/*
* Virtual Translation Tables Dump
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index f87c7137598e..7cc1051c4b71 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -208,10 +208,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)

void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
-
- if (!vcpu)
- return;
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);

fprintf(stream, "%*spstate: psw: 0x%.16llx:0x%.16llx\n",
indent, "", vcpu->state->psw_mask, vcpu->state->psw_addr);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index fb05bed7ec1e..4065fc4daada 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -841,7 +841,7 @@ uint64_t kvm_get_feature_msr(uint64_t msr_index)
*/
struct kvm_cpuid2 *vcpu_get_cpuid(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);
struct kvm_cpuid2 *cpuid;
int max_ent;
int rc = -1;
@@ -1039,7 +1039,7 @@ static int vcpu_save_xsave_state(struct kvm_vm *vm, struct vcpu *vcpu,

struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);
struct kvm_msr_list *list;
struct kvm_x86_state *state;
int nmsrs, r, i;
@@ -1122,7 +1122,7 @@ struct kvm_x86_state *vcpu_save_state(struct kvm_vm *vm, uint32_t vcpuid)

void vcpu_load_state(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_x86_state *state)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
+ struct vcpu *vcpu = vcpu_get(vm, vcpuid);
int r;

r = ioctl(vcpu->fd, KVM_SET_SREGS, &state->sregs);
--
2.35.1.723.g4982287a31-goog

2022-03-11 22:59:22

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 018/105] KVM: selftests: Get rid of kvm_util_internal.h

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 99 +++++++++++++++++--
.../selftests/kvm/lib/aarch64/processor.c | 1 -
.../testing/selftests/kvm/lib/aarch64/ucall.c | 1 -
.../testing/selftests/kvm/lib/aarch64/vgic.c | 1 -
tools/testing/selftests/kvm/lib/elf.c | 1 -
tools/testing/selftests/kvm/lib/kvm_util.c | 1 -
.../selftests/kvm/lib/kvm_util_internal.h | 94 ------------------
.../selftests/kvm/lib/riscv/processor.c | 1 -
tools/testing/selftests/kvm/lib/riscv/ucall.c | 1 -
.../selftests/kvm/lib/s390x/processor.c | 1 -
.../selftests/kvm/lib/x86_64/processor.c | 1 -
tools/testing/selftests/kvm/lib/x86_64/svm.c | 1 -
tools/testing/selftests/kvm/lib/x86_64/vmx.c | 1 -
.../selftests/kvm/x86_64/sev_migrate_tests.c | 1 -
14 files changed, 91 insertions(+), 114 deletions(-)
delete mode 100644 tools/testing/selftests/kvm/lib/kvm_util_internal.h

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index e8dff9bdab89..d2550c6e82c1 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -9,9 +9,13 @@

#include "test_util.h"

-#include "asm/kvm.h"
+#include <linux/compiler.h>
+#include "linux/hashtable.h"
#include "linux/list.h"
-#include "linux/kvm.h"
+#include <linux/kernel.h>
+#include <linux/kvm.h>
+#include "linux/rbtree.h"
+
#include <sys/ioctl.h>

#include "sparsebit.h"
@@ -21,15 +25,94 @@

#define NSEC_PER_SEC 1000000000L

-/*
- * Callers of kvm_util only have an incomplete/opaque description of the
- * structure kvm_util is using to maintain the state of a VM.
- */
-struct kvm_vm;
-
typedef uint64_t vm_paddr_t; /* Virtual Machine (Guest) physical address */
typedef uint64_t vm_vaddr_t; /* Virtual Machine (Guest) virtual address */

+struct userspace_mem_region {
+ struct kvm_userspace_memory_region region;
+ struct sparsebit *unused_phy_pages;
+ int fd;
+ off_t offset;
+ void *host_mem;
+ void *host_alias;
+ void *mmap_start;
+ void *mmap_alias;
+ size_t mmap_size;
+ struct rb_node gpa_node;
+ struct rb_node hva_node;
+ struct hlist_node slot_node;
+};
+
+struct vcpu {
+ struct list_head list;
+ uint32_t id;
+ int fd;
+ struct kvm_run *state;
+ struct kvm_dirty_gfn *dirty_gfns;
+ uint32_t fetch_index;
+ uint32_t dirty_gfns_count;
+};
+
+struct userspace_mem_regions {
+ struct rb_root gpa_tree;
+ struct rb_root hva_tree;
+ DECLARE_HASHTABLE(slot_hash, 9);
+};
+
+struct kvm_vm {
+ int mode;
+ unsigned long type;
+ int kvm_fd;
+ int fd;
+ unsigned int pgtable_levels;
+ unsigned int page_size;
+ unsigned int page_shift;
+ unsigned int pa_bits;
+ unsigned int va_bits;
+ uint64_t max_gfn;
+ struct list_head vcpus;
+ struct userspace_mem_regions regions;
+ struct sparsebit *vpages_valid;
+ struct sparsebit *vpages_mapped;
+ bool has_irqchip;
+ bool pgd_created;
+ vm_paddr_t pgd;
+ vm_vaddr_t gdt;
+ vm_vaddr_t tss;
+ vm_vaddr_t idt;
+ vm_vaddr_t handlers;
+ uint32_t dirty_ring_size;
+};
+
+
+#define kvm_for_each_vcpu(vm, i, vcpu) \
+ for ((i) = 0; (i) <= (vm)->last_vcpu_id; (i)++) \
+ if (!((vcpu) = vm->vcpus[i])) \
+ continue; \
+ else
+
+struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);
+
+/*
+ * Virtual Translation Tables Dump
+ *
+ * Input Args:
+ * stream - Output FILE stream
+ * vm - Virtual Machine
+ * indent - Left margin indent amount
+ *
+ * Output Args: None
+ *
+ * Return: None
+ *
+ * Dumps to the FILE stream given by @stream, the contents of all the
+ * virtual translation tables for the VM given by @vm.
+ */
+void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
+
+struct userspace_mem_region *
+memslot2region(struct kvm_vm *vm, uint32_t memslot);
+
/* Minimum allocated guest virtual and physical addresses */
#define KVM_UTIL_MIN_VADDR 0x2000
#define KVM_GUEST_PAGE_TABLE_MIN_PADDR 0x180000
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 06c3dafc82c4..6fa52e141e1b 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -10,7 +10,6 @@

#include "guest_modes.h"
#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"

#define DEFAULT_ARM64_GUEST_STACK_VADDR_MIN 0xac0000
diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
index e0b0164e9af8..e14663ab2056 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
@@ -5,7 +5,6 @@
* Copyright (C) 2018, Red Hat, Inc.
*/
#include "kvm_util.h"
-#include "../kvm_util_internal.h"

static vm_vaddr_t *ucall_exit_mmio_addr;

diff --git a/tools/testing/selftests/kvm/lib/aarch64/vgic.c b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
index b3a0fca0d780..a169e662d6ae 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/vgic.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
@@ -9,7 +9,6 @@
#include <asm/kvm.h>

#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "vgic.h"
#include "gic.h"
#include "gic_v3.h"
diff --git a/tools/testing/selftests/kvm/lib/elf.c b/tools/testing/selftests/kvm/lib/elf.c
index 13e8e3dcf984..9f54c098d9d0 100644
--- a/tools/testing/selftests/kvm/lib/elf.c
+++ b/tools/testing/selftests/kvm/lib/elf.c
@@ -11,7 +11,6 @@
#include <linux/elf.h>

#include "kvm_util.h"
-#include "kvm_util_internal.h"

static void elfhdr_get(const char *filename, Elf64_Ehdr *hdrp)
{
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index 76f8b924fb31..c6fee457735b 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -8,7 +8,6 @@
#define _GNU_SOURCE /* for program_invocation_name */
#include "test_util.h"
#include "kvm_util.h"
-#include "kvm_util_internal.h"
#include "processor.h"

#include <assert.h>
diff --git a/tools/testing/selftests/kvm/lib/kvm_util_internal.h b/tools/testing/selftests/kvm/lib/kvm_util_internal.h
deleted file mode 100644
index 544b90df2f80..000000000000
--- a/tools/testing/selftests/kvm/lib/kvm_util_internal.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * tools/testing/selftests/kvm/lib/kvm_util_internal.h
- *
- * Copyright (C) 2018, Google LLC.
- */
-
-#ifndef SELFTEST_KVM_UTIL_INTERNAL_H
-#define SELFTEST_KVM_UTIL_INTERNAL_H
-
-#include "linux/hashtable.h"
-#include "linux/rbtree.h"
-
-#include "sparsebit.h"
-
-struct userspace_mem_region {
- struct kvm_userspace_memory_region region;
- struct sparsebit *unused_phy_pages;
- int fd;
- off_t offset;
- void *host_mem;
- void *host_alias;
- void *mmap_start;
- void *mmap_alias;
- size_t mmap_size;
- struct rb_node gpa_node;
- struct rb_node hva_node;
- struct hlist_node slot_node;
-};
-
-struct vcpu {
- struct list_head list;
- uint32_t id;
- int fd;
- struct kvm_run *state;
- struct kvm_dirty_gfn *dirty_gfns;
- uint32_t fetch_index;
- uint32_t dirty_gfns_count;
-};
-
-struct userspace_mem_regions {
- struct rb_root gpa_tree;
- struct rb_root hva_tree;
- DECLARE_HASHTABLE(slot_hash, 9);
-};
-
-struct kvm_vm {
- int mode;
- unsigned long type;
- int kvm_fd;
- int fd;
- unsigned int pgtable_levels;
- unsigned int page_size;
- unsigned int page_shift;
- unsigned int pa_bits;
- unsigned int va_bits;
- uint64_t max_gfn;
- struct list_head vcpus;
- struct userspace_mem_regions regions;
- struct sparsebit *vpages_valid;
- struct sparsebit *vpages_mapped;
- bool has_irqchip;
- bool pgd_created;
- vm_paddr_t pgd;
- vm_vaddr_t gdt;
- vm_vaddr_t tss;
- vm_vaddr_t idt;
- vm_vaddr_t handlers;
- uint32_t dirty_ring_size;
-};
-
-struct vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);
-
-/*
- * Virtual Translation Tables Dump
- *
- * Input Args:
- * stream - Output FILE stream
- * vm - Virtual Machine
- * indent - Left margin indent amount
- *
- * Output Args: None
- *
- * Return: None
- *
- * Dumps to the FILE stream given by @stream, the contents of all the
- * virtual translation tables for the VM given by @vm.
- */
-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
-
-struct userspace_mem_region *
-memslot2region(struct kvm_vm *vm, uint32_t memslot);
-
-#endif /* SELFTEST_KVM_UTIL_INTERNAL_H */
diff --git a/tools/testing/selftests/kvm/lib/riscv/processor.c b/tools/testing/selftests/kvm/lib/riscv/processor.c
index 1a404749094a..f17c7542cc53 100644
--- a/tools/testing/selftests/kvm/lib/riscv/processor.c
+++ b/tools/testing/selftests/kvm/lib/riscv/processor.c
@@ -9,7 +9,6 @@
#include <assert.h>

#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"

#define DEFAULT_RISCV_GUEST_STACK_VADDR_MIN 0xac0000
diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c
index 9e42d8248fa6..c554ed173b38 100644
--- a/tools/testing/selftests/kvm/lib/riscv/ucall.c
+++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c
@@ -8,7 +8,6 @@
#include <linux/kvm.h>

#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"

void ucall_init(struct kvm_vm *vm, void *arg)
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index 7cc1051c4b71..53c413932f64 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -7,7 +7,6 @@

#include "processor.h"
#include "kvm_util.h"
-#include "../kvm_util_internal.h"

#define PAGES_PER_REGION 4

diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index c47b84449a8a..e9b3f254e8f9 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -7,7 +7,6 @@

#include "test_util.h"
#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"

#ifndef NUM_INTERRUPTS
diff --git a/tools/testing/selftests/kvm/lib/x86_64/svm.c b/tools/testing/selftests/kvm/lib/x86_64/svm.c
index 736ee4a23df6..01a9d831da13 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/svm.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/svm.c
@@ -9,7 +9,6 @@

#include "test_util.h"
#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"
#include "svm_util.h"

diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
index d089d8b850b5..0d42aa821833 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/vmx.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
@@ -7,7 +7,6 @@

#include "test_util.h"
#include "kvm_util.h"
-#include "../kvm_util_internal.h"
#include "processor.h"
#include "vmx.h"

diff --git a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
index d29cf773d7bf..fb26d0d85fcb 100644
--- a/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
+++ b/tools/testing/selftests/kvm/x86_64/sev_migrate_tests.c
@@ -12,7 +12,6 @@
#include "processor.h"
#include "svm_util.h"
#include "kselftest.h"
-#include "../lib/kvm_util_internal.h"

#define SEV_POLICY_ES 0b100

--
2.35.1.723.g4982287a31-goog

2022-03-11 22:59:54

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 088/105] KVM: selftests: Convert vgic_init away from vm_create_default_with_vcpus()

Signed-off-by: Sean Christopherson <[email protected]>
---
.../testing/selftests/kvm/aarch64/vgic_init.c | 79 ++++++++++++-------
1 file changed, 49 insertions(+), 30 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index f8d41f12bdca..435c4b762335 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -49,19 +49,21 @@ static void guest_code(void)
}

/* we don't want to assert on run execution, hence that helper */
-static int run_vcpu(struct kvm_vm *vm, uint32_t vcpuid)
+static int run_vcpu(struct kvm_vcpu *vcpu)
{
- ucall_init(vm, NULL);
+ ucall_init(vcpu->vm, NULL);

- return __vcpu_run(vm, vcpuid) ? -errno : 0;
+ return __vcpu_run(vcpu->vm, vcpu->id) ? -errno : 0;
}

-static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type, uint32_t nr_vcpus)
+static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type,
+ uint32_t nr_vcpus,
+ struct kvm_vcpu *vcpus[])
{
struct vm_gic v;

v.gic_dev_type = gic_dev_type;
- v.vm = vm_create_default_with_vcpus(nr_vcpus, 0, 0, guest_code, NULL);
+ v.vm = vm_create_with_vcpus(nr_vcpus, guest_code, vcpus);
v.gic_fd = kvm_create_device(v.vm, gic_dev_type);

return v;
@@ -305,10 +307,11 @@ static void subtest_v3_redist_regions(struct vm_gic *v)
*/
static void test_vgic_then_vcpus(uint32_t gic_dev_type)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
struct vm_gic v;
int ret, i;

- v = vm_gic_create_with_vcpus(gic_dev_type, 1);
+ v = vm_gic_create_with_vcpus(gic_dev_type, 1, vcpus);

subtest_dist_rdist(&v);

@@ -316,7 +319,7 @@ static void test_vgic_then_vcpus(uint32_t gic_dev_type)
for (i = 1; i < NR_VCPUS; ++i)
vm_vcpu_add(v.vm, i, guest_code);

- ret = run_vcpu(v.vm, 3);
+ ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run");

vm_gic_destroy(&v);
@@ -325,14 +328,15 @@ static void test_vgic_then_vcpus(uint32_t gic_dev_type)
/* All the VCPUs are created before the VGIC KVM device gets initialized */
static void test_vcpus_then_vgic(uint32_t gic_dev_type)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
struct vm_gic v;
int ret;

- v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS);
+ v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS, vcpus);

subtest_dist_rdist(&v);

- ret = run_vcpu(v.vm, 3);
+ ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run");

vm_gic_destroy(&v);
@@ -340,37 +344,38 @@ static void test_vcpus_then_vgic(uint32_t gic_dev_type)

static void test_v3_new_redist_regions(void)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
void *dummy = NULL;
struct vm_gic v;
uint64_t addr;
int ret;

- v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
subtest_v3_redist_regions(&v);
kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

- ret = run_vcpu(v.vm, 3);
+ ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -ENXIO, "running without sufficient number of rdists");
vm_gic_destroy(&v);

/* step2 */

- v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
subtest_v3_redist_regions(&v);

addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2);
kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

- ret = run_vcpu(v.vm, 3);
+ ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EBUSY, "running without vgic explicit init");

vm_gic_destroy(&v);

/* step 3 */

- v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
subtest_v3_redist_regions(&v);

ret = __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
@@ -385,7 +390,7 @@ static void test_v3_new_redist_regions(void)
kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

- ret = run_vcpu(v.vm, 3);
+ ret = run_vcpu(vcpus[3]);
TEST_ASSERT(!ret, "vcpu run");

vm_gic_destroy(&v);
@@ -393,26 +398,27 @@ static void test_v3_new_redist_regions(void)

static void test_v3_typer_accesses(void)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
struct vm_gic v;
uint64_t addr;
uint32_t val;
int ret, i;

- v.vm = vm_create_default(0, 0, guest_code);
+ v.vm = vm_create_with_one_vcpu(&vcpus[0], guest_code);

v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

- vm_vcpu_add(v.vm, 3, guest_code);
+ vcpus[3] = vm_vcpu_add(v.vm, 3, guest_code);

ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EINVAL, "attempting to read GICR_TYPER of non created vcpu");

- vm_vcpu_add(v.vm, 1, guest_code);
+ vcpus[1] = vm_vcpu_add(v.vm, 1, guest_code);

ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EBUSY, "read GICR_TYPER before GIC initialized");

- vm_vcpu_add(v.vm, 2, guest_code);
+ vcpus[2] = vm_vcpu_add(v.vm, 2, guest_code);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
@@ -460,6 +466,21 @@ static void test_v3_typer_accesses(void)
vm_gic_destroy(&v);
}

+static struct vm_gic vm_gic_v3_create_with_vcpuids(int nr_vcpus,
+ uint32_t vcpuids[])
+{
+ struct vm_gic v;
+ int i;
+
+ v.vm = vm_create_with_vcpus(0, NULL, NULL);
+ for (i = 0; i < nr_vcpus; i++)
+ vm_vcpu_add(v.vm, vcpuids[i], guest_code);
+
+ v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);
+
+ return v;
+}
+
/**
* Test GICR_TYPER last bit with new redist regions
* rdist regions #1 and #2 are contiguous
@@ -478,9 +499,7 @@ static void test_v3_last_bit_redist_regions(void)
uint32_t val;
int ret;

- v.vm = vm_create_default_with_vcpus(6, 0, 0, guest_code, vcpuids);
-
- v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);
+ v = vm_gic_v3_create_with_vcpuids(ARRAY_SIZE(vcpuids), vcpuids);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
@@ -527,9 +546,7 @@ static void test_v3_last_bit_single_rdist(void)
uint32_t val;
int ret;

- v.vm = vm_create_default_with_vcpus(6, 0, 0, guest_code, vcpuids);
-
- v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);
+ v = vm_gic_v3_create_with_vcpuids(ARRAY_SIZE(vcpuids), vcpuids);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
@@ -559,11 +576,12 @@ static void test_v3_last_bit_single_rdist(void)
/* Uses the legacy REDIST region API. */
static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
struct vm_gic v;
int ret, i;
uint64_t addr;

- v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1);
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1, vcpus);

/* Set space for 3 redists, we have 1 vcpu, so this succeeds. */
addr = max_phys_size - (3 * 2 * 0x10000);
@@ -576,13 +594,13 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)

/* Add the rest of the VCPUs */
for (i = 1; i < NR_VCPUS; ++i)
- vm_vcpu_add(v.vm, i, guest_code);
+ vcpus[i] = vm_vcpu_add(v.vm, i, guest_code);

kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

/* Attempt to run a vcpu without enough redist space. */
- ret = run_vcpu(v.vm, 2);
+ ret = run_vcpu(vcpus[2]);
TEST_ASSERT(ret && errno == EINVAL,
"redist base+size above PA range detected on 1st vcpu run");

@@ -591,11 +609,12 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)

static void test_v3_its_region(void)
{
+ struct kvm_vcpu *vcpus[NR_VCPUS];
struct vm_gic v;
uint64_t addr;
int its_fd, ret;

- v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS);

addr = 0x401000;
@@ -639,7 +658,7 @@ int test_kvm_device(uint32_t gic_dev_type)
uint32_t other;
int ret;

- v.vm = vm_create_default_with_vcpus(NR_VCPUS, 0, 0, guest_code, NULL);
+ v.vm = vm_create_with_vcpus(NR_VCPUS, guest_code, NULL);

/* try to create a non existing KVM device */
ret = __kvm_test_create_device(v.vm, 0);
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:03:30

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 025/105] KVM: selftests: Split get/set device_attr helpers

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/aarch64/arch_timer.c | 8 +-
.../testing/selftests/kvm/aarch64/vgic_init.c | 246 +++++++++---------
.../selftests/kvm/include/kvm_util_base.h | 105 +++++---
.../testing/selftests/kvm/lib/aarch64/vgic.c | 31 ++-
tools/testing/selftests/kvm/lib/guest_modes.c | 4 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 59 ++---
.../kvm/system_counter_offset_test.c | 4 +-
7 files changed, 240 insertions(+), 217 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/arch_timer.c b/tools/testing/selftests/kvm/aarch64/arch_timer.c
index 92b2a6611e89..127fb4f0c335 100644
--- a/tools/testing/selftests/kvm/aarch64/arch_timer.c
+++ b/tools/testing/selftests/kvm/aarch64/arch_timer.c
@@ -349,10 +349,10 @@ static void test_run(struct kvm_vm *vm)
static void test_init_timer_irq(struct kvm_vm *vm)
{
/* Timer initid should be same for all the vCPUs, so query only vCPU-0 */
- vcpu_access_device_attr(vm, 0, KVM_ARM_VCPU_TIMER_CTRL,
- KVM_ARM_VCPU_TIMER_IRQ_PTIMER, &ptimer_irq, false);
- vcpu_access_device_attr(vm, 0, KVM_ARM_VCPU_TIMER_CTRL,
- KVM_ARM_VCPU_TIMER_IRQ_VTIMER, &vtimer_irq, false);
+ vcpu_device_attr_get(vm, 0, KVM_ARM_VCPU_TIMER_CTRL,
+ KVM_ARM_VCPU_TIMER_IRQ_PTIMER, &ptimer_irq);
+ vcpu_device_attr_get(vm, 0, KVM_ARM_VCPU_TIMER_CTRL,
+ KVM_ARM_VCPU_TIMER_IRQ_VTIMER, &vtimer_irq);

sync_global_to_guest(vm, ptimer_irq);
sync_global_to_guest(vm, vtimer_irq);
diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 2425894b3775..0329aa04da31 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -33,13 +33,10 @@ struct vm_gic {
static uint64_t max_phys_size;

/* helper to access a redistributor register */
-static int access_v3_redist_reg(int gicv3_fd, int vcpu, int offset,
- uint32_t *val, bool write)
+static int v3_redist_reg_get(int gicv3_fd, int vcpu, int offset, uint32_t *val)
{
- uint64_t attr = REG_OFFSET(vcpu, offset);
-
- return _kvm_device_access(gicv3_fd, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS,
- attr, val, write);
+ return __kvm_device_attr_get(gicv3_fd, KVM_DEV_ARM_VGIC_GRP_REDIST_REGS,
+ REG_OFFSET(vcpu, offset), val);
}

/* dummy guest code */
@@ -137,41 +134,41 @@ static void subtest_dist_rdist(struct vm_gic *v)

/* misaligned DIST and REDIST address settings */
addr = dist.alignment / 0x10;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- dist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ dist.attr, &addr);
TEST_ASSERT(ret && errno == EINVAL, "GIC dist base not aligned");

addr = rdist.alignment / 0x10;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ rdist.attr, &addr);
TEST_ASSERT(ret && errno == EINVAL, "GIC redist/cpu base not aligned");

/* out of range address */
addr = max_phys_size;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- dist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ dist.attr, &addr);
TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit");

- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ rdist.attr, &addr);
TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit");

/* Space for half a rdist (a rdist is: 2 * rdist.alignment). */
addr = max_phys_size - dist.alignment;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ rdist.attr, &addr);
TEST_ASSERT(ret && errno == E2BIG,
"half of the redist is beyond IPA limit");

/* set REDIST base address @0x0*/
addr = 0x00000;
- kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr, &addr, true);
+ kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ rdist.attr, &addr);

/* Attempt to create a second legacy redistributor region */
addr = 0xE0000;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- rdist.attr, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ rdist.attr, &addr);
TEST_ASSERT(ret && errno == EEXIST, "GIC redist base set again");

ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
@@ -179,9 +176,8 @@ static void subtest_dist_rdist(struct vm_gic *v)
if (!ret) {
/* Attempt to mix legacy and new redistributor regions */
addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 0, 0);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION,
- &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL,
"attempt to mix GICv3 REDIST and REDIST_REGION");
}
@@ -191,8 +187,8 @@ static void subtest_dist_rdist(struct vm_gic *v)
* on first vcpu run instead.
*/
addr = rdist.size - rdist.alignment;
- kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- dist.attr, &addr, true);
+ kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ dist.attr, &addr);
}

/* Test the new REDIST region API */
@@ -206,66 +202,66 @@ static void subtest_v3_redist_regions(struct vm_gic *v)
TEST_ASSERT(!ret, "Multiple redist regions advertised");

addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 2, 0);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "redist region attr value with flags != 0");

addr = REDIST_REGION_ATTR_ADDR(0, 0x100000, 0, 0);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "redist region attr value with count== 0");

addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 1);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL,
"attempt to register the first rdist region with index != 0");

addr = REDIST_REGION_ATTR_ADDR(2, 0x201000, 0, 1);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "rdist region with misaligned address");

addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 0);
- kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 1);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register an rdist region with already used index");

addr = REDIST_REGION_ATTR_ADDR(1, 0x210000, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL,
"register an rdist region overlapping with another one");

addr = REDIST_REGION_ATTR_ADDR(1, 0x240000, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register redist region with index not +1");

addr = REDIST_REGION_ATTR_ADDR(1, 0x240000, 0, 1);
- kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == E2BIG,
"register redist region with base address beyond IPA range");

/* The last redist is above the pa range. */
addr = REDIST_REGION_ATTR_ADDR(2, max_phys_size - 0x30000, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == E2BIG,
"register redist region with top address beyond IPA range");

addr = 0x260000;
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr);
TEST_ASSERT(ret && errno == EINVAL,
"Mix KVM_VGIC_V3_ADDR_TYPE_REDIST and REDIST_REGION");

@@ -278,28 +274,28 @@ static void subtest_v3_redist_regions(struct vm_gic *v)

addr = REDIST_REGION_ATTR_ADDR(0, 0, 0, 0);
expected_addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 0);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, false);
+ ret = __kvm_device_attr_get(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(!ret && addr == expected_addr, "read characteristics of region #0");

addr = REDIST_REGION_ATTR_ADDR(0, 0, 0, 1);
expected_addr = REDIST_REGION_ATTR_ADDR(1, 0x240000, 0, 1);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, false);
+ ret = __kvm_device_attr_get(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(!ret && addr == expected_addr, "read characteristics of region #1");

addr = REDIST_REGION_ATTR_ADDR(0, 0, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, false);
+ ret = __kvm_device_attr_get(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == ENOENT, "read characteristics of non existing region");

addr = 0x260000;
- kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_DIST, &addr, true);
+ kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_DIST, &addr);

addr = REDIST_REGION_ATTR_ADDR(1, 0x260000, 0, 2);
- ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register redist region colliding with dist");
}

@@ -351,8 +347,8 @@ static void test_v3_new_redist_regions(void)

v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
subtest_v3_redist_regions(&v);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

ret = run_vcpu(v.vm, 3);
TEST_ASSERT(ret == -ENXIO, "running without sufficient number of rdists");
@@ -364,8 +360,8 @@ static void test_v3_new_redist_regions(void)
subtest_v3_redist_regions(&v);

addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

ret = run_vcpu(v.vm, 3);
TEST_ASSERT(ret == -EBUSY, "running without vgic explicit init");
@@ -377,17 +373,17 @@ static void test_v3_new_redist_regions(void)
v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
subtest_v3_redist_regions(&v);

- ret = _kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, dummy, true);
+ ret = __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, dummy);
TEST_ASSERT(ret && errno == EFAULT,
"register a third region allowing to cover the 4 vcpus");

addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

ret = run_vcpu(v.vm, 3);
TEST_ASSERT(!ret, "vcpu run");
@@ -408,56 +404,56 @@ static void test_v3_typer_accesses(void)

vm_vcpu_add_default(v.vm, 3, guest_code);

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EINVAL, "attempting to read GICR_TYPER of non created vcpu");

vm_vcpu_add_default(v.vm, 1, guest_code);

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(ret && errno == EBUSY, "read GICR_TYPER before GIC initialized");

vm_vcpu_add_default(v.vm, 2, guest_code);

- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

for (i = 0; i < NR_VCPUS ; i++) {
- ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, &val);
TEST_ASSERT(!ret && !val, "read GICR_TYPER before rdist region setting");
}

addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 0);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

/* The 2 first rdists should be put there (vcpu 0 and 3) */
- ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, &val);
TEST_ASSERT(!ret && !val, "read typer of rdist #0");

- ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x310, "read typer of rdist #1");

addr = REDIST_REGION_ATTR_ADDR(10, 0x100000, 0, 1);
- ret = _kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ ret = __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "collision with previous rdist region");

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x100,
"no redist region attached to vcpu #1 yet, last cannot be returned");

- ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x200,
"no redist region attached to vcpu #2, last cannot be returned");

addr = REDIST_REGION_ATTR_ADDR(10, 0x20000, 0, 1);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #1");

- ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x210,
"read typer of rdist #1, last properly returned");

@@ -486,37 +482,37 @@ static void test_v3_last_bit_redist_regions(void)

v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

addr = REDIST_REGION_ATTR_ADDR(2, 0x100000, 0, 0);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

addr = REDIST_REGION_ATTR_ADDR(2, 0x240000, 0, 1);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 2);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);

- ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x000, "read typer of rdist #0");

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #1");

- ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x200, "read typer of rdist #2");

- ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x310, "read typer of rdist #3");

- ret = access_v3_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 5, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x500, "read typer of rdist #5");

- ret = access_v3_redist_reg(v.gic_fd, 4, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 4, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x410, "read typer of rdist #4");

vm_gic_destroy(&v);
@@ -535,26 +531,26 @@ static void test_v3_last_bit_single_rdist(void)

v.gic_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_V3);

- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

addr = 0x10000;
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr);

- ret = access_v3_redist_reg(v.gic_fd, 0, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x000, "read typer of rdist #0");

- ret = access_v3_redist_reg(v.gic_fd, 3, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x300, "read typer of rdist #1");

- ret = access_v3_redist_reg(v.gic_fd, 5, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 5, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x500, "read typer of rdist #2");

- ret = access_v3_redist_reg(v.gic_fd, 1, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x100, "read typer of rdist #3");

- ret = access_v3_redist_reg(v.gic_fd, 2, GICR_TYPER, &val, false);
+ ret = v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, &val);
TEST_ASSERT(!ret && val == 0x210, "read typer of rdist #3");

vm_gic_destroy(&v);
@@ -571,19 +567,19 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)

/* Set space for 3 redists, we have 1 vcpu, so this succeeds. */
addr = max_phys_size - (3 * 2 * 0x10000);
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr);

addr = 0x00000;
- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_DIST, &addr, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_DIST, &addr);

/* Add the rest of the VCPUs */
for (i = 1; i < NR_VCPUS; ++i)
vm_vcpu_add_default(v.vm, i, guest_code);

- kvm_device_access(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

/* Attempt to run a vcpu without enough redist space. */
ret = run_vcpu(v.vm, 2);
@@ -603,31 +599,31 @@ static void test_v3_its_region(void)
its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS);

addr = 0x401000;
- ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == EINVAL,
"ITS region with misaligned address");

addr = max_phys_size;
- ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == E2BIG,
"register ITS region with base address beyond IPA range");

addr = max_phys_size - 0x10000;
- ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == E2BIG,
"Half of ITS region is beyond IPA range");

/* This one succeeds setting the ITS base */
addr = 0x400000;
- kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr);

addr = 0x300000;
- ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");

close(its_fd);
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 4cc2553887f7..f81443666f8c 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -455,6 +455,79 @@ static inline int vcpu_get_stats_fd(struct kvm_vm *vm, uint32_t vcpuid)
return fd;
}

+int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
+
+static inline void kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
+{
+ int ret = __kvm_has_device_attr(dev_fd, group, attr);
+
+ TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR failed, rc: %i errno: %i", ret, errno);
+}
+
+
+int __kvm_device_attr_access(int dev_fd, uint32_t group, uint64_t attr,
+ void *val, unsigned long cmd);
+
+static inline int __kvm_device_attr_get(int dev_fd, uint32_t group,
+ uint64_t attr, void *val)
+{
+ return __kvm_device_attr_access(dev_fd, group, attr, val,
+ KVM_GET_DEVICE_ATTR);
+}
+
+static inline void kvm_device_attr_get(int dev_fd, uint32_t group,
+ uint64_t attr, void *val)
+{
+ int ret = __kvm_device_attr_get(dev_fd, group, attr, val);
+
+ TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_GET_DEVICE_ATTR, ret));
+}
+
+static inline int __kvm_device_attr_set(int dev_fd, uint32_t group,
+ uint64_t attr, void *val)
+{
+ return __kvm_device_attr_access(dev_fd, group, attr, val,
+ KVM_SET_DEVICE_ATTR);
+}
+
+static inline void kvm_device_attr_set(int dev_fd, uint32_t group,
+ uint64_t attr, void *val)
+{
+ int ret = __kvm_device_attr_set(dev_fd, group, attr, val);
+
+ TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_SET_DEVICE_ATTR, ret));
+}
+
+int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr);
+
+static inline void vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid,
+ uint32_t group, uint64_t attr)
+{
+ int ret = __vcpu_has_device_attr(vm, vcpuid, group, attr);
+
+ TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_HAS_DEVICE_ATTR, ret));
+}
+
+int __vcpu_device_attr_get(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val);
+void vcpu_device_attr_get(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val);
+int __vcpu_device_attr_set(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val);
+void vcpu_device_attr_set(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val);
+int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
+int __kvm_create_device(struct kvm_vm *vm, uint64_t type);
+
+static inline int kvm_create_device(struct kvm_vm *vm, uint64_t type)
+{
+ int fd = __kvm_create_device(vm, type);
+
+ TEST_ASSERT(fd >= 0, KVM_IOCTL_ERROR(KVM_CREATE_DEVICE, fd));
+ return fd;
+}
+
void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid);

/*
@@ -477,41 +550,9 @@ void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid);
*/
void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...);

-int __kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr);
-
-static inline void kvm_has_device_attr(int dev_fd, uint32_t group, uint64_t attr)
-{
- int ret = __kvm_has_device_attr(dev_fd, group, attr);
-
- TEST_ASSERT(!ret, "KVM_HAS_DEVICE_ATTR failed, rc: %i errno: %i", ret, errno);
-}
-
-int __kvm_test_create_device(struct kvm_vm *vm, uint64_t type);
-int __kvm_create_device(struct kvm_vm *vm, uint64_t type);
-int kvm_create_device(struct kvm_vm *vm, uint64_t type);
-int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
- void *val, bool write);
-int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
- void *val, bool write);
void kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level);
int _kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level);

-int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr);
-
-static inline void vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid,
- uint32_t group, uint64_t attr)
-{
- int ret = __vcpu_has_device_attr(vm, vcpuid, group, attr);
-
- TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_HAS_DEVICE_ATTR, ret));
-}
-
-int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr, void *val, bool write);
-int vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr, void *val, bool write);
-
#define KVM_MAX_IRQ_ROUTES 4096

struct kvm_irq_routing *kvm_gsi_routing_create(void);
diff --git a/tools/testing/selftests/kvm/lib/aarch64/vgic.c b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
index f0ef9530fefe..25e765973f74 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/vgic.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/vgic.c
@@ -53,27 +53,26 @@ int vgic_v3_setup(struct kvm_vm *vm, unsigned int nr_vcpus, uint32_t nr_irqs,
/* Distributor setup */
gic_fd = kvm_create_device(vm, KVM_DEV_TYPE_ARM_VGIC_V3);

- kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_NR_IRQS,
- 0, &nr_irqs, true);
+ kvm_device_attr_get(gic_fd, KVM_DEV_ARM_VGIC_GRP_NR_IRQS, 0, &nr_irqs);

- kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

- kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_DIST, &gicd_base_gpa, true);
+ kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_DIST, &gicd_base_gpa);
nr_gic_pages = vm_calc_num_guest_pages(vm->mode, KVM_VGIC_V3_DIST_SIZE);
virt_map(vm, gicd_base_gpa, gicd_base_gpa, nr_gic_pages);

/* Redistributor setup */
redist_attr = REDIST_REGION_ATTR_ADDR(nr_vcpus, gicr_base_gpa, 0, 0);
- kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
- KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &redist_attr, true);
+ kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &redist_attr);
nr_gic_pages = vm_calc_num_guest_pages(vm->mode,
KVM_VGIC_V3_REDIST_SIZE * nr_vcpus);
virt_map(vm, gicr_base_gpa, gicr_base_gpa, nr_gic_pages);

- kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
- KVM_DEV_ARM_VGIC_CTRL_INIT, NULL, true);
+ kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL,
+ KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);

return gic_fd;
}
@@ -86,14 +85,14 @@ int _kvm_irq_set_level_info(int gic_fd, uint32_t intid, int level)
uint64_t val;
int ret;

- ret = _kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO,
- attr, &val, false);
+ ret = __kvm_device_attr_get(gic_fd, KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO,
+ attr, &val);
if (ret != 0)
return ret;

val |= 1U << index;
- ret = _kvm_device_access(gic_fd, KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO,
- attr, &val, true);
+ ret = __kvm_device_attr_set(gic_fd, KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO,
+ attr, &val);
return ret;
}

@@ -154,9 +153,9 @@ static void vgic_poke_irq(int gic_fd, uint32_t intid,
* intid will just make the read/writes point to above the intended
* register space (i.e., ICPENDR after ISPENDR).
*/
- kvm_device_access(gic_fd, group, attr, &val, false);
+ kvm_device_attr_get(gic_fd, group, attr, &val);
val |= 1ULL << index;
- kvm_device_access(gic_fd, group, attr, &val, true);
+ kvm_device_attr_set(gic_fd, group, attr, &val);
}

void kvm_irq_write_ispendr(int gic_fd, uint32_t intid, uint32_t vcpu)
diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
index 9ab27b4169bf..0be56c63aed6 100644
--- a/tools/testing/selftests/kvm/lib/guest_modes.c
+++ b/tools/testing/selftests/kvm/lib/guest_modes.c
@@ -66,8 +66,8 @@ void guest_modes_append_default(void)

kvm_fd = open_kvm_dev_path_or_exit();
vm_fd = __kvm_ioctl(kvm_fd, KVM_CREATE_VM, 0);
- kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
- KVM_S390_VM_CPU_PROCESSOR, &info, false);
+ kvm_device_attr_get(vm_fd, KVM_S390_VM_CPU_MODEL,
+ KVM_S390_VM_CPU_PROCESSOR, &info);
close(vm_fd);
close(kvm_fd);
/* Starting with z13 we have 47bits of physical address */
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e635241e3ee5..e2427b51375d 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1616,16 +1616,8 @@ int __kvm_create_device(struct kvm_vm *vm, uint64_t type)
return err ? : create_dev.fd;
}

-int kvm_create_device(struct kvm_vm *vm, uint64_t type)
-{
- int fd = __kvm_create_device(vm, type);
-
- TEST_ASSERT(fd >= 0, "KVM_CREATE_DEVICE IOCTL failed, rc: %i errno: %i", fd, errno);
- return fd;
-}
-
-int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
- void *val, bool write)
+int __kvm_device_attr_access(int dev_fd, uint32_t group, uint64_t attr,
+ void *val, unsigned long cmd)
{
struct kvm_device_attr kvmattr = {
.group = group,
@@ -1633,20 +1625,32 @@ int _kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
.flags = 0,
.addr = (uintptr_t)val,
};
- int ret;

- ret = ioctl(dev_fd, write ? KVM_SET_DEVICE_ATTR : KVM_GET_DEVICE_ATTR,
- &kvmattr);
- return ret;
+ return __kvm_ioctl(dev_fd, cmd, &kvmattr);
}

-int kvm_device_access(int dev_fd, uint32_t group, uint64_t attr,
- void *val, bool write)
+int __vcpu_device_attr_get(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val)
{
- int ret = _kvm_device_access(dev_fd, group, attr, val, write);
+ return __kvm_device_attr_get(vcpu_get(vm, vcpuid)->fd, group, attr, val);
+}
+
+void vcpu_device_attr_get(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val)
+{
+ kvm_device_attr_get(vcpu_get(vm, vcpuid)->fd, group, attr, val);
+}

- TEST_ASSERT(!ret, "KVM_SET|GET_DEVICE_ATTR IOCTL failed, rc: %i errno: %i", ret, errno);
- return ret;
+int __vcpu_device_attr_set(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val)
+{
+ return __kvm_device_attr_set(vcpu_get(vm, vcpuid)->fd, group, attr, val);
+}
+
+void vcpu_device_attr_set(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
+ uint64_t attr, void *val)
+{
+ kvm_device_attr_set(vcpu_get(vm, vcpuid)->fd, group, attr, val);
}

int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
@@ -1657,23 +1661,6 @@ int __vcpu_has_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
return __kvm_has_device_attr(vcpu->fd, group, attr);
}

-int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr, void *val, bool write)
-{
- struct vcpu *vcpu = vcpu_get(vm, vcpuid);
-
- return _kvm_device_access(vcpu->fd, group, attr, val, write);
-}
-
-int vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
- uint64_t attr, void *val, bool write)
-{
- int ret = _vcpu_access_device_attr(vm, vcpuid, group, attr, val, write);
-
- TEST_ASSERT(!ret, "KVM_SET|GET_DEVICE_ATTR IOCTL failed, rc: %i errno: %i", ret, errno);
- return ret;
-}
-
/*
* IRQ related functions.
*/
diff --git a/tools/testing/selftests/kvm/system_counter_offset_test.c b/tools/testing/selftests/kvm/system_counter_offset_test.c
index 2b10c53abf4f..5dd9d28efb97 100644
--- a/tools/testing/selftests/kvm/system_counter_offset_test.c
+++ b/tools/testing/selftests/kvm/system_counter_offset_test.c
@@ -39,8 +39,8 @@ static void check_preconditions(struct kvm_vm *vm)

static void setup_system_counter(struct kvm_vm *vm, struct test_case *test)
{
- vcpu_access_device_attr(vm, VCPU_ID, KVM_VCPU_TSC_CTRL,
- KVM_VCPU_TSC_OFFSET, &test->tsc_offset, true);
+ vcpu_device_attr_set(vm, VCPU_ID, KVM_VCPU_TSC_CTRL,
+ KVM_VCPU_TSC_OFFSET, &test->tsc_offset);
}

static uint64_t guest_read_system_counter(struct test_case *test)
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:08:35

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 045/105] KVM: selftests: Convert hyperv_cpuid away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/hyperv_cpuid.c | 23 +++++++++----------
1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c b/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
index 896e1e7c1df7..d1a22ee98cf3 100644
--- a/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
+++ b/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
@@ -20,8 +20,6 @@
#include "processor.h"
#include "vmx.h"

-#define VCPU_ID 0
-
static void guest_code(void)
{
}
@@ -115,25 +113,26 @@ static void test_hv_cpuid(struct kvm_cpuid2 *hv_cpuid_entries,
}
}

-void test_hv_cpuid_e2big(struct kvm_vm *vm, bool system)
+void test_hv_cpuid_e2big(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
{
static struct kvm_cpuid2 cpuid = {.nent = 0};
int ret;

- if (!system)
- ret = __vcpu_ioctl(vm, VCPU_ID, KVM_GET_SUPPORTED_HV_CPUID, &cpuid);
+ if (vcpu)
+ ret = __vcpu_ioctl(vm, vcpu->id, KVM_GET_SUPPORTED_HV_CPUID, &cpuid);
else
ret = __kvm_ioctl(vm_get_kvm_fd(vm), KVM_GET_SUPPORTED_HV_CPUID, &cpuid);

TEST_ASSERT(ret == -1 && errno == E2BIG,
"%s KVM_GET_SUPPORTED_HV_CPUID didn't fail with -E2BIG when"
- " it should have: %d %d", system ? "KVM" : "vCPU", ret, errno);
+ " it should have: %d %d", !vcpu ? "KVM" : "vCPU", ret, errno);
}

int main(int argc, char *argv[])
{
struct kvm_vm *vm;
struct kvm_cpuid2 *hv_cpuid_entries;
+ struct kvm_vcpu *vcpu;

/* Tell stdout not to buffer its content */
setbuf(stdout, NULL);
@@ -143,12 +142,12 @@ int main(int argc, char *argv[])
exit(KSFT_SKIP);
}

- vm = vm_create_default(VCPU_ID, 0, guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);

/* Test vCPU ioctl version */
- test_hv_cpuid_e2big(vm, false);
+ test_hv_cpuid_e2big(vm, vcpu);

- hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, VCPU_ID);
+ hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, vcpu->id);
test_hv_cpuid(hv_cpuid_entries, false);
free(hv_cpuid_entries);

@@ -157,8 +156,8 @@ int main(int argc, char *argv[])
print_skip("Enlightened VMCS is unsupported");
goto do_sys;
}
- vcpu_enable_evmcs(vm, VCPU_ID);
- hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, VCPU_ID);
+ vcpu_enable_evmcs(vm, vcpu->id);
+ hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, vcpu->id);
test_hv_cpuid(hv_cpuid_entries, true);
free(hv_cpuid_entries);

@@ -169,7 +168,7 @@ int main(int argc, char *argv[])
goto out;
}

- test_hv_cpuid_e2big(vm, true);
+ test_hv_cpuid_e2big(vm, NULL);

hv_cpuid_entries = kvm_get_supported_hv_cpuid();
test_hv_cpuid(hv_cpuid_entries, nested_vmx_supported());
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:14:08

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 009/105] KVM: selftests: Add __vcpu_run() helper

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/aarch64/vgic_init.c | 6 ++----
tools/testing/selftests/kvm/dirty_log_test.c | 6 ++----
tools/testing/selftests/kvm/include/kvm_util_base.h | 6 ++++++
tools/testing/selftests/kvm/lib/kvm_util.c | 6 ++----
4 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 373c8005c2e7..9a153b2ea3de 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -55,10 +55,8 @@ static void guest_code(void)
static int run_vcpu(struct kvm_vm *vm, uint32_t vcpuid)
{
ucall_init(vm, NULL);
- int ret = __vcpu_ioctl(vm, vcpuid, KVM_RUN, NULL);
- if (ret)
- return -errno;
- return 0;
+
+ return __vcpu_run(vm, vcpuid) ? -errno : 0;
}

static struct vm_gic vm_gic_create_with_vcpus(uint32_t gic_dev_type, uint32_t nr_vcpus)
diff --git a/tools/testing/selftests/kvm/dirty_log_test.c b/tools/testing/selftests/kvm/dirty_log_test.c
index 01c01d40201f..5752486764c9 100644
--- a/tools/testing/selftests/kvm/dirty_log_test.c
+++ b/tools/testing/selftests/kvm/dirty_log_test.c
@@ -509,7 +509,7 @@ static void generate_random_array(uint64_t *guest_array, uint64_t size)

static void *vcpu_worker(void *data)
{
- int ret, vcpu_fd;
+ int ret;
struct kvm_vm *vm = data;
uint64_t *guest_array;
uint64_t pages_count = 0;
@@ -517,8 +517,6 @@ static void *vcpu_worker(void *data)
+ sizeof(sigset_t));
sigset_t *sigset = (sigset_t *) &sigmask->sigset;

- vcpu_fd = vcpu_get_fd(vm, VCPU_ID);
-
/*
* SIG_IPI is unblocked atomically while in KVM_RUN. It causes the
* ioctl to return with -EINTR, but it is still pending and we need
@@ -539,7 +537,7 @@ static void *vcpu_worker(void *data)
generate_random_array(guest_array, TEST_PAGES_PER_LOOP);
pages_count += TEST_PAGES_PER_LOOP;
/* Let the guest dirty the random pages */
- ret = ioctl(vcpu_fd, KVM_RUN, NULL);
+ ret = __vcpu_run(vm, VCPU_ID);
if (ret == -1 && errno == EINTR) {
int sig = -1;
sigwait(sigset, &sig);
diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index cebfc667e3db..f4bf77eed00a 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -202,6 +202,12 @@ vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva);
struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid);
void vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
+
+static inline int __vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)
+{
+ return __vcpu_ioctl(vm, vcpuid, KVM_RUN, NULL);
+}
+
int vcpu_get_fd(struct kvm_vm *vm, uint32_t vcpuid);
void vcpu_run_complete_io(struct kvm_vm *vm, uint32_t vcpuid);
struct kvm_reg_list *vcpu_get_reg_list(struct kvm_vm *vm, uint32_t vcpuid);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index c9bbe69513eb..066314ea880c 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1559,12 +1559,10 @@ void vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)

int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid)
{
- struct vcpu *vcpu = vcpu_find(vm, vcpuid);
int rc;

- TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
do {
- rc = ioctl(vcpu->fd, KVM_RUN, NULL);
+ rc = __vcpu_run(vm, vcpuid);
} while (rc == -1 && errno == EINTR);

assert_on_unhandled_exception(vm, vcpuid);
@@ -1589,7 +1587,7 @@ void vcpu_run_complete_io(struct kvm_vm *vm, uint32_t vcpuid)
TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);

vcpu->state->immediate_exit = 1;
- ret = ioctl(vcpu->fd, KVM_RUN, NULL);
+ ret = __vcpu_run(vm, vcpuid);
vcpu->state->immediate_exit = 0;

TEST_ASSERT(ret == -1 && errno == EINTR,
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:17:38

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 037/105] KVM: selftests: Convert vmx_tsc_adjust_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/vmx_tsc_adjust_test.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/vmx_tsc_adjust_test.c b/tools/testing/selftests/kvm/x86_64/vmx_tsc_adjust_test.c
index e683d0ac3e45..d5ce21d3c513 100644
--- a/tools/testing/selftests/kvm/x86_64/vmx_tsc_adjust_test.c
+++ b/tools/testing/selftests/kvm/x86_64/vmx_tsc_adjust_test.c
@@ -33,7 +33,6 @@
#endif

#define PAGE_SIZE 4096
-#define VCPU_ID 5

#define TSC_ADJUST_VALUE (1ll << 32)
#define TSC_OFFSET_VALUE -(1ll << 48)
@@ -128,26 +127,27 @@ static void report(int64_t val)
int main(int argc, char *argv[])
{
vm_vaddr_t vmx_pages_gva;
+ struct kvm_vcpu *vcpu;

nested_vmx_check_supported();

- vm = vm_create_default(VCPU_ID, 0, (void *) l1_guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, (void *) l1_guest_code);

/* Allocate VMX pages and shared descriptors (vmx_pages). */
vcpu_alloc_vmx(vm, &vmx_pages_gva);
- vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
+ vcpu_args_set(vm, vcpu->id, 1, vmx_pages_gva);

for (;;) {
- volatile struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ volatile struct kvm_run *run = vcpu->run;
struct ucall uc;

- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Got exit_reason other than KVM_EXIT_IO: %u (%s)\n",
run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_ABORT:
TEST_FAIL("%s", (const char *)uc.args[0]);
/* NOT REACHED */
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:20:02

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 074/105] KVM: selftests: Convert debug-exceptions away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/aarch64/debug-exceptions.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/kvm/aarch64/debug-exceptions.c b/tools/testing/selftests/kvm/aarch64/debug-exceptions.c
index ea189d83abf7..d27f30dc57b6 100644
--- a/tools/testing/selftests/kvm/aarch64/debug-exceptions.c
+++ b/tools/testing/selftests/kvm/aarch64/debug-exceptions.c
@@ -3,8 +3,6 @@
#include <kvm_util.h>
#include <processor.h>

-#define VCPU_ID 0
-
#define MDSCR_KDE (1 << 13)
#define MDSCR_MDE (1 << 15)
#define MDSCR_SS (1 << 0)
@@ -186,27 +184,28 @@ static void guest_svc_handler(struct ex_regs *regs)
svc_addr = regs->pc;
}

-static int debug_version(struct kvm_vm *vm)
+static int debug_version(struct kvm_vcpu *vcpu)
{
uint64_t id_aa64dfr0;

- get_reg(vm, VCPU_ID, KVM_ARM64_SYS_REG(SYS_ID_AA64DFR0_EL1), &id_aa64dfr0);
+ get_reg(vcpu->vm, vcpu->id, KVM_ARM64_SYS_REG(SYS_ID_AA64DFR0_EL1), &id_aa64dfr0);
return id_aa64dfr0 & 0xf;
}

int main(int argc, char *argv[])
{
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
struct ucall uc;
int stage;

- vm = vm_create_default(VCPU_ID, 0, guest_code);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
ucall_init(vm, NULL);

vm_init_descriptor_tables(vm);
- vcpu_init_descriptor_tables(vm, VCPU_ID);
+ vcpu_init_descriptor_tables(vm, vcpu->id);

- if (debug_version(vm) < 6) {
+ if (debug_version(vcpu) < 6) {
print_skip("Armv8 debug architecture not supported.");
kvm_vm_free(vm);
exit(KSFT_SKIP);
@@ -224,9 +223,9 @@ int main(int argc, char *argv[])
ESR_EC_SVC64, guest_svc_handler);

for (stage = 0; stage < 7; stage++) {
- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vm, vcpu->id, &uc)) {
case UCALL_SYNC:
TEST_ASSERT(uc.args[1] == stage,
"Stage %d: Unexpected sync ucall, got %lx",
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:21:11

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 096/105] KVM: selftests: Convert kvm_page_table_test away from reliance on vcpu_id

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/kvm_page_table_test.c | 61 +++++++------------
1 file changed, 21 insertions(+), 40 deletions(-)

diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
index a3e3957f67fa..2c92aef163f9 100644
--- a/tools/testing/selftests/kvm/kvm_page_table_test.c
+++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
@@ -46,11 +46,6 @@ static const char * const test_stage_string[] = {
"KVM_ADJUST_MAPPINGS",
};

-struct vcpu_args {
- int vcpu_id;
- bool vcpu_write;
-};
-
struct test_args {
struct kvm_vm *vm;
uint64_t guest_test_virt_mem;
@@ -60,7 +55,7 @@ struct test_args {
uint64_t large_num_pages;
uint64_t host_pages_per_lpage;
enum vm_mem_backing_src_type src_type;
- struct vcpu_args vcpu_args[KVM_MAX_VCPUS];
+ struct kvm_vcpu *vcpus[KVM_MAX_VCPUS];
};

/*
@@ -92,17 +87,13 @@ static uint64_t guest_test_phys_mem;
*/
static uint64_t guest_test_virt_mem = DEFAULT_GUEST_TEST_MEM;

-static void guest_code(int vcpu_id)
+static void guest_code(bool do_write)
{
struct test_args *p = &test_args;
- struct vcpu_args *vcpu_args = &p->vcpu_args[vcpu_id];
enum test_stage *current_stage = &guest_test_stage;
uint64_t addr;
int i, j;

- /* Make sure vCPU args data structure is not corrupt */
- GUEST_ASSERT(vcpu_args->vcpu_id == vcpu_id);
-
while (true) {
addr = p->guest_test_virt_mem;

@@ -123,7 +114,7 @@ static void guest_code(int vcpu_id)
*/
case KVM_CREATE_MAPPINGS:
for (i = 0; i < p->large_num_pages; i++) {
- if (vcpu_args->vcpu_write)
+ if (do_write)
*(uint64_t *)addr = 0x0123456789ABCDEF;
else
READ_ONCE(*(uint64_t *)addr);
@@ -193,17 +184,15 @@ static void guest_code(int vcpu_id)

static void *vcpu_worker(void *data)
{
- int ret;
- struct vcpu_args *vcpu_args = data;
struct kvm_vm *vm = test_args.vm;
- int vcpu_id = vcpu_args->vcpu_id;
- struct kvm_run *run;
+ struct kvm_vcpu *vcpu = data;
+ bool do_write = !(vcpu->id % 2);
struct timespec start;
struct timespec ts_diff;
enum test_stage stage;
+ int ret;

- vcpu_args_set(vm, vcpu_id, 1, vcpu_id);
- run = vcpu_state(vm, vcpu_id);
+ vcpu_args_set(vm, vcpu->id, 1, do_write);

while (!READ_ONCE(host_quit)) {
ret = sem_wait(&test_stage_updated);
@@ -213,15 +202,15 @@ static void *vcpu_worker(void *data)
return NULL;

clock_gettime(CLOCK_MONOTONIC_RAW, &start);
- ret = _vcpu_run(vm, vcpu_id);
+ ret = _vcpu_run(vm, vcpu->id);
ts_diff = timespec_elapsed(start);

TEST_ASSERT(ret == 0, "vcpu_run failed: %d\n", ret);
- TEST_ASSERT(get_ucall(vm, vcpu_id, NULL) == UCALL_SYNC,
+ TEST_ASSERT(get_ucall(vm, vcpu->id, NULL) == UCALL_SYNC,
"Invalid guest sync status: exit_reason=%s\n",
- exit_reason_str(run->exit_reason));
+ exit_reason_str(vcpu->run->exit_reason));

- pr_debug("Got sync event from vCPU %d\n", vcpu_id);
+ pr_debug("Got sync event from vCPU %d\n", vcpu->id);
stage = READ_ONCE(*current_stage);

/*
@@ -230,7 +219,7 @@ static void *vcpu_worker(void *data)
*/
pr_debug("vCPU %d has completed stage %s\n"
"execution time is: %ld.%.9lds\n\n",
- vcpu_id, test_stage_string[stage],
+ vcpu->id, test_stage_string[stage],
ts_diff.tv_sec, ts_diff.tv_nsec);

ret = sem_post(&test_stage_completed);
@@ -250,7 +239,6 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
{
int ret;
struct test_params *p = arg;
- struct vcpu_args *vcpu_args;
enum vm_mem_backing_src_type src_type = p->src_type;
uint64_t large_page_size = get_backing_src_pagesz(src_type);
uint64_t guest_page_size = vm_guest_mode_params[mode].page_size;
@@ -260,7 +248,6 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
uint64_t alignment;
void *host_test_mem;
struct kvm_vm *vm;
- int vcpu_id;

/* Align up the test memory size */
alignment = max(large_page_size, guest_page_size);
@@ -269,7 +256,8 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
/* Create a VM with enough guest pages */
guest_num_pages = test_mem_size / guest_page_size;
vm = __vm_create_with_vcpus(mode, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
- guest_num_pages, 0, guest_code, NULL);
+ guest_num_pages, 0, guest_code,
+ test_args.vcpus);

/* Align down GPA of the testing memslot */
if (!p->phys_offset)
@@ -292,12 +280,6 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
test_args.host_pages_per_lpage = large_page_size / host_page_size;
test_args.src_type = src_type;

- for (vcpu_id = 0; vcpu_id < KVM_MAX_VCPUS; vcpu_id++) {
- vcpu_args = &test_args.vcpu_args[vcpu_id];
- vcpu_args->vcpu_id = vcpu_id;
- vcpu_args->vcpu_write = !(vcpu_id % 2);
- }
-
/* Add an extra memory slot with specified backing src type */
vm_userspace_mem_region_add(vm, src_type, guest_test_phys_mem,
TEST_MEM_SLOT_INDEX, guest_num_pages, 0);
@@ -363,12 +345,11 @@ static void vcpus_complete_new_stage(enum test_stage stage)

static void run_test(enum vm_guest_mode mode, void *arg)
{
- int ret;
pthread_t *vcpu_threads;
struct kvm_vm *vm;
- int vcpu_id;
struct timespec start;
struct timespec ts_diff;
+ int ret, i;

/* Create VM with vCPUs and make some pre-initialization */
vm = pre_init_before_test(mode, arg);
@@ -379,9 +360,9 @@ static void run_test(enum vm_guest_mode mode, void *arg)
host_quit = false;
*current_stage = KVM_BEFORE_MAPPINGS;

- for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
- pthread_create(&vcpu_threads[vcpu_id], NULL, vcpu_worker,
- &test_args.vcpu_args[vcpu_id]);
+ for (i = 0; i < nr_vcpus; i++) {
+ pthread_create(&vcpu_threads[i], NULL, vcpu_worker,
+ &test_args.vcpus[i]);
}

vcpus_complete_new_stage(*current_stage);
@@ -424,13 +405,13 @@ static void run_test(enum vm_guest_mode mode, void *arg)

/* Tell the vcpu thread to quit */
host_quit = true;
- for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
+ for (i = 0; i < nr_vcpus; i++) {
ret = sem_post(&test_stage_updated);
TEST_ASSERT(ret == 0, "Error in sem_post");
}

- for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++)
- pthread_join(vcpu_threads[vcpu_id], NULL);
+ for (i = 0; i < nr_vcpus; i++)
+ pthread_join(vcpu_threads[i], NULL);

ret = sem_destroy(&test_stage_updated);
TEST_ASSERT(ret == 0, "Error in sem_destroy");
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:21:58

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 036/105] KVM: selftests: Convert vmx_set_nested_state_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../kvm/x86_64/vmx_set_nested_state_test.c | 86 +++++++++----------
1 file changed, 43 insertions(+), 43 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/vmx_set_nested_state_test.c b/tools/testing/selftests/kvm/x86_64/vmx_set_nested_state_test.c
index af3b60eb35ec..de38f0e68153 100644
--- a/tools/testing/selftests/kvm/x86_64/vmx_set_nested_state_test.c
+++ b/tools/testing/selftests/kvm/x86_64/vmx_set_nested_state_test.c
@@ -23,38 +23,37 @@
* changes this should be updated.
*/
#define VMCS12_REVISION 0x11e57ed0
-#define VCPU_ID 5

bool have_evmcs;

-void test_nested_state(struct kvm_vm *vm, struct kvm_nested_state *state)
+void test_nested_state(struct kvm_vcpu *vcpu, struct kvm_nested_state *state)
{
- vcpu_nested_state_set(vm, VCPU_ID, state);
+ vcpu_nested_state_set(vcpu->vm, vcpu->id, state);
}

-void test_nested_state_expect_errno(struct kvm_vm *vm,
+void test_nested_state_expect_errno(struct kvm_vcpu *vcpu,
struct kvm_nested_state *state,
int expected_errno)
{
int rv;

- rv = __vcpu_nested_state_set(vm, VCPU_ID, state);
+ rv = __vcpu_nested_state_set(vcpu->vm, vcpu->id, state);
TEST_ASSERT(rv == -1 && errno == expected_errno,
"Expected %s (%d) from vcpu_nested_state_set but got rv: %i errno: %s (%d)",
strerror(expected_errno), expected_errno, rv, strerror(errno),
errno);
}

-void test_nested_state_expect_einval(struct kvm_vm *vm,
+void test_nested_state_expect_einval(struct kvm_vcpu *vcpu,
struct kvm_nested_state *state)
{
- test_nested_state_expect_errno(vm, state, EINVAL);
+ test_nested_state_expect_errno(vcpu, state, EINVAL);
}

-void test_nested_state_expect_efault(struct kvm_vm *vm,
+void test_nested_state_expect_efault(struct kvm_vcpu *vcpu,
struct kvm_nested_state *state)
{
- test_nested_state_expect_errno(vm, state, EFAULT);
+ test_nested_state_expect_errno(vcpu, state, EFAULT);
}

void set_revision_id_for_vmcs12(struct kvm_nested_state *state,
@@ -86,7 +85,7 @@ void set_default_vmx_state(struct kvm_nested_state *state, int size)
set_revision_id_for_vmcs12(state, VMCS12_REVISION);
}

-void test_vmx_nested_state(struct kvm_vm *vm)
+void test_vmx_nested_state(struct kvm_vcpu *vcpu)
{
/* Add a page for VMCS12. */
const int state_sz = sizeof(struct kvm_nested_state) + getpagesize();
@@ -96,14 +95,14 @@ void test_vmx_nested_state(struct kvm_vm *vm)
/* The format must be set to 0. 0 for VMX, 1 for SVM. */
set_default_vmx_state(state, state_sz);
state->format = 1;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* We cannot virtualize anything if the guest does not have VMX
* enabled.
*/
set_default_vmx_state(state, state_sz);
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* We cannot virtualize anything if the guest does not have VMX
@@ -112,17 +111,17 @@ void test_vmx_nested_state(struct kvm_vm *vm)
*/
set_default_vmx_state(state, state_sz);
state->hdr.vmx.vmxon_pa = -1ull;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

state->hdr.vmx.vmcs12_pa = -1ull;
state->flags = KVM_STATE_NESTED_EVMCS;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

state->flags = 0;
- test_nested_state(vm, state);
+ test_nested_state(vcpu, state);

/* Enable VMX in the guest CPUID. */
- vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
+ vcpu_set_cpuid(vcpu->vm, vcpu->id, kvm_get_supported_cpuid());

/*
* Setting vmxon_pa == -1ull and vmcs_pa == -1ull exits early without
@@ -133,34 +132,34 @@ void test_vmx_nested_state(struct kvm_vm *vm)
set_default_vmx_state(state, state_sz);
state->hdr.vmx.vmxon_pa = -1ull;
state->hdr.vmx.vmcs12_pa = -1ull;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

state->flags &= KVM_STATE_NESTED_EVMCS;
if (have_evmcs) {
- test_nested_state_expect_einval(vm, state);
- vcpu_enable_evmcs(vm, VCPU_ID);
+ test_nested_state_expect_einval(vcpu, state);
+ vcpu_enable_evmcs(vcpu->vm, vcpu->id);
}
- test_nested_state(vm, state);
+ test_nested_state(vcpu, state);

/* It is invalid to have vmxon_pa == -1ull and SMM flags non-zero. */
state->hdr.vmx.smm.flags = 1;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/* Invalid flags are rejected. */
set_default_vmx_state(state, state_sz);
state->hdr.vmx.flags = ~0;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/* It is invalid to have vmxon_pa == -1ull and vmcs_pa != -1ull. */
set_default_vmx_state(state, state_sz);
state->hdr.vmx.vmxon_pa = -1ull;
state->flags = 0;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/* It is invalid to have vmxon_pa set to a non-page aligned address. */
set_default_vmx_state(state, state_sz);
state->hdr.vmx.vmxon_pa = 1;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* It is invalid to have KVM_STATE_NESTED_SMM_GUEST_MODE and
@@ -170,7 +169,7 @@ void test_vmx_nested_state(struct kvm_vm *vm)
state->flags = KVM_STATE_NESTED_GUEST_MODE |
KVM_STATE_NESTED_RUN_PENDING;
state->hdr.vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* It is invalid to have any of the SMM flags set besides:
@@ -180,13 +179,13 @@ void test_vmx_nested_state(struct kvm_vm *vm)
set_default_vmx_state(state, state_sz);
state->hdr.vmx.smm.flags = ~(KVM_STATE_NESTED_SMM_GUEST_MODE |
KVM_STATE_NESTED_SMM_VMXON);
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/* Outside SMM, SMM flags must be zero. */
set_default_vmx_state(state, state_sz);
state->flags = 0;
state->hdr.vmx.smm.flags = KVM_STATE_NESTED_SMM_GUEST_MODE;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* Size must be large enough to fit kvm_nested_state and vmcs12
@@ -195,13 +194,13 @@ void test_vmx_nested_state(struct kvm_vm *vm)
set_default_vmx_state(state, state_sz);
state->size = sizeof(*state);
state->flags = 0;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

set_default_vmx_state(state, state_sz);
state->size = sizeof(*state);
state->flags = 0;
state->hdr.vmx.vmcs12_pa = -1;
- test_nested_state(vm, state);
+ test_nested_state(vcpu, state);

/*
* KVM_SET_NESTED_STATE succeeds with invalid VMCS
@@ -209,7 +208,7 @@ void test_vmx_nested_state(struct kvm_vm *vm)
*/
set_default_vmx_state(state, state_sz);
state->flags = 0;
- test_nested_state(vm, state);
+ test_nested_state(vcpu, state);

/* Invalid flags are rejected, even if no VMCS loaded. */
set_default_vmx_state(state, state_sz);
@@ -217,13 +216,13 @@ void test_vmx_nested_state(struct kvm_vm *vm)
state->flags = 0;
state->hdr.vmx.vmcs12_pa = -1;
state->hdr.vmx.flags = ~0;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/* vmxon_pa cannot be the same address as vmcs_pa. */
set_default_vmx_state(state, state_sz);
state->hdr.vmx.vmxon_pa = 0;
state->hdr.vmx.vmcs12_pa = 0;
- test_nested_state_expect_einval(vm, state);
+ test_nested_state_expect_einval(vcpu, state);

/*
* Test that if we leave nesting the state reflects that when we get
@@ -233,8 +232,8 @@ void test_vmx_nested_state(struct kvm_vm *vm)
state->hdr.vmx.vmxon_pa = -1ull;
state->hdr.vmx.vmcs12_pa = -1ull;
state->flags = 0;
- test_nested_state(vm, state);
- vcpu_nested_state_get(vm, VCPU_ID, state);
+ test_nested_state(vcpu, state);
+ vcpu_nested_state_get(vcpu->vm, vcpu->id, state);
TEST_ASSERT(state->size >= sizeof(*state) && state->size <= state_sz,
"Size must be between %ld and %d. The size returned was %d.",
sizeof(*state), state_sz, state->size);
@@ -244,7 +243,7 @@ void test_vmx_nested_state(struct kvm_vm *vm)
free(state);
}

-void disable_vmx(struct kvm_vm *vm)
+void disable_vmx(struct kvm_vcpu *vcpu)
{
struct kvm_cpuid2 *cpuid = kvm_get_supported_cpuid();
int i;
@@ -256,7 +255,7 @@ void disable_vmx(struct kvm_vm *vm)
TEST_ASSERT(i != cpuid->nent, "CPUID function 1 not found");

cpuid->entries[i].ecx &= ~CPUID_VMX;
- vcpu_set_cpuid(vm, VCPU_ID, cpuid);
+ vcpu_set_cpuid(vcpu->vm, vcpu->id, cpuid);
cpuid->entries[i].ecx |= CPUID_VMX;
}

@@ -264,6 +263,7 @@ int main(int argc, char *argv[])
{
struct kvm_vm *vm;
struct kvm_nested_state state;
+ struct kvm_vcpu *vcpu;

have_evmcs = kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS);

@@ -278,20 +278,20 @@ int main(int argc, char *argv[])
*/
nested_vmx_check_supported();

- vm = vm_create_default(VCPU_ID, 0, 0);
+ vm = vm_create_with_one_vcpu(&vcpu, NULL);

/*
* First run tests with VMX disabled to check error handling.
*/
- disable_vmx(vm);
+ disable_vmx(vcpu);

/* Passing a NULL kvm_nested_state causes a EFAULT. */
- test_nested_state_expect_efault(vm, NULL);
+ test_nested_state_expect_efault(vcpu, NULL);

/* 'size' cannot be smaller than sizeof(kvm_nested_state). */
set_default_state(&state);
state.size = 0;
- test_nested_state_expect_einval(vm, &state);
+ test_nested_state_expect_einval(vcpu, &state);

/*
* Setting the flags 0xf fails the flags check. The only flags that
@@ -302,7 +302,7 @@ int main(int argc, char *argv[])
*/
set_default_state(&state);
state.flags = 0xf;
- test_nested_state_expect_einval(vm, &state);
+ test_nested_state_expect_einval(vcpu, &state);

/*
* If KVM_STATE_NESTED_RUN_PENDING is set then
@@ -310,9 +310,9 @@ int main(int argc, char *argv[])
*/
set_default_state(&state);
state.flags = KVM_STATE_NESTED_RUN_PENDING;
- test_nested_state_expect_einval(vm, &state);
+ test_nested_state_expect_einval(vcpu, &state);

- test_vmx_nested_state(vm);
+ test_vmx_nested_state(vcpu);

kvm_vm_free(vm);
return 0;
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:27:35

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 072/105] KVM: selftests: Convert set_memory_region_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/set_memory_region_test.c | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 482ae2ad662c..13859b37e28d 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -17,8 +17,6 @@
#include <kvm_util.h>
#include <processor.h>

-#define VCPU_ID 0
-
/*
* s390x needs at least 1MB alignment, and the x86_64 MOVE/DELETE tests need a
* 2MB sized and aligned region so that the initial region corresponds to
@@ -54,8 +52,8 @@ static inline uint64_t guest_spin_on_val(uint64_t spin_val)

static void *vcpu_worker(void *data)
{
- struct kvm_vm *vm = data;
- struct kvm_run *run;
+ struct kvm_vcpu *vcpu = data;
+ struct kvm_run *run = vcpu->run;
struct ucall uc;
uint64_t cmd;

@@ -64,13 +62,11 @@ static void *vcpu_worker(void *data)
* which will occur if the guest attempts to access a memslot after it
* has been deleted or while it is being moved .
*/
- run = vcpu_state(vm, VCPU_ID);
-
while (1) {
- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vcpu->vm, vcpu->id);

if (run->exit_reason == KVM_EXIT_IO) {
- cmd = get_ucall(vm, VCPU_ID, &uc);
+ cmd = get_ucall(vcpu->vm, vcpu->id, &uc);
if (cmd != UCALL_SYNC)
break;

@@ -113,13 +109,14 @@ static void wait_for_vcpu(void)
usleep(100000);
}

-static struct kvm_vm *spawn_vm(pthread_t *vcpu_thread, void *guest_code)
+static struct kvm_vm *spawn_vm(struct kvm_vcpu **vcpu, pthread_t *vcpu_thread,
+ void *guest_code)
{
struct kvm_vm *vm;
uint64_t *hva;
uint64_t gpa;

- vm = vm_create_default(VCPU_ID, 0, guest_code);
+ vm = vm_create_with_one_vcpu(vcpu, guest_code);

vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS_THP,
MEM_REGION_GPA, MEM_REGION_SLOT,
@@ -138,7 +135,7 @@ static struct kvm_vm *spawn_vm(pthread_t *vcpu_thread, void *guest_code)
hva = addr_gpa2hva(vm, MEM_REGION_GPA);
memset(hva, 0, 2 * 4096);

- pthread_create(vcpu_thread, NULL, vcpu_worker, vm);
+ pthread_create(vcpu_thread, NULL, vcpu_worker, vcpu);

/* Ensure the guest thread is spun up. */
wait_for_vcpu();
@@ -180,10 +177,11 @@ static void guest_code_move_memory_region(void)
static void test_move_memory_region(void)
{
pthread_t vcpu_thread;
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
uint64_t *hva;

- vm = spawn_vm(&vcpu_thread, guest_code_move_memory_region);
+ vm = spawn_vm(&vcpu, &vcpu_thread, guest_code_move_memory_region);

hva = addr_gpa2hva(vm, MEM_REGION_GPA);

@@ -258,11 +256,12 @@ static void guest_code_delete_memory_region(void)
static void test_delete_memory_region(void)
{
pthread_t vcpu_thread;
+ struct kvm_vcpu *vcpu;
struct kvm_regs regs;
struct kvm_run *run;
struct kvm_vm *vm;

- vm = spawn_vm(&vcpu_thread, guest_code_delete_memory_region);
+ vm = spawn_vm(&vcpu, &vcpu_thread, guest_code_delete_memory_region);

/* Delete the memory region, the guest should not die. */
vm_mem_region_delete(vm, MEM_REGION_SLOT);
@@ -286,13 +285,13 @@ static void test_delete_memory_region(void)

pthread_join(vcpu_thread, NULL);

- run = vcpu_state(vm, VCPU_ID);
+ run = vcpu->run;

TEST_ASSERT(run->exit_reason == KVM_EXIT_SHUTDOWN ||
run->exit_reason == KVM_EXIT_INTERNAL_ERROR,
"Unexpected exit reason = %d", run->exit_reason);

- vcpu_regs_get(vm, VCPU_ID, &regs);
+ vcpu_regs_get(vm, vcpu->id, &regs);

/*
* On AMD, after KVM_EXIT_SHUTDOWN the VMCB has been reinitialized already,
@@ -309,18 +308,19 @@ static void test_delete_memory_region(void)

static void test_zero_memory_regions(void)
{
+ struct kvm_vcpu *vcpu;
struct kvm_run *run;
struct kvm_vm *vm;

pr_info("Testing KVM_RUN with zero added memory regions\n");

vm = vm_create(0);
- vm_vcpu_add(vm, VCPU_ID);
+ vcpu = vm_vcpu_add(vm, 0);

vm_ioctl(vm, KVM_SET_NR_MMU_PAGES, (void *)64ul);
- vcpu_run(vm, VCPU_ID);
+ vcpu_run(vm, vcpu->id);

- run = vcpu_state(vm, VCPU_ID);
+ run = vcpu->run;
TEST_ASSERT(run->exit_reason == KVM_EXIT_INTERNAL_ERROR,
"Unexpected exit_reason = %u\n", run->exit_reason);

--
2.35.1.723.g4982287a31-goog

2022-03-11 23:28:56

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 095/105] KVM: selftests: Drop vcpuids param from VM creators

Signed-off-by: Sean Christopherson <[email protected]>
---
tools/testing/selftests/kvm/include/kvm_util_base.h | 4 ++--
tools/testing/selftests/kvm/kvm_page_table_test.c | 2 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 8 +++-----
tools/testing/selftests/kvm/lib/perf_test_util.c | 2 +-
4 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 608f9d3cdfbf..391f72eb9bcb 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -520,7 +520,7 @@ vm_paddr_t vm_alloc_page_table(struct kvm_vm *vm);
struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
uint32_t num_percpu_pages, void *guest_code,
- uint32_t vcpuids[], struct kvm_vcpu *vcpus[]);
+ struct kvm_vcpu *vcpus[]);

static inline struct kvm_vm *vm_create_with_vcpus(uint32_t nr_vcpus,
void *guest_code,
@@ -528,7 +528,7 @@ static inline struct kvm_vm *vm_create_with_vcpus(uint32_t nr_vcpus,
{
return __vm_create_with_vcpus(VM_MODE_DEFAULT, nr_vcpus,
DEFAULT_GUEST_PHY_PAGES, 0, 0,
- guest_code, NULL, vcpus);
+ guest_code, vcpus);
}

/*
diff --git a/tools/testing/selftests/kvm/kvm_page_table_test.c b/tools/testing/selftests/kvm/kvm_page_table_test.c
index b969257f646d..a3e3957f67fa 100644
--- a/tools/testing/selftests/kvm/kvm_page_table_test.c
+++ b/tools/testing/selftests/kvm/kvm_page_table_test.c
@@ -269,7 +269,7 @@ static struct kvm_vm *pre_init_before_test(enum vm_guest_mode mode, void *arg)
/* Create a VM with enough guest pages */
guest_num_pages = test_mem_size / guest_page_size;
vm = __vm_create_with_vcpus(mode, nr_vcpus, DEFAULT_GUEST_PHY_PAGES,
- guest_num_pages, 0, guest_code, NULL, NULL);
+ guest_num_pages, 0, guest_code, NULL);

/* Align down GPA of the testing memslot */
if (!p->phys_offset)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index a89369505232..861d18ed868d 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -308,7 +308,7 @@ struct kvm_vm *vm_create(uint64_t phy_pages)
struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus,
uint64_t slot0_mem_pages, uint64_t extra_mem_pages,
uint32_t num_percpu_pages, void *guest_code,
- uint32_t vcpuids[], struct kvm_vcpu *vcpus[])
+ struct kvm_vcpu *vcpus[])
{
uint64_t vcpu_pages, extra_pg_pages, pages;
struct kvm_vcpu *vcpu;
@@ -343,9 +343,7 @@ struct kvm_vm *__vm_create_with_vcpus(enum vm_guest_mode mode, uint32_t nr_vcpus
#endif

for (i = 0; i < nr_vcpus; ++i) {
- uint32_t vcpuid = vcpuids ? vcpuids[i] : i;
-
- vcpu = vm_vcpu_add(vm, vcpuid, guest_code);
+ vcpu = vm_vcpu_add(vm, i, guest_code);
if (vcpus)
vcpus[i] = vcpu;
}
@@ -361,7 +359,7 @@ struct kvm_vm *__vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,
struct kvm_vm *vm;

vm = __vm_create_with_vcpus(VM_MODE_DEFAULT, 1, DEFAULT_GUEST_PHY_PAGES,
- extra_mem_pages, 0, guest_code, NULL, vcpus);
+ extra_mem_pages, 0, guest_code, vcpus);

*vcpu = vcpus[0];
return vm;
diff --git a/tools/testing/selftests/kvm/lib/perf_test_util.c b/tools/testing/selftests/kvm/lib/perf_test_util.c
index 5b80ba7f12e4..ffbd3664e162 100644
--- a/tools/testing/selftests/kvm/lib/perf_test_util.c
+++ b/tools/testing/selftests/kvm/lib/perf_test_util.c
@@ -140,7 +140,7 @@ struct kvm_vm *perf_test_create_vm(enum vm_guest_mode mode, int vcpus,
* effect as KVM allows aliasing HVAs in meslots.
*/
vm = __vm_create_with_vcpus(mode, vcpus, DEFAULT_GUEST_PHY_PAGES,
- guest_num_pages, 0, guest_code, NULL, NULL);
+ guest_num_pages, 0, guest_code, NULL);

pta->vm = vm;

--
2.35.1.723.g4982287a31-goog

2022-03-11 23:29:02

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 078/105] KVM: selftests: Add "arch" to common utils that have arch implementations

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 201 ++++++++++--------
.../selftests/kvm/lib/aarch64/processor.c | 12 +-
.../selftests/kvm/lib/riscv/processor.c | 12 +-
.../selftests/kvm/lib/s390x/processor.c | 12 +-
.../selftests/kvm/lib/x86_64/processor.c | 12 +-
5 files changed, 141 insertions(+), 108 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index 042c39e474da..aa2e68bca741 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -95,23 +95,6 @@ struct kvm_vm {

struct kvm_vcpu *vcpu_get(struct kvm_vm *vm, uint32_t vcpuid);

-/*
- * Virtual Translation Tables Dump
- *
- * Input Args:
- * stream - Output FILE stream
- * vm - Virtual Machine
- * indent - Left margin indent amount
- *
- * Output Args: None
- *
- * Return: None
- *
- * Dumps to the FILE stream given by @stream, the contents of all the
- * virtual translation tables for the VM given by @vm.
- */
-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
-
struct userspace_mem_region *
memslot2region(struct kvm_vm *vm, uint32_t memslot);

@@ -283,26 +266,6 @@ static inline int vm_get_stats_fd(struct kvm_vm *vm)
return fd;
}

-
-/*
- * VM VCPU Dump
- *
- * Input Args:
- * stream - Output FILE stream
- * vm - Virtual Machine
- * vcpuid - VCPU ID
- * indent - Left margin indent amount
- *
- * Output Args: None
- *
- * Return: None
- *
- * Dumps the current state of the VCPU specified by @vcpuid, within the VM
- * given by @vm, to the FILE stream given by @stream.
- */
-void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
- uint8_t indent);
-
void vm_create_irqchip(struct kvm_vm *vm);

void vm_userspace_mem_region_add(struct kvm_vm *vm,
@@ -325,23 +288,6 @@ void *addr_gva2hva(struct kvm_vm *vm, vm_vaddr_t gva);
vm_paddr_t addr_hva2gpa(struct kvm_vm *vm, void *hva);
void *addr_gpa2alias(struct kvm_vm *vm, vm_paddr_t gpa);

-/*
- * Address Guest Virtual to Guest Physical
- *
- * Input Args:
- * vm - Virtual Machine
- * gva - VM virtual address
- *
- * Output Args: None
- *
- * Return:
- * Equivalent VM physical address
- *
- * Returns the VM physical address of the translated VM virtual
- * address given by @gva.
- */
-vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva);
-
struct kvm_run *vcpu_state(struct kvm_vm *vm, uint32_t vcpuid);
void vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
int _vcpu_run(struct kvm_vm *vm, uint32_t vcpuid);
@@ -565,26 +511,6 @@ void kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing);

const char *exit_reason_str(unsigned int exit_reason);

-void virt_pgd_alloc(struct kvm_vm *vm);
-
-/*
- * VM Virtual Page Map
- *
- * Input Args:
- * vm - Virtual Machine
- * vaddr - VM Virtual Address
- * paddr - VM Physical Address
- * memslot - Memory region slot for new virtual translation tables
- *
- * Output Args: None
- *
- * Return: None
- *
- * Within @vm, creates a virtual translation for the page starting
- * at @vaddr to the page starting at @paddr.
- */
-void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr);
-
vm_paddr_t vm_phy_page_alloc(struct kvm_vm *vm, vm_paddr_t paddr_min,
uint32_t memslot);
vm_paddr_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t num,
@@ -637,16 +563,6 @@ static inline struct kvm_vm *vm_create_with_one_vcpu(struct kvm_vcpu **vcpu,

struct kvm_vcpu *vm_recreate_with_one_vcpu(struct kvm_vm *vm);

-/*
- * Adds a vCPU with reasonable defaults (e.g. a stack)
- *
- * Input Args:
- * vm - Virtual Machine
- * vcpuid - The id of the VCPU to add to the VM.
- * guest_code - The vCPU's entry point
- */
-void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code);
-
unsigned int vm_get_page_size(struct kvm_vm *vm);
unsigned int vm_get_page_shift(struct kvm_vm *vm);
unsigned long vm_compute_max_gfn(struct kvm_vm *vm);
@@ -687,4 +603,121 @@ void assert_on_unhandled_exception(struct kvm_vm *vm, uint32_t vcpuid);

int vm_get_stats_fd(struct kvm_vm *vm);

+/*
+ * VM VCPU Dump
+ *
+ * Input Args:
+ * stream - Output FILE stream
+ * vm - Virtual Machine
+ * vcpuid - VCPU ID
+ * indent - Left margin indent amount
+ *
+ * Output Args: None
+ *
+ * Return: None
+ *
+ * Dumps the current state of the VCPU specified by @vcpuid, within the VM
+ * given by @vm, to the FILE stream given by @stream.
+ */
+
+void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
+ uint8_t indent);
+
+static inline void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid,
+ uint8_t indent)
+{
+ vcpu_arch_dump(stream, vm, vcpuid, indent);
+}
+
+/*
+ * Adds a vCPU with reasonable defaults (e.g. a stack)
+ *
+ * Input Args:
+ * vm - Virtual Machine
+ * vcpuid - The id of the VCPU to add to the VM.
+ * guest_code - The vCPU's entry point
+ */
+void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code);
+
+static inline void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid,
+ void *guest_code)
+{
+ vm_arch_vcpu_add(vm, vcpuid, guest_code);
+}
+
+void virt_arch_pgd_alloc(struct kvm_vm *vm);
+
+static inline void virt_pgd_alloc(struct kvm_vm *vm)
+{
+ virt_arch_pgd_alloc(vm);
+}
+
+/*
+ * VM Virtual Page Map
+ *
+ * Input Args:
+ * vm - Virtual Machine
+ * vaddr - VM Virtual Address
+ * paddr - VM Physical Address
+ * memslot - Memory region slot for new virtual translation tables
+ *
+ * Output Args: None
+ *
+ * Return: None
+ *
+ * Within @vm, creates a virtual translation for the page starting
+ * at @vaddr to the page starting at @paddr.
+ */
+void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr);
+
+static inline void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
+{
+ virt_arch_pg_map(vm, vaddr, paddr);
+}
+
+
+/*
+ * Address Guest Virtual to Guest Physical
+ *
+ * Input Args:
+ * vm - Virtual Machine
+ * gva - VM virtual address
+ *
+ * Output Args: None
+ *
+ * Return:
+ * Equivalent VM physical address
+ *
+ * Returns the VM physical address of the translated VM virtual
+ * address given by @gva.
+ */
+vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva);
+
+static inline vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+{
+ return addr_arch_gva2gpa(vm, gva);
+}
+
+/*
+ * Virtual Translation Tables Dump
+ *
+ * Input Args:
+ * stream - Output FILE stream
+ * vm - Virtual Machine
+ * indent - Left margin indent amount
+ *
+ * Output Args: None
+ *
+ * Return: None
+ *
+ * Dumps to the FILE stream given by @stream, the contents of all the
+ * virtual translation tables for the VM given by @vm.
+ */
+void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent);
+
+static inline void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+{
+ virt_arch_dump(stream, vm, indent);
+}
+
#endif /* SELFTEST_KVM_UTIL_BASE_H */
diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c
index 5f6967058647..653e740c46b1 100644
--- a/tools/testing/selftests/kvm/lib/aarch64/processor.c
+++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c
@@ -74,7 +74,7 @@ static uint64_t __maybe_unused ptrs_per_pte(struct kvm_vm *vm)
return 1 << (vm->page_shift - 3);
}

-void virt_pgd_alloc(struct kvm_vm *vm)
+void virt_arch_pgd_alloc(struct kvm_vm *vm)
{
if (!vm->pgd_created) {
vm_paddr_t paddr = vm_phy_pages_alloc(vm,
@@ -131,14 +131,14 @@ static void _virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
*ptep |= (attr_idx << 2) | (1 << 10) /* Access Flag */;
}

-void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
+void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
{
uint64_t attr_idx = 4; /* NORMAL (See DEFAULT_MAIR_EL1) */

_virt_pg_map(vm, vaddr, paddr, attr_idx);
}

-vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
{
uint64_t *ptep;

@@ -195,7 +195,7 @@ static void pte_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent, uint64_t p
#endif
}

-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
{
int level = 4 - (vm->pgtable_levels - 1);
uint64_t pgd, *ptep;
@@ -303,7 +303,7 @@ void aarch64_vcpu_setup(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_vcpu_init
set_reg(vm, vcpuid, KVM_ARM64_SYS_REG(SYS_TPIDR_EL1), vcpuid);
}

-void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
+void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
uint64_t pstate, pc;

@@ -330,7 +330,7 @@ void aarch64_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid,
set_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), (uint64_t)guest_code);
}

-void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
{
aarch64_vcpu_add_default(vm, vcpuid, NULL, guest_code);
}
diff --git a/tools/testing/selftests/kvm/lib/riscv/processor.c b/tools/testing/selftests/kvm/lib/riscv/processor.c
index f17c7542cc53..8f415633ed12 100644
--- a/tools/testing/selftests/kvm/lib/riscv/processor.c
+++ b/tools/testing/selftests/kvm/lib/riscv/processor.c
@@ -53,7 +53,7 @@ static uint64_t pte_index(struct kvm_vm *vm, vm_vaddr_t gva, int level)
return (gva & pte_index_mask[level]) >> pte_index_shift[level];
}

-void virt_pgd_alloc(struct kvm_vm *vm)
+void virt_arch_pgd_alloc(struct kvm_vm *vm)
{
if (!vm->pgd_created) {
vm_paddr_t paddr = vm_phy_pages_alloc(vm,
@@ -64,7 +64,7 @@ void virt_pgd_alloc(struct kvm_vm *vm)
}
}

-void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
+void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
{
uint64_t *ptep, next_ppn;
int level = vm->pgtable_levels - 1;
@@ -108,7 +108,7 @@ void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
PGTBL_PTE_PERM_MASK | PGTBL_PTE_VALID_MASK;
}

-vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
{
uint64_t *ptep;
int level = vm->pgtable_levels - 1;
@@ -159,7 +159,7 @@ static void pte_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent,
#endif
}

-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
{
int level = vm->pgtable_levels - 1;
uint64_t pgd, *ptep;
@@ -201,7 +201,7 @@ void riscv_vcpu_mmu_setup(struct kvm_vm *vm, int vcpuid)
set_reg(vm, vcpuid, RISCV_CSR_REG(satp), satp);
}

-void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
+void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
struct kvm_riscv_core core;

@@ -273,7 +273,7 @@ static void guest_hang(void)
;
}

-void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
{
int r;
size_t stack_size = vm->page_size == 4096 ?
diff --git a/tools/testing/selftests/kvm/lib/s390x/processor.c b/tools/testing/selftests/kvm/lib/s390x/processor.c
index aec15ca9d887..c2fe56a3fb74 100644
--- a/tools/testing/selftests/kvm/lib/s390x/processor.c
+++ b/tools/testing/selftests/kvm/lib/s390x/processor.c
@@ -10,7 +10,7 @@

#define PAGES_PER_REGION 4

-void virt_pgd_alloc(struct kvm_vm *vm)
+void virt_arch_pgd_alloc(struct kvm_vm *vm)
{
vm_paddr_t paddr;

@@ -46,7 +46,7 @@ static uint64_t virt_alloc_region(struct kvm_vm *vm, int ri)
| ((ri < 4 ? (PAGES_PER_REGION - 1) : 0) & REGION_ENTRY_LENGTH);
}

-void virt_pg_map(struct kvm_vm *vm, uint64_t gva, uint64_t gpa)
+void virt_arch_pg_map(struct kvm_vm *vm, uint64_t gva, uint64_t gpa)
{
int ri, idx;
uint64_t *entry;
@@ -85,7 +85,7 @@ void virt_pg_map(struct kvm_vm *vm, uint64_t gva, uint64_t gpa)
entry[idx] = gpa;
}

-vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
{
int ri, idx;
uint64_t *entry;
@@ -146,7 +146,7 @@ static void virt_dump_region(FILE *stream, struct kvm_vm *vm, uint8_t indent,
}
}

-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
{
if (!vm->pgd_created)
return;
@@ -154,7 +154,7 @@ void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
virt_dump_region(stream, vm, indent, vm->pgd);
}

-void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
{
size_t stack_size = DEFAULT_STACK_PGS * getpagesize();
uint64_t stack_vaddr;
@@ -205,7 +205,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
va_end(ap);
}

-void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
+void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
struct kvm_vcpu *vcpu = vcpu_get(vm, vcpuid);

diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c
index ea7f1703e51e..fd14351a3835 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c
@@ -141,7 +141,7 @@ static void sregs_dump(FILE *stream, struct kvm_sregs *sregs, uint8_t indent)
}
}

-void virt_pgd_alloc(struct kvm_vm *vm)
+void virt_arch_pgd_alloc(struct kvm_vm *vm)
{
TEST_ASSERT(vm->mode == VM_MODE_PXXV48_4K, "Attempt to use "
"unknown or unsupported guest mode, mode: 0x%x", vm->mode);
@@ -244,7 +244,7 @@ void __virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr,
pte->present = 1;
}

-void virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
+void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr)
{
__virt_pg_map(vm, vaddr, paddr, X86_PAGE_SIZE_4K);
}
@@ -341,7 +341,7 @@ void vm_set_page_table_entry(struct kvm_vm *vm, int vcpuid, uint64_t vaddr,
*(uint64_t *)new_pte = pte;
}

-void virt_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
+void virt_arch_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent)
{
struct pageUpperEntry *pml4e, *pml4e_start;
struct pageUpperEntry *pdpe, *pdpe_start;
@@ -522,7 +522,7 @@ static void kvm_seg_set_kernel_data_64bit(struct kvm_vm *vm, uint16_t selector,
kvm_seg_fill_gdt_64bit(vm, segp);
}

-vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
+vm_paddr_t addr_arch_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
{
uint16_t index[4];
struct pageUpperEntry *pml4e, *pdpe, *pde;
@@ -671,7 +671,7 @@ void vm_xsave_req_perm(int bit)
bitmask);
}

-void vm_vcpu_add_default(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
+void vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpuid, void *guest_code)
{
struct kvm_mp_state mp_state;
struct kvm_regs regs;
@@ -932,7 +932,7 @@ void vcpu_args_set(struct kvm_vm *vm, uint32_t vcpuid, unsigned int num, ...)
va_end(ap);
}

-void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
+void vcpu_arch_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
{
struct kvm_regs regs;
struct kvm_sregs sregs;
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:29:07

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 013/105] KVM: selftests: Make vm_ioctl() a wrapper to pretty print ioctl name

Deliberately do not use __stringify(), as that will expand the ioctl all
the way down to its numerical sequence, the intent is print the name of
the macro.

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/include/kvm_util_base.h | 36 ++++++++++---------
tools/testing/selftests/kvm/lib/kvm_util.c | 28 ++++-----------
2 files changed, 27 insertions(+), 37 deletions(-)

diff --git a/tools/testing/selftests/kvm/include/kvm_util_base.h b/tools/testing/selftests/kvm/include/kvm_util_base.h
index be8882dbe38a..bcffd9f85490 100644
--- a/tools/testing/selftests/kvm/include/kvm_util_base.h
+++ b/tools/testing/selftests/kvm/include/kvm_util_base.h
@@ -105,6 +105,26 @@ int open_kvm_dev_path_or_exit(void);
int kvm_check_cap(long cap);
int vm_check_cap(struct kvm_vm *vm, long cap);
int vm_enable_cap(struct kvm_vm *vm, struct kvm_enable_cap *cap);
+
+#define __KVM_IOCTL_ERROR(_name, _ret) \
+ "%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errno)
+
+#define KVM_IOCTL_ERROR(_ioctl, _ret) __KVM_IOCTL_ERROR(#_ioctl, _ret)
+
+int __kvm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg);
+void kvm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg);
+
+int __vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg);
+void _vm_ioctl(struct kvm_vm *vm, unsigned long cmd, const char *name, void *arg);
+#define vm_ioctl(vm, cmd, arg) _vm_ioctl(vm, cmd, #cmd, arg)
+
+int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,
+ void *arg);
+void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long cmd,
+ const char *name, void *arg);
+#define vcpu_ioctl(vm, vcpuid, cmd, arg) \
+ _vcpu_ioctl(vm, vcpuid, cmd, #cmd, arg)
+
void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size);
const char *vm_guest_mode_string(uint32_t i);

@@ -151,22 +171,6 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
uint64_t guest_paddr, uint32_t slot, uint64_t npages,
uint32_t flags);

-#define __KVM_IOCTL_ERROR(_name, _ret) \
- "%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errno)
-
-#define KVM_IOCTL_ERROR(_ioctl, _ret) __KVM_IOCTL_ERROR(#_ioctl, _ret)
-
-void _vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
- const char *name, void *arg);
-int __vcpu_ioctl(struct kvm_vm *vm, uint32_t vcpuid, unsigned long ioctl,
- void *arg);
-#define vcpu_ioctl(vm, vcpuid, ioctl, arg) \
- _vcpu_ioctl(vm, vcpuid, ioctl, #ioctl, arg)
-
-void vm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
-int __vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg);
-void kvm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
-int __kvm_ioctl(struct kvm_vm *vm, unsigned long ioctl, void *arg);
void vm_mem_region_set_flags(struct kvm_vm *vm, uint32_t slot, uint32_t flags);
void vm_mem_region_move(struct kvm_vm *vm, uint32_t slot, uint64_t new_gpa);
void vm_mem_region_delete(struct kvm_vm *vm, uint32_t slot);
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index d45f2ec7b13e..a37baaddfeaf 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1652,32 +1652,18 @@ void *vcpu_map_dirty_ring(struct kvm_vm *vm, uint32_t vcpuid)
return vcpu->dirty_gfns;
}

-/*
- * VM Ioctl
- *
- * Input Args:
- * vm - Virtual Machine
- * cmd - Ioctl number
- * arg - Argument to pass to the ioctl
- *
- * Return: None
- *
- * Issues an arbitrary ioctl on a VM fd.
- */
-void vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg)
-{
- int ret;
-
- ret = __vm_ioctl(vm, cmd, arg);
- TEST_ASSERT(ret == 0, "vm ioctl %lu failed, rc: %i errno: %i (%s)",
- cmd, ret, errno, strerror(errno));
-}
-
int __vm_ioctl(struct kvm_vm *vm, unsigned long cmd, void *arg)
{
return ioctl(vm->fd, cmd, arg);
}

+void _vm_ioctl(struct kvm_vm *vm, unsigned long cmd, const char *name, void *arg)
+{
+ int ret = __vm_ioctl(vm, cmd, arg);
+
+ TEST_ASSERT(!ret, __KVM_IOCTL_ERROR(name, ret));
+}
+
/*
* KVM system ioctl
*
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:29:58

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 046/105] KVM: selftests: Convert kvm_pv_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../selftests/kvm/x86_64/kvm_pv_test.c | 25 ++++++++-----------
1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
index 04ed975662c9..cce9016e31a7 100644
--- a/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
+++ b/tools/testing/selftests/kvm/x86_64/kvm_pv_test.c
@@ -171,24 +171,18 @@ static void handle_abort(struct ucall *uc)
__FILE__, uc->args[1]);
}

-#define VCPU_ID 0
-
-static void enter_guest(struct kvm_vm *vm)
+static void enter_guest(struct kvm_vcpu *vcpu)
{
- struct kvm_run *run;
+ struct kvm_run *run = vcpu->run;
struct ucall uc;
- int r;
-
- run = vcpu_state(vm, VCPU_ID);

while (true) {
- r = _vcpu_run(vm, VCPU_ID);
- TEST_ASSERT(!r, "vcpu_run failed: %d\n", r);
+ vcpu_run(vcpu->vm, vcpu->id);
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"unexpected exit reason: %u (%s)",
run->exit_reason, exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vcpu->vm, vcpu->id, &uc)) {
case UCALL_PR_MSR:
pr_msr(&uc);
break;
@@ -208,6 +202,7 @@ int main(void)
{
struct kvm_enable_cap cap = {0};
struct kvm_cpuid2 *best;
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;

if (!kvm_check_cap(KVM_CAP_ENFORCE_PV_FEATURE_CPUID)) {
@@ -215,20 +210,20 @@ int main(void)
exit(KSFT_SKIP);
}

- vm = vm_create_default(VCPU_ID, 0, guest_main);
+ vm = vm_create_with_one_vcpu(&vcpu, guest_main);

cap.cap = KVM_CAP_ENFORCE_PV_FEATURE_CPUID;
cap.args[0] = 1;
- vcpu_enable_cap(vm, VCPU_ID, &cap);
+ vcpu_enable_cap(vm, vcpu->id, &cap);

best = kvm_get_supported_cpuid();
clear_kvm_cpuid_features(best);
- vcpu_set_cpuid(vm, VCPU_ID, best);
+ vcpu_set_cpuid(vm, vcpu->id, best);

vm_init_descriptor_tables(vm);
- vcpu_init_descriptor_tables(vm, VCPU_ID);
+ vcpu_init_descriptor_tables(vm, vcpu->id);
vm_install_exception_handler(vm, GP_VECTOR, guest_gp_handler);

- enter_guest(vm);
+ enter_guest(vcpu);
kvm_vm_free(vm);
}
--
2.35.1.723.g4982287a31-goog

2022-03-11 23:33:56

by Sean Christopherson

[permalink] [raw]
Subject: [RFC PATCH 061/105] KVM: selftests: Convert emulator_error_test away from VCPU_ID

Signed-off-by: Sean Christopherson <[email protected]>
---
.../kvm/x86_64/emulator_error_test.c | 65 ++++++++-----------
1 file changed, 28 insertions(+), 37 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/emulator_error_test.c b/tools/testing/selftests/kvm/x86_64/emulator_error_test.c
index f070ff0224fa..77b302f653a8 100644
--- a/tools/testing/selftests/kvm/x86_64/emulator_error_test.c
+++ b/tools/testing/selftests/kvm/x86_64/emulator_error_test.c
@@ -11,7 +11,6 @@
#include "kvm_util.h"
#include "vmx.h"

-#define VCPU_ID 1
#define PAGE_SIZE 4096
#define MAXPHYADDR 36

@@ -28,14 +27,6 @@ static void guest_code(void)
GUEST_DONE();
}

-static void run_guest(struct kvm_vm *vm)
-{
- int rc;
-
- rc = _vcpu_run(vm, VCPU_ID);
- TEST_ASSERT(rc == 0, "vcpu_run failed: %d\n", rc);
-}
-
/*
* Accessors to get R/M, REG, and Mod bits described in the SDM vol 2,
* figure 2-2 "Table Interpretation of ModR/M Byte (C8H)".
@@ -57,9 +48,9 @@ static bool is_flds(uint8_t *insn_bytes, uint8_t insn_size)
GET_RM(insn_bytes[1]) != 0x5;
}

-static void process_exit_on_emulation_error(struct kvm_vm *vm)
+static void process_exit_on_emulation_error(struct kvm_vcpu *vcpu)
{
- struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ struct kvm_run *run = vcpu->run;
struct kvm_regs regs;
uint8_t *insn_bytes;
uint8_t insn_size;
@@ -93,50 +84,49 @@ static void process_exit_on_emulation_error(struct kvm_vm *vm)
* contained an flds instruction that is 2-bytes in
* length (ie: no prefix, no SIB, no displacement).
*/
- vcpu_regs_get(vm, VCPU_ID, &regs);
+ vcpu_regs_get(vcpu->vm, vcpu->id, &regs);
regs.rip += 2;
- vcpu_regs_set(vm, VCPU_ID, &regs);
+ vcpu_regs_set(vcpu->vm, vcpu->id, &regs);
}
}
}

-static void do_guest_assert(struct kvm_vm *vm, struct ucall *uc)
+static void do_guest_assert(struct ucall *uc)
{
TEST_FAIL("%s at %s:%ld", (const char *)uc->args[0], __FILE__,
uc->args[1]);
}

-static void check_for_guest_assert(struct kvm_vm *vm)
+static void check_for_guest_assert(struct kvm_vcpu *vcpu)
{
- struct kvm_run *run = vcpu_state(vm, VCPU_ID);
struct ucall uc;

- if (run->exit_reason == KVM_EXIT_IO &&
- get_ucall(vm, VCPU_ID, &uc) == UCALL_ABORT) {
- do_guest_assert(vm, &uc);
+ if (vcpu->run->exit_reason == KVM_EXIT_IO &&
+ get_ucall(vcpu->vm, vcpu->id, &uc) == UCALL_ABORT) {
+ do_guest_assert(&uc);
}
}

-static void process_ucall_done(struct kvm_vm *vm)
+static void process_ucall_done(struct kvm_vcpu *vcpu)
{
- struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ struct kvm_run *run = vcpu->run;
struct ucall uc;

- check_for_guest_assert(vm);
+ check_for_guest_assert(vcpu);

TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
"Unexpected exit reason: %u (%s)",
run->exit_reason,
exit_reason_str(run->exit_reason));

- TEST_ASSERT(get_ucall(vm, VCPU_ID, &uc) == UCALL_DONE,
+ TEST_ASSERT(get_ucall(vcpu->vm, vcpu->id, &uc) == UCALL_DONE,
"Unexpected ucall command: %lu, expected UCALL_DONE (%d)",
uc.cmd, UCALL_DONE);
}

-static uint64_t process_ucall(struct kvm_vm *vm)
+static uint64_t process_ucall(struct kvm_vcpu *vcpu)
{
- struct kvm_run *run = vcpu_state(vm, VCPU_ID);
+ struct kvm_run *run = vcpu->run;
struct ucall uc;

TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
@@ -144,14 +134,14 @@ static uint64_t process_ucall(struct kvm_vm *vm)
run->exit_reason,
exit_reason_str(run->exit_reason));

- switch (get_ucall(vm, VCPU_ID, &uc)) {
+ switch (get_ucall(vcpu->vm, vcpu->id, &uc)) {
case UCALL_SYNC:
break;
case UCALL_ABORT:
- do_guest_assert(vm, &uc);
+ do_guest_assert(&uc);
break;
case UCALL_DONE:
- process_ucall_done(vm);
+ process_ucall_done(vcpu);
break;
default:
TEST_ASSERT(false, "Unexpected ucall");
@@ -168,6 +158,7 @@ int main(int argc, char *argv[])
};
struct kvm_cpuid_entry2 *entry;
struct kvm_cpuid2 *cpuid;
+ struct kvm_vcpu *vcpu;
struct kvm_vm *vm;
uint64_t gpa, pte;
uint64_t *hva;
@@ -176,20 +167,20 @@ int main(int argc, char *argv[])
/* Tell stdout not to buffer its content */
setbuf(stdout, NULL);

- vm = vm_create_default(VCPU_ID, 0, guest_code);
-
if (!kvm_check_cap(KVM_CAP_SMALLER_MAXPHYADDR)) {
printf("module parameter 'allow_smaller_maxphyaddr' is not set. Skipping test.\n");
return 0;
}

+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
+
cpuid = kvm_get_supported_cpuid();

entry = kvm_get_supported_cpuid_index(0x80000008, 0);
entry->eax = (entry->eax & 0xffffff00) | MAXPHYADDR;
set_cpuid(cpuid, entry);

- vcpu_set_cpuid(vm, VCPU_ID, cpuid);
+ vcpu_set_cpuid(vm, vcpu->id, cpuid);

rc = kvm_check_cap(KVM_CAP_EXIT_ON_EMULATION_FAILURE);
TEST_ASSERT(rc, "KVM_CAP_EXIT_ON_EMULATION_FAILURE is unavailable");
@@ -204,14 +195,14 @@ int main(int argc, char *argv[])
virt_map(vm, MEM_REGION_GVA, MEM_REGION_GPA, 1);
hva = addr_gpa2hva(vm, MEM_REGION_GPA);
memset(hva, 0, PAGE_SIZE);
- pte = vm_get_page_table_entry(vm, VCPU_ID, MEM_REGION_GVA);
- vm_set_page_table_entry(vm, VCPU_ID, MEM_REGION_GVA, pte | (1ull << 36));
+ pte = vm_get_page_table_entry(vm, vcpu->id, MEM_REGION_GVA);
+ vm_set_page_table_entry(vm, vcpu->id, MEM_REGION_GVA, pte | (1ull << 36));

- run_guest(vm);
- process_exit_on_emulation_error(vm);
- run_guest(vm);
+ vcpu_run(vm, vcpu->id);
+ process_exit_on_emulation_error(vcpu);
+ vcpu_run(vm, vcpu->id);

- TEST_ASSERT(process_ucall(vm) == UCALL_DONE, "Expected UCALL_DONE");
+ TEST_ASSERT(process_ucall(vcpu) == UCALL_DONE, "Expected UCALL_DONE");

kvm_vm_free(vm);

--
2.35.1.723.g4982287a31-goog

2022-03-14 12:36:22

by Vitaly Kuznetsov

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

Sean Christopherson <[email protected]> writes:

> First off, hopefully I didn't just spam you with 106 emails. In theory,
> unless you're subscribed to LKML, you should see only the cover letter
> and everything else should be on lore if you want to pull down the mbox
> (instead of saying "LOL, 105 patches!?!?", or maybe after you say
> that).

I would not complain at all if next time you cc kvm@ mailing list on all
patches too, it would simplify my routine a bit (or just Cc: me if
others object).

>
> This is a (very) early RFC for overhauling KVM's selftests APIs. It's
> compile tested only (maybe), there are no changelogs, etc...
>
> My end goal with an overhaul is to get to a state where adding new
> features and writing tests is less painful/disgusting (I feel dirty every
> time I copy+paste VCPU_ID). I opted to directly send only the cover
> letter because most of the individual patches aren't all that interesting,
> there's still 46 patches even if the per-test conversions are omitted, and
> it's the final state that I really care about and want to discuss.
>
> The overarching theme of my take on where to go with selftests is to stop
> treating tests like second class citizens. Stop hiding vcpu, kvm_vm, etc...
> There's no sensitive data/constructs, and the encapsulation has led to
> really, really bad and difficult to maintain code. E.g. Want to call a
> vCPU ioctl()? Hope you have the VM...

Initially, there was an attempt to make some sort of separation between
'internal' and 'external' APIs in KVM selftests but every new selftest I
write proves this separation wrong and I have to either hack-around
something or export some previously-internal APIs. My suggestion would
be to eliminate this separation and just make everything available to
tests.

Another thing is TEST_ASSERT()s inside library routines. Generally,
these are helpful as one doesn't need to check the return value. In some
cases, however, we'd like to check that something fails and then the
usual way seems to be creating a pair of functions like:

int __do_something()
{
int r = try_doing_something();

return r;
}

void do_something()
{
int r = __do_something()
TEST_ASSERT(r == 0, "Doing something failed! %d", r);
}

This works but maybe there's a better way?

FWIW, I've looked at some of the tests which are more familiar to me
(evmcs_test, hyperv_features, ...) and the end result looks much better
indeed, thanks! I have a couple more new tests in the queue (Hyper-V IPI
and TLB flush, see "KVM: x86: hyper-v: Fine-grained TLB flush + Direct
TLB flush feature"), we'll have to syncronize one way or another.

>
> The other theme in the rework is to deduplicate code and try to set us
> up for success in the future. E.g. provide macros/helpers instead of
> spamming CTRL-C => CTRL-V (see the -700 LoC).

You'll have to check with test authors that none of them get paid for
LoC by their respective employers :-)

>
> I was hoping to get this into a less shabby state before posting, but I'm
> I'm going to be OOO for the next few weeks and want to get the ball rolling
> instead of waiting another month or so.
>
> Based on an older version of kvm/queue. The full thing is also on github:
>
> https://github.com/sean-jc/linux.git x86/selftests_overhaul
>
> Cc: [email protected]
> Cc: Paolo Bonzini <[email protected]>
> Cc: Vitaly Kuznetsov <[email protected]>
> Cc: Wanpeng Li <[email protected]>
> Cc: Jim Mattson <[email protected]>
> Cc: Joerg Roedel <[email protected]>
> Cc: Andrew Jones <[email protected]>
> Cc: Thomas Huth <[email protected]>
> Cc: Janosch Frank <[email protected]>
> Cc: Claudio Imbrenda <[email protected]>
> Cc: David Hildenbrand <[email protected]>
> Cc: David Matlack <[email protected]>
> Cc: Ben Gardon <[email protected]>
> Cc: Oliver Upton <[email protected]>
>
> Sean Christopherson (105):
> KVM: selftests: Fix buggy check in test_v3_new_redist_regions()
> KVM: selftests: Always open VM file descriptors with O_RDWR
> KVM: selftest: Add another underscore to inner ioctl helpers
> KVM: selftests: Make vcpu_ioctl() a wrapper to pretty print ioctl name
> KVM: selftests: Drop @mode from common vm_create() helper
> KVM: selftests: Split vcpu_set_nested_state() into two helpers
> KVM: selftests: Add hyperv_svm_test test binary to .gitignore
> KVM: sefltests: Use vcpu_ioctl() and __vcpu_ioctl() helpers
> KVM: selftests: Add __vcpu_run() helper
> KVM: selftests: Use vcpu_access_device_attr() in arm64 code
> KVM: selftests: Remove vcpu_get_fd()
> KVM: selftests: Add vcpu_get() to retrieve and assert on vCPU
> existence
> KVM: selftests: Make vm_ioctl() a wrapper to pretty print ioctl name
> KVM: sefltests: Use vm_ioctl() and __vm_ioctl() helpers
> KVM: selftests: Make kvm_ioctl() a wrapper to pretty print ioctl name
> KVM: selftests: Use kvm_ioctl() helpers
> KVM: selftests: Make x86-64's register dump helpers static
> KVM: selftests: Get rid of kvm_util_internal.h
> KVM: selftests: Use KVM_IOCTL_ERROR() for one-off arm64 ioctls
> KVM: selftests: Drop @test param from kvm_create_device()
> KVM: selftests: Move KVM_CREATE_DEVICE_TEST code to separate helper
> KVM: selftests: Multiplex return code and fd in __kvm_create_device()
> KVM: selftests: Rename KVM_HAS_DEVICE_ATTR helpers for consistency
> KVM: selftests: Drop 'int' return from asserting *_device_has_attr()
> KVM: selftests: Split get/set device_attr helpers
> KVM: selftests: Add a VM backpointer to 'struct vcpu'
> KVM: selftests: Add vm_create_*() variants to expose/return 'struct
> vcpu'
> KVM: selftests: Rename vcpu.state => vcpu.run
> KVM: selftests: Rename 'struct vcpu' to 'struct kvm_vcpu'
> KVM: selftests: Return the created vCPU from vm_vcpu_add()
> KVM: selftests: Convert memslot_perf_test away from VCPU_ID
> KVM: selftests: Convert rseq_test away from VCPU_ID
> KVM: selftests: Convert xss_msr_test away from VCPU_ID
> KVM: selftests: Convert vmx_preemption_timer_test away from VCPU_ID
> KVM: selftests: Convert vmx_pmu_msrs_test away from VCPU_ID
> KVM: selftests: Convert vmx_set_nested_state_test away from VCPU_ID
> KVM: selftests: Convert vmx_tsc_adjust_test away from VCPU_ID
> KVM: selftests: Convert mmu_role_test away from VCPU_ID
> KVM: selftests: Convert pmu_event_filter_test away from VCPU_ID
> KVM: selftests: Convert smm_test away from VCPU_ID
> KVM: selftests: Convert state_test away from VCPU_ID
> KVM: selftests: Convert svm_int_ctl_test away from VCPU_ID
> KVM: selftests: Convert svm_vmcall_test away from VCPU_ID
> KVM: selftests: Convert sync_regs_test away from VCPU_ID
> KVM: selftests: Convert hyperv_cpuid away from VCPU_ID
> KVM: selftests: Convert kvm_pv_test away from VCPU_ID
> KVM: selftests: Convert platform_info_test away from VCPU_ID
> KVM: selftests: Convert vmx_nested_tsc_scaling_test away from VCPU_ID
> KVM: selftests: Convert set_sregs_test away from VCPU_ID
> KVM: selftests: Convert vmx_dirty_log_test away from VCPU_ID
> KVM: selftests: Convert vmx_close_while_nested_test away from VCPU_ID
> KVM: selftests: Convert vmx_apic_access_test away from VCPU_ID
> KVM: selftests: Convert userspace_msr_exit_test away from VCPU_ID
> KVM: selftests: Convert vmx_exception_with_invalid_guest_state away
> from VCPU_ID
> KVM: selftests: Convert tsc_msrs_test away from VCPU_ID
> KVM: selftests: Convert kvm_clock_test away from VCPU_ID
> KVM: selftests: Convert hyperv_svm_test away from VCPU_ID
> KVM: selftests: Convert hyperv_features away from VCPU_ID
> KVM: selftests: Convert hyperv_clock away from VCPU_ID
> KVM: selftests: Convert evmcs_test away from VCPU_ID
> KVM: selftests: Convert emulator_error_test away from VCPU_ID
> KVM: selftests: Convert debug_regs away from VCPU_ID
> KVM: selftests: Add proper helper for advancing RIP in debug_regs
> KVM: selftests: Convert amx_test away from VCPU_ID
> KVM: selftests: Convert cr4_cpuid_sync_test away from VCPU_ID
> KVM: selftests: Convert cpuid_test away from VCPU_ID
> KVM: selftests: Convert userspace_io_test away from VCPU_ID
> KVM: selftests: Convert vmx_invalid_nested_guest_state away from
> VCPU_ID
> KVM: selftests: Convert xen_vmcall_test away from VCPU_ID
> KVM: selftests: Convert xen_shinfo_test away from VCPU_ID
> KVM: selftests: Convert dirty_log_test away from VCPU_ID
> KVM: selftests: Convert set_memory_region_test away from VCPU_ID
> KVM: selftests: Convert system_counter_offset_test away from VCPU_ID
> KVM: selftests: Convert debug-exceptions away from VCPU_ID
> KVM: selftests: Convert vgic_irq.c include/aarch64/vgic.h
> lib/aarch64/vgic away from VCPU_ID
> KVM: selftests: Make arm64's guest_get_vcpuid() declaration arm64-only
> KVM: selftests: Move vm_is_unrestricted_guest() to x86-64
> KVM: selftests: Add "arch" to common utils that have arch
> implementations
> KVM: selftests: Return created vcpu from vm_vcpu_add_default()
> KVM: selftests: Rename vm_vcpu_add* helpers to better show
> relationships
> KVM: selftests: Convert set_boot_cpu_id away from VCPU_ID
> KVM: selftests: Convert psci_cpu_on_test away from VCPU_ID
> KVM: selftests: Convert hardware_disable_test away from VCPU_ID
> KVM: selftests: Add VM creation helper that "returns" vCPUs
> KVM: selftests: Convert steal_time away from VCPU_ID
> KVM: selftests: Convert arch_timer away from VCPU_ID
> KVM: selftests: Fix typo in vgic_init test
> KVM: selftests: Convert vgic_init away from
> vm_create_default_with_vcpus()
> KVM: selftests: Convert xapic_ipi_test away from *_VCPU_ID
> KVM: selftests: Convert sync_regs_test away from VCPU_ID
> KVM: selftests: Convert resets away from VCPU_ID
> KVM: selftests: Convert memop away from VCPU_ID
> KVM: selftests: Convert s390x/diag318_test_handler away from VCPU_ID
> KVM: selftests: Drop vm_create_default* helpers
> KVM: selftests: Drop vcpuids param from VM creators
> KVM: selftests: Convert kvm_page_table_test away from reliance on
> vcpu_id
> KVM: selftests: Convert kvm_binary_stats_test away from VCPU_ID
> KVM: selftests: Convert get-reg-list away from VCPU_ID
> KVM: selftests: Stop conflating vCPU index and ID in perf tests
> KVM: selftests: Remove vcpu_get() usage from dirty_log_test
> KVM: selftests: Require vCPU output array when creating VM with vCPUs
> KVM: selftest: Purge vm+vcpu_id == vcpu silliness
> KVM: selftests: Drop vcpu_get(), rename vcpu_find() => vcpu_exists()
> KVM: selftests: Remove vcpu_state() helper
> KVM: selftests: Open code and drop kvm_vm accessors
>
> tools/testing/selftests/kvm/.gitignore | 1 +
> .../selftests/kvm/aarch64/arch_timer.c | 68 +-
> .../selftests/kvm/aarch64/debug-exceptions.c | 17 +-
> .../selftests/kvm/aarch64/get-reg-list.c | 19 +-
> .../selftests/kvm/aarch64/psci_cpu_on_test.c | 22 +-
> .../testing/selftests/kvm/aarch64/vgic_init.c | 369 +++----
> .../testing/selftests/kvm/aarch64/vgic_irq.c | 30 +-
> .../selftests/kvm/access_tracking_perf_test.c | 81 +-
> .../selftests/kvm/demand_paging_test.c | 39 +-
> .../selftests/kvm/dirty_log_perf_test.c | 42 +-
> tools/testing/selftests/kvm/dirty_log_test.c | 80 +-
> .../selftests/kvm/hardware_disable_test.c | 27 +-
> .../selftests/kvm/include/aarch64/processor.h | 20 +-
> .../selftests/kvm/include/aarch64/vgic.h | 6 +-
> .../selftests/kvm/include/kvm_util_base.h | 677 ++++++++----
> .../selftests/kvm/include/perf_test_util.h | 5 +-
> .../selftests/kvm/include/riscv/processor.h | 8 +-
> .../selftests/kvm/include/ucall_common.h | 2 +-
> .../selftests/kvm/include/x86_64/evmcs.h | 2 +-
> .../selftests/kvm/include/x86_64/processor.h | 52 +-
> .../selftests/kvm/kvm_binary_stats_test.c | 27 +-
> .../selftests/kvm/kvm_create_max_vcpus.c | 4 +-
> .../selftests/kvm/kvm_page_table_test.c | 66 +-
> .../selftests/kvm/lib/aarch64/processor.c | 79 +-
> .../testing/selftests/kvm/lib/aarch64/ucall.c | 9 +-
> .../testing/selftests/kvm/lib/aarch64/vgic.c | 44 +-
> tools/testing/selftests/kvm/lib/elf.c | 1 -
> tools/testing/selftests/kvm/lib/guest_modes.c | 6 +-
> tools/testing/selftests/kvm/lib/kvm_util.c | 981 +++---------------
> .../selftests/kvm/lib/kvm_util_internal.h | 128 ---
> .../selftests/kvm/lib/perf_test_util.c | 84 +-
> .../selftests/kvm/lib/riscv/processor.c | 110 +-
> tools/testing/selftests/kvm/lib/riscv/ucall.c | 7 +-
> .../kvm/lib/s390x/diag318_test_handler.c | 9 +-
> .../selftests/kvm/lib/s390x/processor.c | 44 +-
> tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 +-
> .../selftests/kvm/lib/x86_64/processor.c | 311 ++----
> tools/testing/selftests/kvm/lib/x86_64/svm.c | 1 -
> .../testing/selftests/kvm/lib/x86_64/ucall.c | 10 +-
> tools/testing/selftests/kvm/lib/x86_64/vmx.c | 5 +-
> .../kvm/memslot_modification_stress_test.c | 13 +-
> .../testing/selftests/kvm/memslot_perf_test.c | 28 +-
> tools/testing/selftests/kvm/rseq_test.c | 9 +-
> tools/testing/selftests/kvm/s390x/memop.c | 31 +-
> tools/testing/selftests/kvm/s390x/resets.c | 137 +--
> .../selftests/kvm/s390x/sync_regs_test.c | 37 +-
> .../selftests/kvm/set_memory_region_test.c | 45 +-
> tools/testing/selftests/kvm/steal_time.c | 120 +--
> .../kvm/system_counter_offset_test.c | 29 +-
> tools/testing/selftests/kvm/x86_64/amx_test.c | 33 +-
> .../testing/selftests/kvm/x86_64/cpuid_test.c | 29 +-
> .../kvm/x86_64/cr4_cpuid_sync_test.c | 17 +-
> .../testing/selftests/kvm/x86_64/debug_regs.c | 72 +-
> .../kvm/x86_64/emulator_error_test.c | 65 +-
> .../testing/selftests/kvm/x86_64/evmcs_test.c | 51 +-
> .../kvm/x86_64/get_msr_index_features.c | 16 +-
> .../selftests/kvm/x86_64/hyperv_clock.c | 25 +-
> .../selftests/kvm/x86_64/hyperv_cpuid.c | 25 +-
> .../selftests/kvm/x86_64/hyperv_features.c | 51 +-
> .../selftests/kvm/x86_64/hyperv_svm_test.c | 14 +-
> .../selftests/kvm/x86_64/kvm_clock_test.c | 23 +-
> .../selftests/kvm/x86_64/kvm_pv_test.c | 25 +-
> .../selftests/kvm/x86_64/mmio_warning_test.c | 6 +-
> .../selftests/kvm/x86_64/mmu_role_test.c | 20 +-
> .../selftests/kvm/x86_64/platform_info_test.c | 34 +-
> .../kvm/x86_64/pmu_event_filter_test.c | 60 +-
> .../selftests/kvm/x86_64/set_boot_cpu_id.c | 87 +-
> .../selftests/kvm/x86_64/set_sregs_test.c | 47 +-
> .../selftests/kvm/x86_64/sev_migrate_tests.c | 17 +-
> tools/testing/selftests/kvm/x86_64/smm_test.c | 37 +-
> .../testing/selftests/kvm/x86_64/state_test.c | 29 +-
> .../selftests/kvm/x86_64/svm_int_ctl_test.c | 21 +-
> .../selftests/kvm/x86_64/svm_vmcall_test.c | 16 +-
> .../selftests/kvm/x86_64/sync_regs_test.c | 52 +-
> .../selftests/kvm/x86_64/tsc_msrs_test.c | 35 +-
> .../selftests/kvm/x86_64/userspace_io_test.c | 18 +-
> .../kvm/x86_64/userspace_msr_exit_test.c | 165 ++-
> .../kvm/x86_64/vmx_apic_access_test.c | 18 +-
> .../kvm/x86_64/vmx_close_while_nested_test.c | 17 +-
> .../selftests/kvm/x86_64/vmx_dirty_log_test.c | 13 +-
> .../vmx_exception_with_invalid_guest_state.c | 62 +-
> .../x86_64/vmx_invalid_nested_guest_state.c | 18 +-
> .../kvm/x86_64/vmx_nested_tsc_scaling_test.c | 19 +-
> .../selftests/kvm/x86_64/vmx_pmu_msrs_test.c | 25 +-
> .../kvm/x86_64/vmx_preemption_timer_test.c | 30 +-
> .../kvm/x86_64/vmx_set_nested_state_test.c | 86 +-
> .../kvm/x86_64/vmx_tsc_adjust_test.c | 12 +-
> .../selftests/kvm/x86_64/xapic_ipi_test.c | 48 +-
> .../selftests/kvm/x86_64/xen_shinfo_test.c | 35 +-
> .../selftests/kvm/x86_64/xen_vmcall_test.c | 17 +-
> .../selftests/kvm/x86_64/xss_msr_test.c | 10 +-
> 91 files changed, 2363 insertions(+), 3087 deletions(-)
> delete mode 100644 tools/testing/selftests/kvm/lib/kvm_util_internal.h
>
>
> base-commit: f6ae04ddb347f526b4620d1053690ecf1f87d77f

--
Vitaly

2022-03-16 06:16:13

by Oliver Upton

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

On Mon, Mar 14, 2022 at 12:06:53PM +0100, Andrew Jones wrote:
> On Fri, Mar 11, 2022 at 05:49:11AM +0000, Sean Christopherson wrote:
> > First off, hopefully I didn't just spam you with 106 emails. In theory,
> > unless you're subscribed to LKML, you should see only the cover letter
> > and everything else should be on lore if you want to pull down the mbox
> > (instead of saying "LOL, 105 patches!?!?", or maybe after you say that).
> >
> > This is a (very) early RFC for overhauling KVM's selftests APIs. It's
> > compile tested only (maybe), there are no changelogs, etc...
> >
> > My end goal with an overhaul is to get to a state where adding new
> > features and writing tests is less painful/disgusting (I feel dirty every
> > time I copy+paste VCPU_ID). I opted to directly send only the cover
> > letter because most of the individual patches aren't all that interesting,
> > there's still 46 patches even if the per-test conversions are omitted, and
> > it's the final state that I really care about and want to discuss.
> >
> > The overarching theme of my take on where to go with selftests is to stop
> > treating tests like second class citizens. Stop hiding vcpu, kvm_vm, etc...
> > There's no sensitive data/constructs, and the encapsulation has led to
> > really, really bad and difficult to maintain code. E.g. Want to call a
> > vCPU ioctl()? Hope you have the VM...
>
> Ack to dropping the privateness of structs.
>
> >
> > The other theme in the rework is to deduplicate code and try to set us
> > up for success in the future. E.g. provide macros/helpers instead of
> > spamming CTRL-C => CTRL-V (see the -700 LoC).
>
> Ack to more helper functions. I'm not sure what the best way to document
> or provide examples for the API is though. Currently we mostly rely on
> test writers to read other tests (I suppose the function headers help a
> bit, but, IMO, not much). Maybe we need a heavily commented example.c
> that can help test writers get started, along with better API function
> descriptions for anything exported from the lib.
>

+1. Definitely guilty of copy/pasting a test then tweaking to fit the
problem I'm trying to solve. A barebones example would be helpful.

Haven't looked at the patches yet, but one of my whines about the
selftests is that every test winds up explicitly handling exit reasons
that percolate up from the libraries. Perhaps some helpers around ABORTs
and the like would be useful (and maybe Sean already did this!)

> >
> > I was hoping to get this into a less shabby state before posting, but I'm
> > I'm going to be OOO for the next few weeks and want to get the ball rolling
> > instead of waiting another month or so.
>
> Ideas look good to me, but I'll wait for the cleaned up series posted to
> the KVM ML to review it. Also, I see at least patch 1/105 is a fix. It'd
> be nice to post all fixes separately so they get in sooner than later.
>
> Oh, some of the renaming doesn't look all that important to me, like
> prefixing with kvm_ or adding _arch_, but I don't have strong preferences
> on the names. Also, for the _arch_ functions it'd be nice to create
> common, weak functions which the arch must override. The common function
> would just assert. That should help people who want to port to other
> architectures determine what they need to implement first. And, for
> anything which an arch can optionally adopt a common implementation,
> *not* naming the common function with _arch_, but still defining it as
> weak, would make sense to me too.

I think it may make more sense to only define optional functions as
weak and let the compiler do the screaming for the required ones. Only
discovering that functions are missing at runtime could be annoying if
you're cross-compiling and running on a separate host with a different
architecture.

--
Oliver

2022-03-16 23:20:36

by Andrew Jones

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

On Mon, Mar 14, 2022 at 05:56:53PM +0000, Oliver Upton wrote:
>
> I think it may make more sense to only define optional functions as
> weak and let the compiler do the screaming for the required ones. Only
> discovering that functions are missing at runtime could be annoying if
> you're cross-compiling and running on a separate host with a different
> architecture.
>

Ah, indeed, no reason to push the lack of required arch functions to
runtime detection, compile time is much better. And, in those cases,
the _arch_ naming will also provide a nice hint that one must implement
it in arch specific code.

Thanks,
drew

2022-03-17 06:40:53

by Andrew Jones

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

On Fri, Mar 11, 2022 at 05:49:11AM +0000, Sean Christopherson wrote:
> First off, hopefully I didn't just spam you with 106 emails. In theory,
> unless you're subscribed to LKML, you should see only the cover letter
> and everything else should be on lore if you want to pull down the mbox
> (instead of saying "LOL, 105 patches!?!?", or maybe after you say that).
>
> This is a (very) early RFC for overhauling KVM's selftests APIs. It's
> compile tested only (maybe), there are no changelogs, etc...
>
> My end goal with an overhaul is to get to a state where adding new
> features and writing tests is less painful/disgusting (I feel dirty every
> time I copy+paste VCPU_ID). I opted to directly send only the cover
> letter because most of the individual patches aren't all that interesting,
> there's still 46 patches even if the per-test conversions are omitted, and
> it's the final state that I really care about and want to discuss.
>
> The overarching theme of my take on where to go with selftests is to stop
> treating tests like second class citizens. Stop hiding vcpu, kvm_vm, etc...
> There's no sensitive data/constructs, and the encapsulation has led to
> really, really bad and difficult to maintain code. E.g. Want to call a
> vCPU ioctl()? Hope you have the VM...

Ack to dropping the privateness of structs.

>
> The other theme in the rework is to deduplicate code and try to set us
> up for success in the future. E.g. provide macros/helpers instead of
> spamming CTRL-C => CTRL-V (see the -700 LoC).

Ack to more helper functions. I'm not sure what the best way to document
or provide examples for the API is though. Currently we mostly rely on
test writers to read other tests (I suppose the function headers help a
bit, but, IMO, not much). Maybe we need a heavily commented example.c
that can help test writers get started, along with better API function
descriptions for anything exported from the lib.

>
> I was hoping to get this into a less shabby state before posting, but I'm
> I'm going to be OOO for the next few weeks and want to get the ball rolling
> instead of waiting another month or so.

Ideas look good to me, but I'll wait for the cleaned up series posted to
the KVM ML to review it. Also, I see at least patch 1/105 is a fix. It'd
be nice to post all fixes separately so they get in sooner than later.

Oh, some of the renaming doesn't look all that important to me, like
prefixing with kvm_ or adding _arch_, but I don't have strong preferences
on the names. Also, for the _arch_ functions it'd be nice to create
common, weak functions which the arch must override. The common function
would just assert. That should help people who want to port to other
architectures determine what they need to implement first. And, for
anything which an arch can optionally adopt a common implementation,
*not* naming the common function with _arch_, but still defining it as
weak, would make sense to me too.

Thanks,
drew

2022-03-28 21:57:29

by Sean Christopherson

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

On Mon, Mar 14, 2022, Andrew Jones wrote:
> Also, I see at least patch 1/105 is a fix. It'd be nice to post all fixes
> separately so they get in sooner than later.

Yeah, and I'm pretty sure there's at least one other arm64 bug fix buried in the
series. I'll get those extracted and posted separately.

2022-04-06 18:29:05

by David Matlack

[permalink] [raw]
Subject: Re: [RFC PATCH 000/105] KVM: selftests: Overhaul APIs, purge VCPU_ID

On Thu, Mar 10, 2022 at 9:51 PM Sean Christopherson <[email protected]> wrote:
>
> First off, hopefully I didn't just spam you with 106 emails. In theory,
> unless you're subscribed to LKML, you should see only the cover letter
> and everything else should be on lore if you want to pull down the mbox
> (instead of saying "LOL, 105 patches!?!?", or maybe after you say that).

FWIW I'm fine with receiving a large number of patches and it would
simplify my workflow for reviewing (even if just at a high level).

>
> This is a (very) early RFC for overhauling KVM's selftests APIs. It's
> compile tested only (maybe), there are no changelogs, etc...
>
> My end goal with an overhaul is to get to a state where adding new
> features and writing tests is less painful/disgusting (I feel dirty every
> time I copy+paste VCPU_ID). I opted to directly send only the cover
> letter because most of the individual patches aren't all that interesting,
> there's still 46 patches even if the per-test conversions are omitted, and
> it's the final state that I really care about and want to discuss.
>
> The overarching theme of my take on where to go with selftests is to stop
> treating tests like second class citizens. Stop hiding vcpu, kvm_vm, etc...
> There's no sensitive data/constructs, and the encapsulation has led to
> really, really bad and difficult to maintain code. E.g. Want to call a
> vCPU ioctl()? Hope you have the VM...
>
> The other theme in the rework is to deduplicate code and try to set us
> up for success in the future. E.g. provide macros/helpers instead of
> spamming CTRL-C => CTRL-V (see the -700 LoC).
>
> I was hoping to get this into a less shabby state before posting, but I'm
> I'm going to be OOO for the next few weeks and want to get the ball rolling
> instead of waiting another month or so.

Honestly it looks great. Especially "KVM: selftest: Purge vm+vcpu_id
== vcpu silliness". I'm sure we can quibble over some specific details
in the patches but given the size of the refactor I'd love to get this
in so we can start building on top of it. Otherwise it's going to
bitrot real fast.

>
> Based on an older version of kvm/queue. The full thing is also on github:
>
> https://github.com/sean-jc/linux.git x86/selftests_overhaul
>
> Cc: [email protected]
> Cc: Paolo Bonzini <[email protected]>
> Cc: Vitaly Kuznetsov <[email protected]>
> Cc: Wanpeng Li <[email protected]>
> Cc: Jim Mattson <[email protected]>
> Cc: Joerg Roedel <[email protected]>
> Cc: Andrew Jones <[email protected]>
> Cc: Thomas Huth <[email protected]>
> Cc: Janosch Frank <[email protected]>
> Cc: Claudio Imbrenda <[email protected]>
> Cc: David Hildenbrand <[email protected]>
> Cc: David Matlack <[email protected]>
> Cc: Ben Gardon <[email protected]>
> Cc: Oliver Upton <[email protected]>
>
> Sean Christopherson (105):
> KVM: selftests: Fix buggy check in test_v3_new_redist_regions()
> KVM: selftests: Always open VM file descriptors with O_RDWR
> KVM: selftest: Add another underscore to inner ioctl helpers
> KVM: selftests: Make vcpu_ioctl() a wrapper to pretty print ioctl name
> KVM: selftests: Drop @mode from common vm_create() helper
> KVM: selftests: Split vcpu_set_nested_state() into two helpers
> KVM: selftests: Add hyperv_svm_test test binary to .gitignore
> KVM: sefltests: Use vcpu_ioctl() and __vcpu_ioctl() helpers
> KVM: selftests: Add __vcpu_run() helper
> KVM: selftests: Use vcpu_access_device_attr() in arm64 code
> KVM: selftests: Remove vcpu_get_fd()
> KVM: selftests: Add vcpu_get() to retrieve and assert on vCPU
> existence
> KVM: selftests: Make vm_ioctl() a wrapper to pretty print ioctl name
> KVM: sefltests: Use vm_ioctl() and __vm_ioctl() helpers
> KVM: selftests: Make kvm_ioctl() a wrapper to pretty print ioctl name
> KVM: selftests: Use kvm_ioctl() helpers
> KVM: selftests: Make x86-64's register dump helpers static
> KVM: selftests: Get rid of kvm_util_internal.h
> KVM: selftests: Use KVM_IOCTL_ERROR() for one-off arm64 ioctls
> KVM: selftests: Drop @test param from kvm_create_device()
> KVM: selftests: Move KVM_CREATE_DEVICE_TEST code to separate helper
> KVM: selftests: Multiplex return code and fd in __kvm_create_device()
> KVM: selftests: Rename KVM_HAS_DEVICE_ATTR helpers for consistency
> KVM: selftests: Drop 'int' return from asserting *_device_has_attr()
> KVM: selftests: Split get/set device_attr helpers
> KVM: selftests: Add a VM backpointer to 'struct vcpu'
> KVM: selftests: Add vm_create_*() variants to expose/return 'struct
> vcpu'
> KVM: selftests: Rename vcpu.state => vcpu.run
> KVM: selftests: Rename 'struct vcpu' to 'struct kvm_vcpu'
> KVM: selftests: Return the created vCPU from vm_vcpu_add()
> KVM: selftests: Convert memslot_perf_test away from VCPU_ID
> KVM: selftests: Convert rseq_test away from VCPU_ID
> KVM: selftests: Convert xss_msr_test away from VCPU_ID
> KVM: selftests: Convert vmx_preemption_timer_test away from VCPU_ID
> KVM: selftests: Convert vmx_pmu_msrs_test away from VCPU_ID
> KVM: selftests: Convert vmx_set_nested_state_test away from VCPU_ID
> KVM: selftests: Convert vmx_tsc_adjust_test away from VCPU_ID
> KVM: selftests: Convert mmu_role_test away from VCPU_ID
> KVM: selftests: Convert pmu_event_filter_test away from VCPU_ID
> KVM: selftests: Convert smm_test away from VCPU_ID
> KVM: selftests: Convert state_test away from VCPU_ID
> KVM: selftests: Convert svm_int_ctl_test away from VCPU_ID
> KVM: selftests: Convert svm_vmcall_test away from VCPU_ID
> KVM: selftests: Convert sync_regs_test away from VCPU_ID
> KVM: selftests: Convert hyperv_cpuid away from VCPU_ID
> KVM: selftests: Convert kvm_pv_test away from VCPU_ID
> KVM: selftests: Convert platform_info_test away from VCPU_ID
> KVM: selftests: Convert vmx_nested_tsc_scaling_test away from VCPU_ID
> KVM: selftests: Convert set_sregs_test away from VCPU_ID
> KVM: selftests: Convert vmx_dirty_log_test away from VCPU_ID
> KVM: selftests: Convert vmx_close_while_nested_test away from VCPU_ID
> KVM: selftests: Convert vmx_apic_access_test away from VCPU_ID
> KVM: selftests: Convert userspace_msr_exit_test away from VCPU_ID
> KVM: selftests: Convert vmx_exception_with_invalid_guest_state away
> from VCPU_ID
> KVM: selftests: Convert tsc_msrs_test away from VCPU_ID
> KVM: selftests: Convert kvm_clock_test away from VCPU_ID
> KVM: selftests: Convert hyperv_svm_test away from VCPU_ID
> KVM: selftests: Convert hyperv_features away from VCPU_ID
> KVM: selftests: Convert hyperv_clock away from VCPU_ID
> KVM: selftests: Convert evmcs_test away from VCPU_ID
> KVM: selftests: Convert emulator_error_test away from VCPU_ID
> KVM: selftests: Convert debug_regs away from VCPU_ID
> KVM: selftests: Add proper helper for advancing RIP in debug_regs
> KVM: selftests: Convert amx_test away from VCPU_ID
> KVM: selftests: Convert cr4_cpuid_sync_test away from VCPU_ID
> KVM: selftests: Convert cpuid_test away from VCPU_ID
> KVM: selftests: Convert userspace_io_test away from VCPU_ID
> KVM: selftests: Convert vmx_invalid_nested_guest_state away from
> VCPU_ID
> KVM: selftests: Convert xen_vmcall_test away from VCPU_ID
> KVM: selftests: Convert xen_shinfo_test away from VCPU_ID
> KVM: selftests: Convert dirty_log_test away from VCPU_ID
> KVM: selftests: Convert set_memory_region_test away from VCPU_ID
> KVM: selftests: Convert system_counter_offset_test away from VCPU_ID
> KVM: selftests: Convert debug-exceptions away from VCPU_ID
> KVM: selftests: Convert vgic_irq.c include/aarch64/vgic.h
> lib/aarch64/vgic away from VCPU_ID
> KVM: selftests: Make arm64's guest_get_vcpuid() declaration arm64-only
> KVM: selftests: Move vm_is_unrestricted_guest() to x86-64
> KVM: selftests: Add "arch" to common utils that have arch
> implementations
> KVM: selftests: Return created vcpu from vm_vcpu_add_default()
> KVM: selftests: Rename vm_vcpu_add* helpers to better show
> relationships
> KVM: selftests: Convert set_boot_cpu_id away from VCPU_ID
> KVM: selftests: Convert psci_cpu_on_test away from VCPU_ID
> KVM: selftests: Convert hardware_disable_test away from VCPU_ID
> KVM: selftests: Add VM creation helper that "returns" vCPUs
> KVM: selftests: Convert steal_time away from VCPU_ID
> KVM: selftests: Convert arch_timer away from VCPU_ID
> KVM: selftests: Fix typo in vgic_init test
> KVM: selftests: Convert vgic_init away from
> vm_create_default_with_vcpus()
> KVM: selftests: Convert xapic_ipi_test away from *_VCPU_ID
> KVM: selftests: Convert sync_regs_test away from VCPU_ID
> KVM: selftests: Convert resets away from VCPU_ID
> KVM: selftests: Convert memop away from VCPU_ID
> KVM: selftests: Convert s390x/diag318_test_handler away from VCPU_ID
> KVM: selftests: Drop vm_create_default* helpers
> KVM: selftests: Drop vcpuids param from VM creators
> KVM: selftests: Convert kvm_page_table_test away from reliance on
> vcpu_id
> KVM: selftests: Convert kvm_binary_stats_test away from VCPU_ID
> KVM: selftests: Convert get-reg-list away from VCPU_ID
> KVM: selftests: Stop conflating vCPU index and ID in perf tests
> KVM: selftests: Remove vcpu_get() usage from dirty_log_test
> KVM: selftests: Require vCPU output array when creating VM with vCPUs
> KVM: selftest: Purge vm+vcpu_id == vcpu silliness
> KVM: selftests: Drop vcpu_get(), rename vcpu_find() => vcpu_exists()
> KVM: selftests: Remove vcpu_state() helper
> KVM: selftests: Open code and drop kvm_vm accessors
>
> tools/testing/selftests/kvm/.gitignore | 1 +
> .../selftests/kvm/aarch64/arch_timer.c | 68 +-
> .../selftests/kvm/aarch64/debug-exceptions.c | 17 +-
> .../selftests/kvm/aarch64/get-reg-list.c | 19 +-
> .../selftests/kvm/aarch64/psci_cpu_on_test.c | 22 +-
> .../testing/selftests/kvm/aarch64/vgic_init.c | 369 +++----
> .../testing/selftests/kvm/aarch64/vgic_irq.c | 30 +-
> .../selftests/kvm/access_tracking_perf_test.c | 81 +-
> .../selftests/kvm/demand_paging_test.c | 39 +-
> .../selftests/kvm/dirty_log_perf_test.c | 42 +-
> tools/testing/selftests/kvm/dirty_log_test.c | 80 +-
> .../selftests/kvm/hardware_disable_test.c | 27 +-
> .../selftests/kvm/include/aarch64/processor.h | 20 +-
> .../selftests/kvm/include/aarch64/vgic.h | 6 +-
> .../selftests/kvm/include/kvm_util_base.h | 677 ++++++++----
> .../selftests/kvm/include/perf_test_util.h | 5 +-
> .../selftests/kvm/include/riscv/processor.h | 8 +-
> .../selftests/kvm/include/ucall_common.h | 2 +-
> .../selftests/kvm/include/x86_64/evmcs.h | 2 +-
> .../selftests/kvm/include/x86_64/processor.h | 52 +-
> .../selftests/kvm/kvm_binary_stats_test.c | 27 +-
> .../selftests/kvm/kvm_create_max_vcpus.c | 4 +-
> .../selftests/kvm/kvm_page_table_test.c | 66 +-
> .../selftests/kvm/lib/aarch64/processor.c | 79 +-
> .../testing/selftests/kvm/lib/aarch64/ucall.c | 9 +-
> .../testing/selftests/kvm/lib/aarch64/vgic.c | 44 +-
> tools/testing/selftests/kvm/lib/elf.c | 1 -
> tools/testing/selftests/kvm/lib/guest_modes.c | 6 +-
> tools/testing/selftests/kvm/lib/kvm_util.c | 981 +++---------------
> .../selftests/kvm/lib/kvm_util_internal.h | 128 ---
> .../selftests/kvm/lib/perf_test_util.c | 84 +-
> .../selftests/kvm/lib/riscv/processor.c | 110 +-
> tools/testing/selftests/kvm/lib/riscv/ucall.c | 7 +-
> .../kvm/lib/s390x/diag318_test_handler.c | 9 +-
> .../selftests/kvm/lib/s390x/processor.c | 44 +-
> tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 +-
> .../selftests/kvm/lib/x86_64/processor.c | 311 ++----
> tools/testing/selftests/kvm/lib/x86_64/svm.c | 1 -
> .../testing/selftests/kvm/lib/x86_64/ucall.c | 10 +-
> tools/testing/selftests/kvm/lib/x86_64/vmx.c | 5 +-
> .../kvm/memslot_modification_stress_test.c | 13 +-
> .../testing/selftests/kvm/memslot_perf_test.c | 28 +-
> tools/testing/selftests/kvm/rseq_test.c | 9 +-
> tools/testing/selftests/kvm/s390x/memop.c | 31 +-
> tools/testing/selftests/kvm/s390x/resets.c | 137 +--
> .../selftests/kvm/s390x/sync_regs_test.c | 37 +-
> .../selftests/kvm/set_memory_region_test.c | 45 +-
> tools/testing/selftests/kvm/steal_time.c | 120 +--
> .../kvm/system_counter_offset_test.c | 29 +-
> tools/testing/selftests/kvm/x86_64/amx_test.c | 33 +-
> .../testing/selftests/kvm/x86_64/cpuid_test.c | 29 +-
> .../kvm/x86_64/cr4_cpuid_sync_test.c | 17 +-
> .../testing/selftests/kvm/x86_64/debug_regs.c | 72 +-
> .../kvm/x86_64/emulator_error_test.c | 65 +-
> .../testing/selftests/kvm/x86_64/evmcs_test.c | 51 +-
> .../kvm/x86_64/get_msr_index_features.c | 16 +-
> .../selftests/kvm/x86_64/hyperv_clock.c | 25 +-
> .../selftests/kvm/x86_64/hyperv_cpuid.c | 25 +-
> .../selftests/kvm/x86_64/hyperv_features.c | 51 +-
> .../selftests/kvm/x86_64/hyperv_svm_test.c | 14 +-
> .../selftests/kvm/x86_64/kvm_clock_test.c | 23 +-
> .../selftests/kvm/x86_64/kvm_pv_test.c | 25 +-
> .../selftests/kvm/x86_64/mmio_warning_test.c | 6 +-
> .../selftests/kvm/x86_64/mmu_role_test.c | 20 +-
> .../selftests/kvm/x86_64/platform_info_test.c | 34 +-
> .../kvm/x86_64/pmu_event_filter_test.c | 60 +-
> .../selftests/kvm/x86_64/set_boot_cpu_id.c | 87 +-
> .../selftests/kvm/x86_64/set_sregs_test.c | 47 +-
> .../selftests/kvm/x86_64/sev_migrate_tests.c | 17 +-
> tools/testing/selftests/kvm/x86_64/smm_test.c | 37 +-
> .../testing/selftests/kvm/x86_64/state_test.c | 29 +-
> .../selftests/kvm/x86_64/svm_int_ctl_test.c | 21 +-
> .../selftests/kvm/x86_64/svm_vmcall_test.c | 16 +-
> .../selftests/kvm/x86_64/sync_regs_test.c | 52 +-
> .../selftests/kvm/x86_64/tsc_msrs_test.c | 35 +-
> .../selftests/kvm/x86_64/userspace_io_test.c | 18 +-
> .../kvm/x86_64/userspace_msr_exit_test.c | 165 ++-
> .../kvm/x86_64/vmx_apic_access_test.c | 18 +-
> .../kvm/x86_64/vmx_close_while_nested_test.c | 17 +-
> .../selftests/kvm/x86_64/vmx_dirty_log_test.c | 13 +-
> .../vmx_exception_with_invalid_guest_state.c | 62 +-
> .../x86_64/vmx_invalid_nested_guest_state.c | 18 +-
> .../kvm/x86_64/vmx_nested_tsc_scaling_test.c | 19 +-
> .../selftests/kvm/x86_64/vmx_pmu_msrs_test.c | 25 +-
> .../kvm/x86_64/vmx_preemption_timer_test.c | 30 +-
> .../kvm/x86_64/vmx_set_nested_state_test.c | 86 +-
> .../kvm/x86_64/vmx_tsc_adjust_test.c | 12 +-
> .../selftests/kvm/x86_64/xapic_ipi_test.c | 48 +-
> .../selftests/kvm/x86_64/xen_shinfo_test.c | 35 +-
> .../selftests/kvm/x86_64/xen_vmcall_test.c | 17 +-
> .../selftests/kvm/x86_64/xss_msr_test.c | 10 +-
> 91 files changed, 2363 insertions(+), 3087 deletions(-)
> delete mode 100644 tools/testing/selftests/kvm/lib/kvm_util_internal.h
>
>
> base-commit: f6ae04ddb347f526b4620d1053690ecf1f87d77f
> --
> 2.35.1.723.g4982287a31-goog
>