| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * KVM_SET_SREGS tests |
| * |
| * Copyright (C) 2018, Google LLC. |
| * |
| * This is a regression test for the bug fixed by the following commit: |
| * d3802286fa0f ("kvm: x86: Disallow illegal IA32_APIC_BASE MSR values") |
| * |
| * That bug allowed a user-mode program that called the KVM_SET_SREGS |
| * ioctl to put a VCPU's local APIC into an invalid state. |
| */ |
| #define _GNU_SOURCE /* for program_invocation_short_name */ |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/ioctl.h> |
| |
| #include "test_util.h" |
| |
| #include "kvm_util.h" |
| #include "processor.h" |
| |
| #define VCPU_ID 5 |
| |
| int main(int argc, char *argv[]) |
| { |
| struct kvm_sregs sregs; |
| struct kvm_vm *vm; |
| int rc; |
| |
| /* Tell stdout not to buffer its content */ |
| setbuf(stdout, NULL); |
| |
| /* Create VM */ |
| vm = vm_create_default(VCPU_ID, 0, NULL); |
| |
| vcpu_sregs_get(vm, VCPU_ID, &sregs); |
| sregs.apic_base = 1 << 10; |
| rc = _vcpu_sregs_set(vm, VCPU_ID, &sregs); |
| TEST_ASSERT(rc, "Set IA32_APIC_BASE to %llx (invalid)", |
| sregs.apic_base); |
| sregs.apic_base = 1 << 11; |
| rc = _vcpu_sregs_set(vm, VCPU_ID, &sregs); |
| TEST_ASSERT(!rc, "Couldn't set IA32_APIC_BASE to %llx (valid)", |
| sregs.apic_base); |
| |
| kvm_vm_free(vm); |
| |
| return 0; |
| } |