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