diff options
author | Andrew Jones | 2018-09-18 19:54:26 +0200 |
---|---|---|
committer | Paolo Bonzini | 2018-10-17 00:26:16 +0200 |
commit | cc68765d418721ab854a03626c01e8eb82711922 (patch) | |
tree | 3259e7c7f0b117986402db67c9c9ff7ebbf8f7dc /tools/testing/selftests/kvm/cr4_cpuid_sync_test.c | |
parent | kvm: selftests: introduce ucall (diff) | |
download | kernel-qcow2-linux-cc68765d418721ab854a03626c01e8eb82711922.tar.gz kernel-qcow2-linux-cc68765d418721ab854a03626c01e8eb82711922.tar.xz kernel-qcow2-linux-cc68765d418721ab854a03626c01e8eb82711922.zip |
kvm: selftests: move arch-specific files to arch-specific locations
Signed-off-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'tools/testing/selftests/kvm/cr4_cpuid_sync_test.c')
-rw-r--r-- | tools/testing/selftests/kvm/cr4_cpuid_sync_test.c | 113 |
1 files changed, 0 insertions, 113 deletions
diff --git a/tools/testing/selftests/kvm/cr4_cpuid_sync_test.c b/tools/testing/selftests/kvm/cr4_cpuid_sync_test.c deleted file mode 100644 index fd4f419fe9ab..000000000000 --- a/tools/testing/selftests/kvm/cr4_cpuid_sync_test.c +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * CR4 and CPUID sync test - * - * Copyright 2018, Red Hat, Inc. and/or its affiliates. - * - * Author: - * Wei Huang <wei@redhat.com> - */ - -#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 "x86.h" - -#define X86_FEATURE_XSAVE (1<<26) -#define X86_FEATURE_OSXSAVE (1<<27) -#define VCPU_ID 1 - -static inline bool cr4_cpuid_is_sync(void) -{ - int func, subfunc; - uint32_t eax, ebx, ecx, edx; - uint64_t cr4; - - func = 0x1; - subfunc = 0x0; - __asm__ __volatile__("cpuid" - : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) - : "a"(func), "c"(subfunc)); - - cr4 = get_cr4(); - - return (!!(ecx & X86_FEATURE_OSXSAVE)) == (!!(cr4 & X86_CR4_OSXSAVE)); -} - -static void guest_code(void) -{ - uint64_t cr4; - - /* turn on CR4.OSXSAVE */ - cr4 = get_cr4(); - cr4 |= X86_CR4_OSXSAVE; - set_cr4(cr4); - - /* verify CR4.OSXSAVE == CPUID.OSXSAVE */ - GUEST_ASSERT(cr4_cpuid_is_sync()); - - /* notify hypervisor to change CR4 */ - GUEST_SYNC(0); - - /* check again */ - GUEST_ASSERT(cr4_cpuid_is_sync()); - - GUEST_DONE(); -} - -int main(int argc, char *argv[]) -{ - struct kvm_run *run; - struct kvm_vm *vm; - struct kvm_sregs sregs; - struct kvm_cpuid_entry2 *entry; - struct ucall uc; - int rc; - - entry = kvm_get_supported_cpuid_entry(1); - if (!(entry->ecx & X86_FEATURE_XSAVE)) { - printf("XSAVE feature not supported, skipping test\n"); - return 0; - } - - /* Tell stdout not to buffer its content */ - setbuf(stdout, NULL); - - /* Create VM */ - vm = vm_create_default(VCPU_ID, 0, guest_code); - vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid()); - run = vcpu_state(vm, VCPU_ID); - - while (1) { - rc = _vcpu_run(vm, VCPU_ID); - - if (run->exit_reason == KVM_EXIT_IO) { - switch (get_ucall(vm, VCPU_ID, &uc)) { - case UCALL_SYNC: - /* emulate hypervisor clearing CR4.OSXSAVE */ - vcpu_sregs_get(vm, VCPU_ID, &sregs); - sregs.cr4 &= ~X86_CR4_OSXSAVE; - vcpu_sregs_set(vm, VCPU_ID, &sregs); - break; - case UCALL_ABORT: - TEST_ASSERT(false, "Guest CR4 bit (OSXSAVE) unsynchronized with CPUID bit."); - break; - case UCALL_DONE: - goto done; - default: - TEST_ASSERT(false, "Unknown ucall 0x%x.", uc.cmd); - } - } - } - - kvm_vm_free(vm); - -done: - return 0; -} |