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