• James Hogan's avatar
    MIPS: KVM: Fix modular KVM under QEMU · 797179bc
    James Hogan authored
    Copy __kvm_mips_vcpu_run() into unmapped memory, so that we can never
    get a TLB refill exception in it when KVM is built as a module.
    
    This was observed to happen with the host MIPS kernel running under
    QEMU, due to a not entirely transparent optimisation in the QEMU TLB
    handling where TLB entries replaced with TLBWR are copied to a separate
    part of the TLB array. Code in those pages continue to be executable,
    but those mappings persist only until the next ASID switch, even if they
    are marked global.
    
    An ASID switch happens in __kvm_mips_vcpu_run() at exception level after
    switching to the guest exception base. Subsequent TLB mapped kernel
    instructions just prior to switching to the guest trigger a TLB refill
    exception, which enters the guest exception handlers without updating
    EPC. This appears as a guest triggered TLB refill on a host kernel
    mapped (host KSeg2) address, which is not handled correctly as user
    (guest) mode accesses to kernel (host) segments always generate address
    error exceptions.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: kvm@vger.kernel.org
    Cc: linux-mips@linux-mips.org
    Cc: <stable@vger.kernel.org> # 3.10.x-
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    797179bc
mips.c 40.9 KB