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 "processor.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 */ 39 vm = vm_create_default(VCPU_ID, 0, NULL); 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 } 55