Commit 3ea9b809 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: selftests: Add kvm_has_cap() to provide syntactic sugar

Add kvm_has_cap() to wrap kvm_check_cap() and return a bool for the use
cases where the caller only wants check if a capability is supported,
i.e. doesn't care about the value beyond whether or not it's non-zero.
The "check" terminology is somewhat ambiguous as the non-boolean return
suggests that '0' might mean "success", i.e. suggests that the ioctl uses
the 0/-errno pattern.  Provide a wrapper instead of trying to find a new
name for the raw helper; the "check" terminology is derived from the name
of the ioctl, so using e.g. "get" isn't a clear win.
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent d8ba3f14
...@@ -395,7 +395,7 @@ static void check_supported(struct vcpu_config *c) ...@@ -395,7 +395,7 @@ static void check_supported(struct vcpu_config *c)
struct reg_sublist *s; struct reg_sublist *s;
for_each_sublist(c, s) { for_each_sublist(c, s) {
if (s->capability && !kvm_check_cap(s->capability)) { if (s->capability && !kvm_has_cap(s->capability)) {
fprintf(stderr, "%s: %s not available, skipping tests\n", config_name(c), s->name); fprintf(stderr, "%s: %s not available, skipping tests\n", config_name(c), s->name);
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -82,7 +82,7 @@ int main(void) ...@@ -82,7 +82,7 @@ int main(void)
struct kvm_vm *vm; struct kvm_vm *vm;
int ret; int ret;
if (!kvm_check_cap(KVM_CAP_ARM_EL1_32BIT)) { if (!kvm_has_cap(KVM_CAP_ARM_EL1_32BIT)) {
print_skip("KVM_CAP_ARM_EL1_32BIT is not supported"); print_skip("KVM_CAP_ARM_EL1_32BIT is not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -210,7 +210,7 @@ static void sem_wait_until(sem_t *sem) ...@@ -210,7 +210,7 @@ static void sem_wait_until(sem_t *sem)
static bool clear_log_supported(void) static bool clear_log_supported(void)
{ {
return kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2); return kvm_has_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
} }
static void clear_log_create_vm_done(struct kvm_vm *vm) static void clear_log_create_vm_done(struct kvm_vm *vm)
...@@ -264,7 +264,7 @@ static void default_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err) ...@@ -264,7 +264,7 @@ static void default_after_vcpu_run(struct kvm_vcpu *vcpu, int ret, int err)
static bool dirty_ring_supported(void) static bool dirty_ring_supported(void)
{ {
return kvm_check_cap(KVM_CAP_DIRTY_LOG_RING); return kvm_has_cap(KVM_CAP_DIRTY_LOG_RING);
} }
static void dirty_ring_create_vm_done(struct kvm_vm *vm) static void dirty_ring_create_vm_done(struct kvm_vm *vm)
......
...@@ -169,6 +169,11 @@ int open_path_or_exit(const char *path, int flags); ...@@ -169,6 +169,11 @@ int open_path_or_exit(const char *path, int flags);
int open_kvm_dev_path_or_exit(void); int open_kvm_dev_path_or_exit(void);
unsigned int kvm_check_cap(long cap); unsigned int kvm_check_cap(long cap);
static inline bool kvm_has_cap(long cap)
{
return kvm_check_cap(cap);
}
#define __KVM_SYSCALL_ERROR(_name, _ret) \ #define __KVM_SYSCALL_ERROR(_name, _ret) \
"%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errno) "%s failed, rc: %i errno: %i (%s)", (_name), (_ret), errno, strerror(errno)
......
...@@ -213,7 +213,7 @@ int main(int argc, char *argv[]) ...@@ -213,7 +213,7 @@ int main(int argc, char *argv[])
} }
/* Check the extension for binary stats */ /* Check the extension for binary stats */
if (!kvm_check_cap(KVM_CAP_BINARY_STATS_FD)) { if (!kvm_has_cap(KVM_CAP_BINARY_STATS_FD)) {
print_skip("Binary form statistics interface is not supported"); print_skip("Binary form statistics interface is not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -80,7 +80,7 @@ unsigned int kvm_check_cap(long cap) ...@@ -80,7 +80,7 @@ unsigned int kvm_check_cap(long cap)
close(kvm_fd); close(kvm_fd);
return ret; return (unsigned int)ret;
} }
void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size) void vm_enable_dirty_ring(struct kvm_vm *vm, uint32_t ring_size)
...@@ -93,7 +93,7 @@ static void vm_open(struct kvm_vm *vm) ...@@ -93,7 +93,7 @@ static void vm_open(struct kvm_vm *vm)
{ {
vm->kvm_fd = _open_kvm_dev_path_or_exit(O_RDWR); vm->kvm_fd = _open_kvm_dev_path_or_exit(O_RDWR);
if (!kvm_check_cap(KVM_CAP_IMMEDIATE_EXIT)) { if (!kvm_has_cap(KVM_CAP_IMMEDIATE_EXIT)) {
print_skip("immediate_exit not available"); print_skip("immediate_exit not available");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -61,7 +61,7 @@ uint64_t get_diag318_info(void) ...@@ -61,7 +61,7 @@ uint64_t get_diag318_info(void)
* If KVM does not support diag318, then return 0 to * If KVM does not support diag318, then return 0 to
* ensure tests do not break. * ensure tests do not break.
*/ */
if (!kvm_check_cap(KVM_CAP_S390_DIAG318)) { if (!kvm_has_cap(KVM_CAP_S390_DIAG318)) {
if (!printed_skip) { if (!printed_skip) {
fprintf(stdout, "KVM_CAP_S390_DIAG318 not supported. " fprintf(stdout, "KVM_CAP_S390_DIAG318 not supported. "
"Skipping diag318 test.\n"); "Skipping diag318 test.\n");
......
...@@ -95,7 +95,7 @@ int main(void) ...@@ -95,7 +95,7 @@ int main(void)
1, /* cli */ 1, /* cli */
}; };
if (!kvm_check_cap(KVM_CAP_SET_GUEST_DEBUG)) { if (!kvm_has_cap(KVM_CAP_SET_GUEST_DEBUG)) {
print_skip("KVM_CAP_SET_GUEST_DEBUG not supported"); print_skip("KVM_CAP_SET_GUEST_DEBUG not supported");
return 0; return 0;
} }
......
...@@ -162,7 +162,7 @@ int main(int argc, char *argv[]) ...@@ -162,7 +162,7 @@ int main(int argc, char *argv[])
/* Tell stdout not to buffer its content */ /* Tell stdout not to buffer its content */
setbuf(stdout, NULL); setbuf(stdout, NULL);
if (!kvm_check_cap(KVM_CAP_SMALLER_MAXPHYADDR)) { if (!kvm_has_cap(KVM_CAP_SMALLER_MAXPHYADDR)) {
printf("module parameter 'allow_smaller_maxphyaddr' is not set. Skipping test.\n"); printf("module parameter 'allow_smaller_maxphyaddr' is not set. Skipping test.\n");
return 0; return 0;
} }
......
...@@ -209,8 +209,8 @@ int main(int argc, char *argv[]) ...@@ -209,8 +209,8 @@ int main(int argc, char *argv[])
vm = vm_create_with_one_vcpu(&vcpu, guest_code); vm = vm_create_with_one_vcpu(&vcpu, guest_code);
if (!nested_vmx_supported() || if (!nested_vmx_supported() ||
!kvm_check_cap(KVM_CAP_NESTED_STATE) || !kvm_has_cap(KVM_CAP_NESTED_STATE) ||
!kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) { !kvm_has_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) {
print_skip("Enlightened VMCS is unsupported"); print_skip("Enlightened VMCS is unsupported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -137,7 +137,7 @@ int main(int argc, char *argv[]) ...@@ -137,7 +137,7 @@ int main(int argc, char *argv[])
/* Tell stdout not to buffer its content */ /* Tell stdout not to buffer its content */
setbuf(stdout, NULL); setbuf(stdout, NULL);
if (!kvm_check_cap(KVM_CAP_HYPERV_CPUID)) { if (!kvm_has_cap(KVM_CAP_HYPERV_CPUID)) {
print_skip("KVM_CAP_HYPERV_CPUID not supported"); print_skip("KVM_CAP_HYPERV_CPUID not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
...@@ -152,7 +152,7 @@ int main(int argc, char *argv[]) ...@@ -152,7 +152,7 @@ int main(int argc, char *argv[])
free(hv_cpuid_entries); free(hv_cpuid_entries);
if (!nested_vmx_supported() || if (!nested_vmx_supported() ||
!kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) { !kvm_has_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) {
print_skip("Enlightened VMCS is unsupported"); print_skip("Enlightened VMCS is unsupported");
goto do_sys; goto do_sys;
} }
...@@ -163,7 +163,7 @@ int main(int argc, char *argv[]) ...@@ -163,7 +163,7 @@ int main(int argc, char *argv[])
do_sys: do_sys:
/* Test system ioctl version */ /* Test system ioctl version */
if (!kvm_check_cap(KVM_CAP_SYS_HYPERV_CPUID)) { if (!kvm_has_cap(KVM_CAP_SYS_HYPERV_CPUID)) {
print_skip("KVM_CAP_SYS_HYPERV_CPUID not supported"); print_skip("KVM_CAP_SYS_HYPERV_CPUID not supported");
goto out; goto out;
} }
......
...@@ -204,7 +204,7 @@ int main(void) ...@@ -204,7 +204,7 @@ int main(void)
struct kvm_vcpu *vcpu; struct kvm_vcpu *vcpu;
struct kvm_vm *vm; struct kvm_vm *vm;
if (!kvm_check_cap(KVM_CAP_ENFORCE_PV_FEATURE_CPUID)) { if (!kvm_has_cap(KVM_CAP_ENFORCE_PV_FEATURE_CPUID)) {
print_skip("KVM_CAP_ENFORCE_PV_FEATURE_CPUID not supported"); print_skip("KVM_CAP_ENFORCE_PV_FEATURE_CPUID not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -123,7 +123,7 @@ static void check_set_bsp_busy(void) ...@@ -123,7 +123,7 @@ static void check_set_bsp_busy(void)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (!kvm_check_cap(KVM_CAP_SET_BOOT_CPU_ID)) { if (!kvm_has_cap(KVM_CAP_SET_BOOT_CPU_ID)) {
print_skip("set_boot_cpu_id not available"); print_skip("set_boot_cpu_id not available");
return 0; return 0;
} }
......
...@@ -400,8 +400,8 @@ int main(int argc, char *argv[]) ...@@ -400,8 +400,8 @@ int main(int argc, char *argv[])
{ {
struct kvm_cpuid_entry2 *cpuid; struct kvm_cpuid_entry2 *cpuid;
if (!kvm_check_cap(KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM) && if (!kvm_has_cap(KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM) &&
!kvm_check_cap(KVM_CAP_VM_COPY_ENC_CONTEXT_FROM)) { !kvm_has_cap(KVM_CAP_VM_COPY_ENC_CONTEXT_FROM)) {
print_skip("Capabilities not available"); print_skip("Capabilities not available");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -51,7 +51,7 @@ int main(void) ...@@ -51,7 +51,7 @@ int main(void)
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
if (!kvm_check_cap(KVM_CAP_X86_TRIPLE_FAULT_EVENT)) { if (!kvm_has_cap(KVM_CAP_X86_TRIPLE_FAULT_EVENT)) {
print_skip("KVM_CAP_X86_TRIPLE_FAULT_EVENT not supported"); print_skip("KVM_CAP_X86_TRIPLE_FAULT_EVENT not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -93,7 +93,7 @@ static void *run_vcpu(void *_cpu_nr) ...@@ -93,7 +93,7 @@ static void *run_vcpu(void *_cpu_nr)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (!kvm_check_cap(KVM_CAP_VM_TSC_CONTROL)) { if (!kvm_has_cap(KVM_CAP_VM_TSC_CONTROL)) {
print_skip("KVM_CAP_VM_TSC_CONTROL not available"); print_skip("KVM_CAP_VM_TSC_CONTROL not available");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -118,7 +118,7 @@ static void l1_guest_code(struct vmx_pages *vmx_pages) ...@@ -118,7 +118,7 @@ static void l1_guest_code(struct vmx_pages *vmx_pages)
static void tsc_scaling_check_supported(void) static void tsc_scaling_check_supported(void)
{ {
if (!kvm_check_cap(KVM_CAP_TSC_CONTROL)) { if (!kvm_has_cap(KVM_CAP_TSC_CONTROL)) {
print_skip("TSC scaling not supported by the HW"); print_skip("TSC scaling not supported by the HW");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -169,7 +169,7 @@ int main(int argc, char *argv[]) ...@@ -169,7 +169,7 @@ int main(int argc, char *argv[])
*/ */
nested_vmx_check_supported(); nested_vmx_check_supported();
if (!kvm_check_cap(KVM_CAP_NESTED_STATE)) { if (!kvm_has_cap(KVM_CAP_NESTED_STATE)) {
print_skip("KVM_CAP_NESTED_STATE not supported"); print_skip("KVM_CAP_NESTED_STATE not supported");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
...@@ -267,7 +267,7 @@ int main(int argc, char *argv[]) ...@@ -267,7 +267,7 @@ int main(int argc, char *argv[])
have_evmcs = kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS); have_evmcs = kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS);
if (!kvm_check_cap(KVM_CAP_NESTED_STATE)) { if (!kvm_has_cap(KVM_CAP_NESTED_STATE)) {
print_skip("KVM_CAP_NESTED_STATE not available"); print_skip("KVM_CAP_NESTED_STATE not available");
exit(KSFT_SKIP); exit(KSFT_SKIP);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment