|
@@ -790,15 +790,15 @@ enum emulation_result kvm_mips_emul_eret(struct kvm_vcpu *vcpu)
|
|
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
|
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
|
enum emulation_result er = EMULATE_DONE;
|
|
enum emulation_result er = EMULATE_DONE;
|
|
|
|
|
|
- if (kvm_read_c0_guest_status(cop0) & ST0_EXL) {
|
|
|
|
|
|
+ if (kvm_read_c0_guest_status(cop0) & ST0_ERL) {
|
|
|
|
+ kvm_clear_c0_guest_status(cop0, ST0_ERL);
|
|
|
|
+ vcpu->arch.pc = kvm_read_c0_guest_errorepc(cop0);
|
|
|
|
+ } else if (kvm_read_c0_guest_status(cop0) & ST0_EXL) {
|
|
kvm_debug("[%#lx] ERET to %#lx\n", vcpu->arch.pc,
|
|
kvm_debug("[%#lx] ERET to %#lx\n", vcpu->arch.pc,
|
|
kvm_read_c0_guest_epc(cop0));
|
|
kvm_read_c0_guest_epc(cop0));
|
|
kvm_clear_c0_guest_status(cop0, ST0_EXL);
|
|
kvm_clear_c0_guest_status(cop0, ST0_EXL);
|
|
vcpu->arch.pc = kvm_read_c0_guest_epc(cop0);
|
|
vcpu->arch.pc = kvm_read_c0_guest_epc(cop0);
|
|
|
|
|
|
- } else if (kvm_read_c0_guest_status(cop0) & ST0_ERL) {
|
|
|
|
- kvm_clear_c0_guest_status(cop0, ST0_ERL);
|
|
|
|
- vcpu->arch.pc = kvm_read_c0_guest_errorepc(cop0);
|
|
|
|
} else {
|
|
} else {
|
|
kvm_err("[%#lx] ERET when MIPS_SR_EXL|MIPS_SR_ERL == 0\n",
|
|
kvm_err("[%#lx] ERET when MIPS_SR_EXL|MIPS_SR_ERL == 0\n",
|
|
vcpu->arch.pc);
|
|
vcpu->arch.pc);
|