-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull kvm fixes from Paolo Bonzini: "x86: - Fixes for Xen emulation. While nobody should be enabling it in the kernel (the only public users of the feature are the selftests), the bug effectively allows userspace to read arbitrary memory. - Correctness fixes for nested hypervisors that do not intercept INIT or SHUTDOWN on AMD; the subsequent CPU reset can cause a use-after-free when it disables virtualization extensions. While downgrading the panic to a WARN is quite easy, the full fix is a bit more laborious; there are also tests. This is the bulk of the pull request. - Fix race condition due to incorrect mmu_lock use around make_mmu_pages_available(). Generic: - Obey changes to the kvm.halt_poll_ns module parameter in VMs not using KVM_CAP_HALT_POLL, restoring behavior from before the introduction of the capability" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: Update gfn_to_pfn_cache khva when it moves within the same page KVM: x86/xen: Only do in-kernel acceleration of hypercalls for guest CPL0 KVM: x86/xen: Validate port number in SCHEDOP_poll KVM: x86/mmu: Fix race condition in direct_page_fault KVM: x86: remove exit_int_info warning in svm_handle_exit KVM: selftests: add svm part to triple_fault_test KVM: x86: allow L1 to not intercept triple fault kvm: selftests: add svm nested shutdown test KVM: selftests: move idt_entry to header KVM: x86: forcibly leave nested mode on vCPU reset KVM: x86: add kvm_leave_nested KVM: x86: nSVM: harden svm_free_nested against freeing vmcb02 while still in use KVM: x86: nSVM: leave nested mode on vCPU free KVM: Obey kvm.halt_poll_ns in VMs not using KVM_CAP_HALT_POLL KVM: Avoid re-reading kvm->max_halt_poll_ns during halt-polling KVM: Cap vcpu->halt_poll_ns before halting rather than after
- Loading branch information
Showing
15 changed files
with
251 additions
and
83 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
tools/testing/selftests/kvm/x86_64/svm_nested_shutdown_test.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* svm_nested_shutdown_test | ||
* | ||
* Copyright (C) 2022, Red Hat, Inc. | ||
* | ||
* Nested SVM testing: test that unintercepted shutdown in L2 doesn't crash the host | ||
*/ | ||
|
||
#include "test_util.h" | ||
#include "kvm_util.h" | ||
#include "processor.h" | ||
#include "svm_util.h" | ||
|
||
static void l2_guest_code(struct svm_test_data *svm) | ||
{ | ||
__asm__ __volatile__("ud2"); | ||
} | ||
|
||
static void l1_guest_code(struct svm_test_data *svm, struct idt_entry *idt) | ||
{ | ||
#define L2_GUEST_STACK_SIZE 64 | ||
unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE]; | ||
struct vmcb *vmcb = svm->vmcb; | ||
|
||
generic_svm_setup(svm, l2_guest_code, | ||
&l2_guest_stack[L2_GUEST_STACK_SIZE]); | ||
|
||
vmcb->control.intercept &= ~(BIT(INTERCEPT_SHUTDOWN)); | ||
|
||
idt[6].p = 0; // #UD is intercepted but its injection will cause #NP | ||
idt[11].p = 0; // #NP is not intercepted and will cause another | ||
// #NP that will be converted to #DF | ||
idt[8].p = 0; // #DF will cause #NP which will cause SHUTDOWN | ||
|
||
run_guest(vmcb, svm->vmcb_gpa); | ||
|
||
/* should not reach here */ | ||
GUEST_ASSERT(0); | ||
} | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
struct kvm_vcpu *vcpu; | ||
struct kvm_run *run; | ||
vm_vaddr_t svm_gva; | ||
struct kvm_vm *vm; | ||
|
||
TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SVM)); | ||
|
||
vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code); | ||
vm_init_descriptor_tables(vm); | ||
vcpu_init_descriptor_tables(vcpu); | ||
|
||
vcpu_alloc_svm(vm, &svm_gva); | ||
|
||
vcpu_args_set(vcpu, 2, svm_gva, vm->idt); | ||
run = vcpu->run; | ||
|
||
vcpu_run(vcpu); | ||
TEST_ASSERT(run->exit_reason == KVM_EXIT_SHUTDOWN, | ||
"Got exit_reason other than KVM_EXIT_SHUTDOWN: %u (%s)\n", | ||
run->exit_reason, | ||
exit_reason_str(run->exit_reason)); | ||
|
||
kvm_vm_free(vm); | ||
} |
Oops, something went wrong.