lkml.org 
[lkml]   [2018]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 027/158] KVM: x86: Invert emulation re-execute behavior to make it opt-in
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Sean Christopherson <sean.j.christopherson@intel.com>

    commit 8065dbd1ee0ef04321d80da7999b4f0086e0a407 upstream.

    Re-execution of an instruction after emulation decode failure is
    intended to be used only when emulating shadow page accesses. Invert
    the flag to make allowing re-execution opt-in since that behavior is
    by far in the minority.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/include/asm/kvm_host.h | 8 +++-----
    arch/x86/kvm/mmu.c | 2 +-
    arch/x86/kvm/x86.c | 2 +-
    3 files changed, 5 insertions(+), 7 deletions(-)

    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -1199,7 +1199,7 @@ enum emulation_result {
    #define EMULTYPE_TRAP_UD (1 << 1)
    #define EMULTYPE_SKIP (1 << 2)
    #define EMULTYPE_RETRY (1 << 3)
    -#define EMULTYPE_NO_REEXECUTE (1 << 4)
    +#define EMULTYPE_ALLOW_REEXECUTE (1 << 4)
    #define EMULTYPE_NO_UD_ON_FAIL (1 << 5)
    #define EMULTYPE_VMWARE (1 << 6)
    int x86_emulate_instruction(struct kvm_vcpu *vcpu, unsigned long cr2,
    @@ -1208,15 +1208,13 @@ int x86_emulate_instruction(struct kvm_v
    static inline int emulate_instruction(struct kvm_vcpu *vcpu,
    int emulation_type)
    {
    - return x86_emulate_instruction(vcpu, 0,
    - emulation_type | EMULTYPE_NO_REEXECUTE, NULL, 0);
    + return x86_emulate_instruction(vcpu, 0, emulation_type, NULL, 0);
    }

    static inline int kvm_emulate_instruction_from_buffer(struct kvm_vcpu *vcpu,
    void *insn, int insn_len)
    {
    - return x86_emulate_instruction(vcpu, 0, EMULTYPE_NO_REEXECUTE,
    - insn, insn_len);
    + return x86_emulate_instruction(vcpu, 0, 0, insn, insn_len);
    }

    void kvm_enable_efer_bits(u64);
    --- a/arch/x86/kvm/mmu.c
    +++ b/arch/x86/kvm/mmu.c
    @@ -4960,7 +4960,7 @@ static int make_mmu_pages_available(stru
    int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code,
    void *insn, int insn_len)
    {
    - int r, emulation_type = EMULTYPE_RETRY;
    + int r, emulation_type = EMULTYPE_RETRY | EMULTYPE_ALLOW_REEXECUTE;
    enum emulation_result er;
    bool direct = vcpu->arch.mmu.direct_map;

    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -5810,7 +5810,7 @@ static bool reexecute_instruction(struct
    gpa_t gpa = cr2;
    kvm_pfn_t pfn;

    - if (emulation_type & EMULTYPE_NO_REEXECUTE)
    + if (!(emulation_type & EMULTYPE_ALLOW_REEXECUTE))
    return false;

    if (!vcpu->arch.mmu.direct_map) {

    \
     
     \ /
      Last update: 2018-09-18 01:24    [W:4.233 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site