• S
    KVM: x86: Flush the guest's TLB on INIT · df37ed38
    Sean Christopherson 提交于
    Flush the guest's TLB on INIT, as required by Intel's SDM.  Although
    AMD's APM states that the TLBs are unchanged by INIT, it's not clear that
    that's correct as the APM also states that the TLB is flush on "External
    initialization of the processor."  Regardless, relying on the guest to be
    paranoid is unnecessarily risky, while an unnecessary flush is benign
    from a functional perspective and likely has no measurable impact on
    guest performance.
    
    Note, as of the April 2021 version of Intels' SDM, it also contradicts
    itself with respect to TLB flushing.  The overview of INIT explicitly
    calls out the TLBs as being invalidated, while a table later in the same
    section says they are unchanged.
    
      9.1 INITIALIZATION OVERVIEW:
        The major difference is that during an INIT, the internal caches, MSRs,
        MTRRs, and x87 FPU state are left unchanged (although, the TLBs and BTB
        are invalidated as with a hardware reset)
    
      Table 9-1:
    
      Register                    Power up    Reset      INIT
      Data and Code Cache, TLBs:  Invalid[6]  Invalid[6] Unchanged
    
    Given Core2's erratum[*] about global TLB entries not being flush on INIT,
    it's safe to assume that the table is simply wrong.
    
      AZ28. INIT Does Not Clear Global Entries in the TLB
      Problem: INIT may not flush a TLB entry when:
        • The processor is in protected mode with paging enabled and the page global enable
          flag is set (PGE bit of CR4 register)
        • G bit for the page table entry is set
        • TLB entry is present in TLB when INIT occurs
        • Software may encounter unexpected page fault or incorrect address translation due
          to a TLB entry erroneously left in TLB after INIT.
    
      Workaround: Write to CR3, CR4 (setting bits PSE, PGE or PAE) or CR0 (setting
                  bits PG or PE) registers before writing to memory early in BIOS
                  code to clear all the global entries from TLB.
    
      Status: For the steppings affected, see the Summary Tables of Changes.
    
    [*] https://www.intel.com/content/dam/support/us/en/documents/processors/mobile/celeron/sb/320121.pdf
    
    Fixes: 6aa8b732 ("[PATCH] kvm: userspace interface")
    Signed-off-by: NSean Christopherson <seanjc@google.com>
    Message-Id: <20210713163324.627647-2-seanjc@google.com>
    Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
    df37ed38
x86.c 322.4 KB