1753dcf7aSZeng Guang // SPDX-License-Identifier: GPL-2.0-only
2753dcf7aSZeng Guang /*
3753dcf7aSZeng Guang * maximum APIC ID capability tests
4753dcf7aSZeng Guang *
5753dcf7aSZeng Guang * Copyright (C) 2022, Intel, Inc.
6753dcf7aSZeng Guang *
7753dcf7aSZeng Guang * Tests for getting/setting maximum APIC ID capability
8753dcf7aSZeng Guang */
9753dcf7aSZeng Guang
10753dcf7aSZeng Guang #include "kvm_util.h"
11753dcf7aSZeng Guang
12753dcf7aSZeng Guang #define MAX_VCPU_ID 2
13753dcf7aSZeng Guang
main(int argc,char * argv[])14753dcf7aSZeng Guang int main(int argc, char *argv[])
15753dcf7aSZeng Guang {
16753dcf7aSZeng Guang struct kvm_vm *vm;
17753dcf7aSZeng Guang int ret;
18753dcf7aSZeng Guang
19*95fb0460SSean Christopherson vm = vm_create_barebones();
20753dcf7aSZeng Guang
21753dcf7aSZeng Guang /* Get KVM_CAP_MAX_VCPU_ID cap supported in KVM */
22753dcf7aSZeng Guang ret = vm_check_cap(vm, KVM_CAP_MAX_VCPU_ID);
23753dcf7aSZeng Guang
24753dcf7aSZeng Guang /* Try to set KVM_CAP_MAX_VCPU_ID beyond KVM cap */
25a12c86c4SSean Christopherson ret = __vm_enable_cap(vm, KVM_CAP_MAX_VCPU_ID, ret + 1);
26753dcf7aSZeng Guang TEST_ASSERT(ret < 0,
27ac712209SSean Christopherson "Setting KVM_CAP_MAX_VCPU_ID beyond KVM cap should fail");
28753dcf7aSZeng Guang
29753dcf7aSZeng Guang /* Set KVM_CAP_MAX_VCPU_ID */
30a12c86c4SSean Christopherson vm_enable_cap(vm, KVM_CAP_MAX_VCPU_ID, MAX_VCPU_ID);
31ac712209SSean Christopherson
32753dcf7aSZeng Guang
33753dcf7aSZeng Guang /* Try to set KVM_CAP_MAX_VCPU_ID again */
34a12c86c4SSean Christopherson ret = __vm_enable_cap(vm, KVM_CAP_MAX_VCPU_ID, MAX_VCPU_ID + 1);
35753dcf7aSZeng Guang TEST_ASSERT(ret < 0,
36ac712209SSean Christopherson "Setting KVM_CAP_MAX_VCPU_ID multiple times should fail");
37753dcf7aSZeng Guang
38753dcf7aSZeng Guang /* Create vCPU with id beyond KVM_CAP_MAX_VCPU_ID cap*/
39ac712209SSean Christopherson ret = __vm_ioctl(vm, KVM_CREATE_VCPU, (void *)MAX_VCPU_ID);
40ac712209SSean Christopherson TEST_ASSERT(ret < 0, "Creating vCPU with ID > MAX_VCPU_ID should fail");
41753dcf7aSZeng Guang
42753dcf7aSZeng Guang kvm_vm_free(vm);
43753dcf7aSZeng Guang return 0;
44753dcf7aSZeng Guang }
45