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