• James Hogan's avatar
    MIPS: KVM: Fix CACHE triggered exception emulation · 6df82a7b
    James Hogan authored
    When emulating TLB miss / invalid exceptions during CACHE instruction
    emulation, be sure to set up the correct PC and host_cp0_badvaddr state
    for the kvm_mips_emlulate_tlb*_ld() function to pick up for guest EPC
    and BadVAddr.
    
    PC needs to be rewound otherwise the guest EPC will end up pointing at
    the next instruction after the faulting CACHE instruction.
    
    host_cp0_badvaddr must be set because guest CACHE instructions trap with
    a Coprocessor Unusable exception, which doesn't update the host BadVAddr
    as a TLB exception would.
    
    This doesn't tend to get hit when dynamic translation of emulated
    instructions is enabled, since only the first execution of each CACHE
    instruction actually goes through this code path, with subsequent
    executions hitting the SYNCI instruction that it gets replaced with.
    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>
    6df82a7b
emulate.c 69 KB