Re: [PATCH v5 0/6] KVM: nested virt SMM fixes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 11, 2017 at 6:06 PM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
> On 11/10/2017 16:54, Ladi Prosek wrote:
>> Windows Server 2016 with Hyper-V enabled fails to boot on OVMF with SMM
>> (OVMF_CODE-need-smm.fd). Turns out that the SMM emulation code in KVM
>> does not handle nested virtualization very well, leading to a whole bunch
>> of issues.
>>
>> For example, Hyper-V uses descriptor table exiting (SECONDARY_EXEC_DESC)
>> so when the SMM handler tries to switch from real mode a VM exit occurs
>> and is forwarded to a clueless L1.
>>
>> This series fixes it by switching the vcpu to !guest_mode, i.e. to the L1
>> state, before entering SMM and then switching back to L2 as part of
>> emulating the RSM instruction.
>>
>> Patches 1 and 2 are common for both Intel and AMD, patches 3-4 fix Intel,
>> and patches 5-6 AMD.
>>
>> v1->v2:
>> * Moved left_smm detection to emulator_set_hflags (couldn't quite get rid
>>   of the field despite my original claim) (Paolo)
>> * Moved the kvm_x86_ops->post_leave_smm() call a few statements down so
>>   it really runs after all state has been synced.
>> * Added the smi_allowed callback (new patch 2) to avoid running into
>>   WARN_ON_ONCE(vmx->nested.nested_run_pending) on Intel.
>>
>> v2->v3:
>> * Ommitted patch 4 ("KVM: nVMX: save nested EPT information in SMRAM state
>>   save map") and replaced it with ("treat CR4.VMXE as reserved in SMM")
>>   (Paolo)
>> * Implemented smi_allowed on AMD to support SMI interception. Turns out
>>   Windows needs this when running on >1 vCPU.
>> * Eliminated internal SMM state on AMD and switched to using the SMM state
>>   save area in guest memory instead (Paolo)
>>
>> v3->v4:
>> * Changed the order of operations in enter_smm(), now saving the original
>>   (and potentially L2) state into the SMM state save area.
>> * Made em_rsm() reload the SMM state save area if post_leave_smm() entered
>>   guest mode. This way, SMM handlers see and may change the actual state
>>   of the vCPU at the point where SMI was injected (Radim)
>> * In patch 4, switched to a different way of avoiding the problem of hitting
>>   the very check the patch is adding.
>>
>> v4->v5:
>> * Removed patch 4 (CR4.VMXE protection in SMM, will be done separately),
>>   patch 3 bacame 4 and new patch 3 fixes a bug in load_vmcs12_host_state()
>>   which prevented SMM exit to L2 from working without first restoring the
>>   state from the SMM state save area.
>> * Eliminated the first restore from SMM state save area (Paolo)
>> * Tweaked the HF_SMM_MASK flag manipulation (Paolo)
>
> Queued, thanks for persisting!

Thank you and Radim for all the help!



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux