Commit | Line | Data |
---|---|---|
783e9e51 PB |
1 | /* |
2 | * KVM_SET_SREGS tests | |
3 | * | |
4 | * Copyright (C) 2018, Google LLC. | |
5 | * | |
6 | * This work is licensed under the terms of the GNU GPL, version 2. | |
7 | * | |
8 | * This is a regression test for the bug fixed by the following commit: | |
9 | * d3802286fa0f ("kvm: x86: Disallow illegal IA32_APIC_BASE MSR values") | |
10 | * | |
11 | * That bug allowed a user-mode program that called the KVM_SET_SREGS | |
12 | * ioctl to put a VCPU's local APIC into an invalid state. | |
13 | * | |
14 | */ | |
15 | #define _GNU_SOURCE /* for program_invocation_short_name */ | |
16 | #include <fcntl.h> | |
17 | #include <stdio.h> | |
18 | #include <stdlib.h> | |
19 | #include <string.h> | |
20 | #include <sys/ioctl.h> | |
21 | ||
22 | #include "test_util.h" | |
23 | ||
24 | #include "kvm_util.h" | |
25 | #include "x86.h" | |
26 | ||
27 | #define VCPU_ID 5 | |
28 | ||
29 | int main(int argc, char *argv[]) | |
30 | { | |
31 | struct kvm_sregs sregs; | |
32 | struct kvm_vm *vm; | |
33 | int rc; | |
34 | ||
35 | /* Tell stdout not to buffer its content */ | |
36 | setbuf(stdout, NULL); | |
37 | ||
38 | /* Create VM */ | |
aee41be5 | 39 | vm = vm_create_default(VCPU_ID, 0, NULL); |
783e9e51 PB |
40 | |
41 | vcpu_sregs_get(vm, VCPU_ID, &sregs); | |
42 | sregs.apic_base = 1 << 10; | |
43 | rc = _vcpu_sregs_set(vm, VCPU_ID, &sregs); | |
44 | TEST_ASSERT(rc, "Set IA32_APIC_BASE to %llx (invalid)", | |
45 | sregs.apic_base); | |
46 | sregs.apic_base = 1 << 11; | |
47 | rc = _vcpu_sregs_set(vm, VCPU_ID, &sregs); | |
48 | TEST_ASSERT(!rc, "Couldn't set IA32_APIC_BASE to %llx (valid)", | |
49 | sregs.apic_base); | |
50 | ||
51 | kvm_vm_free(vm); | |
52 | ||
53 | return 0; | |
54 | } |