• James Hogan's avatar
    MIPS: KVM: Don't unwind PC when emulating CACHE · cc81e948
    James Hogan authored
    When a CACHE instruction is emulated by kvm_mips_emulate_cache(), the PC
    is first updated to point to the next instruction, and afterwards it
    falls through the "dont_update_pc" label, which rewinds the PC back to
    its original address.
    
    This works when dynamic translation of emulated instructions is enabled,
    since the CACHE instruction is replaced with a SYNCI which works without
    trapping, however when dynamic translation is disabled the guest hangs
    on CACHE instructions as they always trap and are never stepped over.
    
    Roughly swap the meanings of the "done" and "dont_update_pc" to match
    kvm_mips_emulate_CP0(), so that "done" will roll back the PC on failure,
    and "dont_update_pc" won't change PC at all (for the sake of exceptions
    that have already modified the PC).
    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
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    cc81e948
emulate.c 68.9 KB