2021-05-21 11:52:04 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2021, Red Hat, Inc.
|
|
|
|
|
*
|
|
|
|
|
* Tests for Hyper-V features enablement
|
|
|
|
|
*/
|
|
|
|
|
#include <asm/kvm_para.h>
|
|
|
|
|
#include <linux/kvm_para.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
|
|
#include "test_util.h"
|
|
|
|
|
#include "kvm_util.h"
|
|
|
|
|
#include "processor.h"
|
|
|
|
|
#include "hyperv.h"
|
|
|
|
|
|
|
|
|
|
#define LINUX_OS_ID ((u64)0x8100 << 48)
|
|
|
|
|
|
2022-06-08 22:45:15 +00:00
|
|
|
static inline uint8_t hypercall(u64 control, vm_vaddr_t input_address,
|
|
|
|
|
vm_vaddr_t output_address, uint64_t *hv_status)
|
2021-05-21 11:52:04 +02:00
|
|
|
{
|
2022-06-08 22:45:15 +00:00
|
|
|
uint8_t vector;
|
|
|
|
|
|
|
|
|
|
/* Note both the hypercall and the "asm safe" clobber r9-r11. */
|
|
|
|
|
asm volatile("mov %[output_address], %%r8\n\t"
|
|
|
|
|
KVM_ASM_SAFE("vmcall")
|
|
|
|
|
: "=a" (*hv_status),
|
|
|
|
|
"+c" (control), "+d" (input_address),
|
|
|
|
|
KVM_ASM_SAFE_OUTPUTS(vector)
|
|
|
|
|
: [output_address] "r"(output_address)
|
|
|
|
|
: "cc", "memory", "r8", KVM_ASM_SAFE_CLOBBERS);
|
|
|
|
|
return vector;
|
2021-07-30 14:26:25 +02:00
|
|
|
}
|
|
|
|
|
|
2021-05-21 11:52:04 +02:00
|
|
|
struct msr_data {
|
|
|
|
|
uint32_t idx;
|
|
|
|
|
bool available;
|
|
|
|
|
bool write;
|
|
|
|
|
u64 write_val;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct hcall_data {
|
|
|
|
|
uint64_t control;
|
|
|
|
|
uint64_t expect;
|
2021-07-30 14:26:25 +02:00
|
|
|
bool ud_expected;
|
2021-05-21 11:52:04 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void guest_msr(struct msr_data *msr)
|
|
|
|
|
{
|
2022-06-08 22:45:15 +00:00
|
|
|
uint64_t ignored;
|
|
|
|
|
uint8_t vector;
|
|
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
GUEST_ASSERT(msr->idx);
|
2021-05-21 11:52:04 +02:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
if (!msr->write)
|
2022-06-08 22:45:15 +00:00
|
|
|
vector = rdmsr_safe(msr->idx, &ignored);
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
else
|
2022-06-08 22:45:15 +00:00
|
|
|
vector = wrmsr_safe(msr->idx, msr->write_val);
|
2021-05-21 11:52:04 +02:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
if (msr->available)
|
2022-06-08 22:45:15 +00:00
|
|
|
GUEST_ASSERT_2(!vector, msr->idx, vector);
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
else
|
2022-06-08 22:45:15 +00:00
|
|
|
GUEST_ASSERT_2(vector == GP_VECTOR, msr->idx, vector);
|
2021-05-21 11:52:04 +02:00
|
|
|
GUEST_DONE();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void guest_hcall(vm_vaddr_t pgs_gpa, struct hcall_data *hcall)
|
|
|
|
|
{
|
2021-07-30 14:26:25 +02:00
|
|
|
u64 res, input, output;
|
2022-06-08 22:45:15 +00:00
|
|
|
uint8_t vector;
|
2021-05-21 11:52:04 +02:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
GUEST_ASSERT(hcall->control);
|
|
|
|
|
|
2021-05-21 11:52:04 +02:00
|
|
|
wrmsr(HV_X64_MSR_GUEST_OS_ID, LINUX_OS_ID);
|
|
|
|
|
wrmsr(HV_X64_MSR_HYPERCALL, pgs_gpa);
|
|
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
if (!(hcall->control & HV_HYPERCALL_FAST_BIT)) {
|
|
|
|
|
input = pgs_gpa;
|
|
|
|
|
output = pgs_gpa + 4096;
|
|
|
|
|
} else {
|
|
|
|
|
input = output = 0;
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-08 22:45:15 +00:00
|
|
|
vector = hypercall(hcall->control, input, output, &res);
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
if (hcall->ud_expected)
|
2022-06-08 22:45:15 +00:00
|
|
|
GUEST_ASSERT_2(vector == UD_VECTOR, hcall->control, vector);
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
else
|
2022-06-08 22:45:15 +00:00
|
|
|
GUEST_ASSERT_2(!vector, hcall->control, vector);
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
|
2022-06-08 22:45:15 +00:00
|
|
|
GUEST_ASSERT_2(!hcall->ud_expected || res == hcall->expect,
|
|
|
|
|
hcall->expect, res);
|
2021-05-21 11:52:04 +02:00
|
|
|
GUEST_DONE();
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-15 16:50:11 -08:00
|
|
|
static void hv_set_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
|
2021-05-21 11:52:04 +02:00
|
|
|
struct kvm_cpuid_entry2 *feat,
|
|
|
|
|
struct kvm_cpuid_entry2 *recomm,
|
|
|
|
|
struct kvm_cpuid_entry2 *dbg)
|
|
|
|
|
{
|
|
|
|
|
TEST_ASSERT(set_cpuid(cpuid, feat),
|
|
|
|
|
"failed to set KVM_CPUID_FEATURES leaf");
|
|
|
|
|
TEST_ASSERT(set_cpuid(cpuid, recomm),
|
|
|
|
|
"failed to set HYPERV_CPUID_ENLIGHTMENT_INFO leaf");
|
|
|
|
|
TEST_ASSERT(set_cpuid(cpuid, dbg),
|
|
|
|
|
"failed to set HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES leaf");
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_set_cpuid(vcpu, cpuid);
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
|
2021-11-22 18:58:17 +01:00
|
|
|
static void guest_test_msrs_access(void)
|
2021-05-21 11:52:04 +02:00
|
|
|
{
|
2022-02-15 16:50:11 -08:00
|
|
|
struct kvm_vcpu *vcpu;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct kvm_run *run;
|
2021-11-22 18:58:17 +01:00
|
|
|
struct kvm_vm *vm;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct ucall uc;
|
2022-02-15 16:50:11 -08:00
|
|
|
int stage = 0;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct kvm_cpuid_entry2 feat = {
|
|
|
|
|
.function = HYPERV_CPUID_FEATURES
|
|
|
|
|
};
|
|
|
|
|
struct kvm_cpuid_entry2 recomm = {
|
|
|
|
|
.function = HYPERV_CPUID_ENLIGHTMENT_INFO
|
|
|
|
|
};
|
|
|
|
|
struct kvm_cpuid_entry2 dbg = {
|
|
|
|
|
.function = HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES
|
|
|
|
|
};
|
2021-11-22 18:58:17 +01:00
|
|
|
struct kvm_cpuid2 *best;
|
|
|
|
|
vm_vaddr_t msr_gva;
|
|
|
|
|
struct msr_data *msr;
|
2021-05-21 11:52:04 +02:00
|
|
|
|
|
|
|
|
while (true) {
|
2022-02-15 16:50:11 -08:00
|
|
|
vm = vm_create_with_one_vcpu(&vcpu, guest_msr);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
|
|
|
|
msr_gva = vm_vaddr_alloc_page(vm);
|
|
|
|
|
memset(addr_gva2hva(vm, msr_gva), 0x0, getpagesize());
|
|
|
|
|
msr = addr_gva2hva(vm, msr_gva);
|
|
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_args_set(vcpu, 1, msr_gva);
|
|
|
|
|
vcpu_enable_cap(vcpu, KVM_CAP_HYPERV_ENFORCE_CPUID, 1);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_set_hv_cpuid(vcpu);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
|
|
|
|
best = kvm_get_supported_hv_cpuid();
|
|
|
|
|
|
|
|
|
|
vm_init_descriptor_tables(vm);
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_init_descriptor_tables(vcpu);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
2022-02-15 16:50:11 -08:00
|
|
|
run = vcpu->run;
|
2021-11-22 18:58:17 +01:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
/* TODO: Make this entire test easier to maintain. */
|
|
|
|
|
if (stage >= 21)
|
|
|
|
|
vcpu_enable_cap(vcpu, KVM_CAP_HYPERV_SYNIC2, 0);
|
|
|
|
|
|
2021-05-21 11:52:04 +02:00
|
|
|
switch (stage) {
|
|
|
|
|
case 0:
|
|
|
|
|
/*
|
|
|
|
|
* Only available when Hyper-V identification is set
|
|
|
|
|
*/
|
|
|
|
|
msr->idx = HV_X64_MSR_GUEST_OS_ID;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
msr->idx = HV_X64_MSR_HYPERCALL;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
feat.eax |= HV_MSR_HYPERCALL_AVAILABLE;
|
|
|
|
|
/*
|
|
|
|
|
* HV_X64_MSR_GUEST_OS_ID has to be written first to make
|
|
|
|
|
* HV_X64_MSR_HYPERCALL available.
|
|
|
|
|
*/
|
|
|
|
|
msr->idx = HV_X64_MSR_GUEST_OS_ID;
|
|
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = LINUX_OS_ID;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
msr->idx = HV_X64_MSR_GUEST_OS_ID;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
msr->idx = HV_X64_MSR_HYPERCALL;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
|
msr->idx = HV_X64_MSR_VP_RUNTIME;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
feat.eax |= HV_MSR_VP_RUNTIME_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_VP_RUNTIME;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
/* Read only */
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_VP_RUNTIME;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 8:
|
|
|
|
|
msr->idx = HV_X64_MSR_TIME_REF_COUNT;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
feat.eax |= HV_MSR_TIME_REF_COUNT_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_TIME_REF_COUNT;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 10:
|
|
|
|
|
/* Read only */
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_TIME_REF_COUNT;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 11:
|
|
|
|
|
msr->idx = HV_X64_MSR_VP_INDEX;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
feat.eax |= HV_MSR_VP_INDEX_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_VP_INDEX;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 13:
|
|
|
|
|
/* Read only */
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_VP_INDEX;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 14:
|
|
|
|
|
msr->idx = HV_X64_MSR_RESET;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 15:
|
|
|
|
|
feat.eax |= HV_MSR_RESET_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_RESET;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 16:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_RESET;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 17:
|
|
|
|
|
msr->idx = HV_X64_MSR_REFERENCE_TSC;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 18:
|
|
|
|
|
feat.eax |= HV_MSR_REFERENCE_TSC_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_REFERENCE_TSC;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 19:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_REFERENCE_TSC;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 20:
|
|
|
|
|
msr->idx = HV_X64_MSR_EOM;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 21:
|
|
|
|
|
/*
|
|
|
|
|
* Remains unavailable even with KVM_CAP_HYPERV_SYNIC2
|
|
|
|
|
* capability enabled and guest visible CPUID bit unset.
|
|
|
|
|
*/
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_EOM;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
2021-05-21 11:52:04 +02:00
|
|
|
break;
|
|
|
|
|
case 22:
|
|
|
|
|
feat.eax |= HV_MSR_SYNIC_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_EOM;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 23:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_EOM;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 24:
|
|
|
|
|
msr->idx = HV_X64_MSR_STIMER0_CONFIG;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 25:
|
|
|
|
|
feat.eax |= HV_MSR_SYNTIMER_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_STIMER0_CONFIG;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 26:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_STIMER0_CONFIG;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 27:
|
|
|
|
|
/* Direct mode test */
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_STIMER0_CONFIG;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1 << 12;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 28:
|
|
|
|
|
feat.edx |= HV_STIMER_DIRECT_MODE_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_STIMER0_CONFIG;
|
|
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1 << 12;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 29:
|
|
|
|
|
msr->idx = HV_X64_MSR_EOI;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 30:
|
|
|
|
|
feat.eax |= HV_MSR_APIC_ACCESS_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_EOI;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 31:
|
|
|
|
|
msr->idx = HV_X64_MSR_TSC_FREQUENCY;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 32:
|
|
|
|
|
feat.eax |= HV_ACCESS_FREQUENCY_MSRS;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_TSC_FREQUENCY;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 33:
|
|
|
|
|
/* Read only */
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_TSC_FREQUENCY;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 34:
|
|
|
|
|
msr->idx = HV_X64_MSR_REENLIGHTENMENT_CONTROL;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 35:
|
|
|
|
|
feat.eax |= HV_ACCESS_REENLIGHTENMENT;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_REENLIGHTENMENT_CONTROL;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 36:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_REENLIGHTENMENT_CONTROL;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 37:
|
|
|
|
|
/* Can only write '0' */
|
|
|
|
|
msr->idx = HV_X64_MSR_TSC_EMULATION_STATUS;
|
|
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 38:
|
|
|
|
|
msr->idx = HV_X64_MSR_CRASH_P0;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 39:
|
|
|
|
|
feat.edx |= HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_CRASH_P0;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 40:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_CRASH_P0;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 1;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 41:
|
|
|
|
|
msr->idx = HV_X64_MSR_SYNDBG_STATUS;
|
|
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 0;
|
|
|
|
|
break;
|
|
|
|
|
case 42:
|
|
|
|
|
feat.edx |= HV_FEATURE_DEBUG_MSRS_AVAILABLE;
|
|
|
|
|
dbg.eax |= HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_SYNDBG_STATUS;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 43:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
msr->idx = HV_X64_MSR_SYNDBG_STATUS;
|
2021-05-21 11:52:04 +02:00
|
|
|
msr->write = 1;
|
|
|
|
|
msr->write_val = 0;
|
|
|
|
|
msr->available = 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 44:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
kvm_vm_free(vm);
|
|
|
|
|
return;
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
|
2022-02-15 16:50:11 -08:00
|
|
|
hv_set_cpuid(vcpu, best, &feat, &recomm, &dbg);
|
2021-05-21 11:52:04 +02:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
pr_debug("Stage %d: testing msr: 0x%x for %s\n", stage,
|
|
|
|
|
msr->idx, msr->write ? "write" : "read");
|
2021-05-21 11:52:04 +02:00
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_run(vcpu);
|
2021-05-21 11:52:04 +02:00
|
|
|
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
|
|
|
|
"unexpected exit reason: %u (%s)",
|
|
|
|
|
run->exit_reason, exit_reason_str(run->exit_reason));
|
|
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
switch (get_ucall(vcpu, &uc)) {
|
2021-05-21 11:52:04 +02:00
|
|
|
case UCALL_ABORT:
|
2022-06-08 22:45:15 +00:00
|
|
|
TEST_FAIL("%s at %s:%ld, MSR = %lx, vector = %lx",
|
|
|
|
|
(const char *)uc.args[0], __FILE__,
|
|
|
|
|
uc.args[1], uc.args[2], uc.args[3]);
|
2021-05-21 11:52:04 +02:00
|
|
|
return;
|
|
|
|
|
case UCALL_DONE:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
TEST_FAIL("Unhandled ucall: %ld", uc.cmd);
|
2021-05-21 11:52:04 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stage++;
|
2021-11-22 18:58:17 +01:00
|
|
|
kvm_vm_free(vm);
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-22 18:58:17 +01:00
|
|
|
static void guest_test_hcalls_access(void)
|
2021-05-21 11:52:04 +02:00
|
|
|
{
|
2022-02-15 16:50:11 -08:00
|
|
|
struct kvm_vcpu *vcpu;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct kvm_run *run;
|
2021-11-22 18:58:17 +01:00
|
|
|
struct kvm_vm *vm;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct ucall uc;
|
2022-02-15 16:50:11 -08:00
|
|
|
int stage = 0;
|
2021-05-21 11:52:04 +02:00
|
|
|
struct kvm_cpuid_entry2 feat = {
|
|
|
|
|
.function = HYPERV_CPUID_FEATURES,
|
|
|
|
|
.eax = HV_MSR_HYPERCALL_AVAILABLE
|
|
|
|
|
};
|
|
|
|
|
struct kvm_cpuid_entry2 recomm = {
|
|
|
|
|
.function = HYPERV_CPUID_ENLIGHTMENT_INFO
|
|
|
|
|
};
|
|
|
|
|
struct kvm_cpuid_entry2 dbg = {
|
|
|
|
|
.function = HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES
|
|
|
|
|
};
|
2021-11-22 18:58:17 +01:00
|
|
|
vm_vaddr_t hcall_page, hcall_params;
|
|
|
|
|
struct hcall_data *hcall;
|
|
|
|
|
struct kvm_cpuid2 *best;
|
2021-05-21 11:52:04 +02:00
|
|
|
|
|
|
|
|
while (true) {
|
2022-02-15 16:50:11 -08:00
|
|
|
vm = vm_create_with_one_vcpu(&vcpu, guest_hcall);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
|
|
|
|
vm_init_descriptor_tables(vm);
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_init_descriptor_tables(vcpu);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
|
|
|
|
/* Hypercall input/output */
|
|
|
|
|
hcall_page = vm_vaddr_alloc_pages(vm, 2);
|
|
|
|
|
memset(addr_gva2hva(vm, hcall_page), 0x0, 2 * getpagesize());
|
|
|
|
|
|
|
|
|
|
hcall_params = vm_vaddr_alloc_page(vm);
|
|
|
|
|
memset(addr_gva2hva(vm, hcall_params), 0x0, getpagesize());
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall = addr_gva2hva(vm, hcall_params);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_args_set(vcpu, 2, addr_gva2gpa(vm, hcall_page), hcall_params);
|
|
|
|
|
vcpu_enable_cap(vcpu, KVM_CAP_HYPERV_ENFORCE_CPUID, 1);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_set_hv_cpuid(vcpu);
|
2021-11-22 18:58:17 +01:00
|
|
|
|
|
|
|
|
best = kvm_get_supported_hv_cpuid();
|
|
|
|
|
|
2022-02-15 16:50:11 -08:00
|
|
|
run = vcpu->run;
|
2021-11-22 18:58:17 +01:00
|
|
|
|
2021-05-21 11:52:04 +02:00
|
|
|
switch (stage) {
|
|
|
|
|
case 0:
|
|
|
|
|
hcall->control = 0xdeadbeef;
|
|
|
|
|
hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 1:
|
|
|
|
|
hcall->control = HVCALL_POST_MESSAGE;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
feat.ebx |= HV_POST_MESSAGES;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_POST_MESSAGE;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
|
hcall->control = HVCALL_SIGNAL_EVENT;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
feat.ebx |= HV_SIGNAL_EVENTS;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_SIGNAL_EVENT;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
|
hcall->control = HVCALL_RESET_DEBUG_SESSION;
|
|
|
|
|
hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE;
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
dbg.eax |= HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_RESET_DEBUG_SESSION;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 7:
|
|
|
|
|
feat.ebx |= HV_DEBUGGING;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_RESET_DEBUG_SESSION;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_OPERATION_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 8:
|
|
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
recomm.eax |= HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_SUCCESS;
|
|
|
|
|
break;
|
|
|
|
|
case 10:
|
|
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 11:
|
|
|
|
|
recomm.eax |= HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_SUCCESS;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 12:
|
|
|
|
|
hcall->control = HVCALL_SEND_IPI;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 13:
|
|
|
|
|
recomm.eax |= HV_X64_CLUSTER_IPI_RECOMMENDED;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_SEND_IPI;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
|
|
|
|
|
break;
|
|
|
|
|
case 14:
|
|
|
|
|
/* Nothing in 'sparse banks' -> success */
|
|
|
|
|
hcall->control = HVCALL_SEND_IPI_EX;
|
|
|
|
|
hcall->expect = HV_STATUS_SUCCESS;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 15:
|
|
|
|
|
hcall->control = HVCALL_NOTIFY_LONG_SPIN_WAIT;
|
|
|
|
|
hcall->expect = HV_STATUS_ACCESS_DENIED;
|
|
|
|
|
break;
|
|
|
|
|
case 16:
|
|
|
|
|
recomm.ebx = 0xfff;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_NOTIFY_LONG_SPIN_WAIT;
|
2021-05-21 11:52:04 +02:00
|
|
|
hcall->expect = HV_STATUS_SUCCESS;
|
|
|
|
|
break;
|
|
|
|
|
case 17:
|
2021-07-30 14:26:25 +02:00
|
|
|
/* XMM fast hypercall */
|
|
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE | HV_HYPERCALL_FAST_BIT;
|
|
|
|
|
hcall->ud_expected = true;
|
|
|
|
|
break;
|
|
|
|
|
case 18:
|
|
|
|
|
feat.edx |= HV_X64_HYPERCALL_XMM_INPUT_AVAILABLE;
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE | HV_HYPERCALL_FAST_BIT;
|
2021-07-30 14:26:25 +02:00
|
|
|
hcall->ud_expected = false;
|
|
|
|
|
hcall->expect = HV_STATUS_SUCCESS;
|
|
|
|
|
break;
|
|
|
|
|
case 19:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
kvm_vm_free(vm);
|
|
|
|
|
return;
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
|
2022-02-15 16:50:11 -08:00
|
|
|
hv_set_cpuid(vcpu, best, &feat, &recomm, &dbg);
|
2021-05-21 11:52:04 +02:00
|
|
|
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
pr_debug("Stage %d: testing hcall: 0x%lx\n", stage, hcall->control);
|
2021-05-21 11:52:04 +02:00
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
vcpu_run(vcpu);
|
2021-05-21 11:52:04 +02:00
|
|
|
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
|
|
|
|
"unexpected exit reason: %u (%s)",
|
|
|
|
|
run->exit_reason, exit_reason_str(run->exit_reason));
|
|
|
|
|
|
2022-06-02 13:41:33 -07:00
|
|
|
switch (get_ucall(vcpu, &uc)) {
|
2021-05-21 11:52:04 +02:00
|
|
|
case UCALL_ABORT:
|
2022-06-08 22:45:15 +00:00
|
|
|
TEST_FAIL("%s at %s:%ld, arg1 = %lx, arg2 = %lx",
|
|
|
|
|
(const char *)uc.args[0], __FILE__,
|
|
|
|
|
uc.args[1], uc.args[2], uc.args[3]);
|
2021-05-21 11:52:04 +02:00
|
|
|
return;
|
|
|
|
|
case UCALL_DONE:
|
KVM: selftests: Mostly fix broken Hyper-V Features test
Explicitly do all setup at every stage of the Hyper-V Features test, e.g.
set the MSR/hypercall, enable capabilities, etc... Now that the VM is
recreated for every stage, values that are written into the VM's address
space, i.e. shared with the guest, are reset between sub-tests, as are
any capabilities, etc...
Fix the hypercall params as well, which were broken in the same rework.
The "hcall" struct/pointer needs to point at the hcall_params object, not
the set of hypercall pages.
The goofs were hidden by the test's dubious behavior of using '0' to
signal "done", i.e. the MSR test ran exactly one sub-test, and the
hypercall test was a gigantic nop.
Fixes: 6c1186430a80 ("KVM: selftests: Avoid KVM_SET_CPUID2 after KVM_RUN in hyperv_features test")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220608224516.3788274-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2022-06-08 22:45:14 +00:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
TEST_FAIL("Unhandled ucall: %ld", uc.cmd);
|
2021-05-21 11:52:04 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stage++;
|
2021-11-22 18:58:17 +01:00
|
|
|
kvm_vm_free(vm);
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
|
{
|
|
|
|
|
pr_info("Testing access to Hyper-V specific MSRs\n");
|
2021-11-22 18:58:17 +01:00
|
|
|
guest_test_msrs_access();
|
2021-05-21 11:52:04 +02:00
|
|
|
|
|
|
|
|
pr_info("Testing access to Hyper-V hypercalls\n");
|
2021-11-22 18:58:17 +01:00
|
|
|
guest_test_hcalls_access();
|
2021-05-21 11:52:04 +02:00
|
|
|
}
|