Re: [PATCH RFC] KVM: nSVM: Fix L1 state corruption upon return from SMM

From: Paolo Bonzini
Date: Thu Jun 24 2021 - 06:38:19 EST


On 24/06/21 10:20, Maxim Levitsky wrote:
Something else to note, just for our information is that KVM
these days does vmsave/vmload to VM_HSAVE_PA to store/restore
the additional host state, something that is frowned upon in the spec,
but there is some justification of doing this in the commit message,
citing an old spec which allowed this.

True that. And there is no mention in the specification for VMRUN that the host state-save area is a subset of the VMCB format (i.e., that it uses VMCB offsets for whatever subset of the state it saves in the VMCB), so the spec reference in the commit message is incorrect. It would be nice if the spec guaranteed that. Michael, Tom?

In fact, Vitaly's patch *will* overwrite the vmsave/vmload parts of VM_HSAVE_PA, and it will store the L2 values rather than the L1 values, because KVM always does its vmload/vmrun/vmsave sequence using vmload(vmcs01) and vmsave(vmcs01)! So that has to be changed to use code similar to svm_set_nested_state (which can be moved to a separate function and reused):

dest->es = src->es;
dest->cs = src->cs;
dest->ss = src->ss;
dest->ds = src->ds;
dest->gdtr = src->gdtr;
dest->idtr = src->idtr;
dest->rflags = src->rflags | X86_EFLAGS_FIXED;
dest->efer = src->efer;
dest->cr0 = src->cr0;
dest->cr3 = src->cr3;
dest->cr4 = src->cr4;
dest->rax = src->rax;
dest->rsp = src->rsp;
dest->rip = src->rip;
dest->cpl = 0;


Paolo