On 7/16/19 6:56 PM, Liran Alon wrote: > AMD Errata 1096: > When CPU raise #NPF on guest data access and vCPU CR4.SMAP=1, it is > possible that CPU microcode implementing DecodeAssist will fail > to read bytes of instruction which caused #NPF. In this case, > GuestIntrBytes field of the VMCB on a VMEXIT will incorrectly > return 0 instead of the correct guest instruction bytes. > This happens because CPU microcode reading instruction bytes > uses a special opcode which attempts to read data using CPL=0 > priviledges. The microcode reads CS:RIP and if it hits a SMAP > fault, it gives up and returns no instruction bytes. > > Current KVM code which attemps to detect and workaround this errata have > multiple issues: > > 1) Code mistakenly checks if vCPU CR4.SMAP=0 instead of vCPU CR4.SMAP=1 which > is required for encountering a SMAP fault. > > 2) Code assumes SMAP fault can only occur when vCPU CPL==3. > However, the condition for a SMAP fault is a data access with CPL<3 > to a page mapped in page-tables as user-accessible (i.e. PTE with U/S > bit set to 1). > Therefore, in case vCPU CR4.SMEP=0, guest can execute an instruction > which reside in a user-accessible page with CPL<3 priviledge. If this > instruction raise a #NPF on it's data access, then CPU DecodeAssist > microcode will still encounter a SMAP violation. > Even though no sane OS will do so (as it's an obvious priviledge > escalation vulnerability), we still need to handle this semanticly > correct in KVM side. > > As CR4.SMAP=1 is an easy triggerable condition, attempt to avoid > false-positive of detecting errata by taking note that in case vCPU > CR4.SMEP=1, errata could only be encountered in case CPL==3 (As > otherwise, CPU would raise SMEP fault to guest instead of #NPF). > This can be a useful condition to avoid false-positive because guests > usually enable SMAP if they have also enabled SMEP. > > In addition, to avoid future confusion and improve code readbility, > comment errata details in code and not just in commit message. > > Fixes: 05d5a4863525 ("KVM: SVM: Workaround errata#1096 (insn_len maybe zero on SMAP violation)") > Cc: Singh Brijesh <brijesh.singh@xxxxxxx> > Cc: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Reviewed-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > Signed-off-by: Liran Alon <liran.alon@xxxxxxxxxx> > --- > arch/x86/kvm/svm.c | 42 +++++++++++++++++++++++++++++++++++------- > 1 file changed, 35 insertions(+), 7 deletions(-) > Reviewed-by: Brijesh Singh <brijesh.singh@xxxxxxx> thanks