3f6c1ad86cc637afe02cf7a45c0425f7e193757e
[linux-2.6-microblaze.git] / tools / testing / selftests / kvm / x86_64 / max_vcpuid_cap_test.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * maximum APIC ID capability tests
4  *
5  * Copyright (C) 2022, Intel, Inc.
6  *
7  * Tests for getting/setting maximum APIC ID capability
8  */
9
10 #include "kvm_util.h"
11 #include "../lib/kvm_util_internal.h"
12
13 #define MAX_VCPU_ID     2
14
15 int main(int argc, char *argv[])
16 {
17         struct kvm_vm *vm;
18         struct kvm_enable_cap cap = { 0 };
19         int ret;
20
21         vm = vm_create(VM_MODE_DEFAULT, 0, O_RDWR);
22
23         /* Get KVM_CAP_MAX_VCPU_ID cap supported in KVM */
24         ret = vm_check_cap(vm, KVM_CAP_MAX_VCPU_ID);
25
26         /* Try to set KVM_CAP_MAX_VCPU_ID beyond KVM cap */
27         cap.cap = KVM_CAP_MAX_VCPU_ID;
28         cap.args[0] = ret + 1;
29         ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
30         TEST_ASSERT(ret < 0,
31                     "Unexpected success to enable KVM_CAP_MAX_VCPU_ID"
32                     "beyond KVM cap!\n");
33
34         /* Set KVM_CAP_MAX_VCPU_ID */
35         cap.cap = KVM_CAP_MAX_VCPU_ID;
36         cap.args[0] = MAX_VCPU_ID;
37         ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
38         TEST_ASSERT(ret == 0,
39                     "Unexpected failure to enable KVM_CAP_MAX_VCPU_ID!\n");
40
41         /* Try to set KVM_CAP_MAX_VCPU_ID again */
42         cap.args[0] = MAX_VCPU_ID + 1;
43         ret = ioctl(vm->fd, KVM_ENABLE_CAP, &cap);
44         TEST_ASSERT(ret < 0,
45                     "Unexpected success to enable KVM_CAP_MAX_VCPU_ID again\n");
46
47         /* Create vCPU with id beyond KVM_CAP_MAX_VCPU_ID cap*/
48         ret = ioctl(vm->fd, KVM_CREATE_VCPU, MAX_VCPU_ID);
49         TEST_ASSERT(ret < 0,
50                     "Unexpected success in creating a vCPU with VCPU ID out of range\n");
51
52         kvm_vm_free(vm);
53         return 0;
54 }