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