diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-06-20 11:25:44 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-06-20 11:25:44 -0400 |
commit | af52739b922f656eb1f39016fabaabe4baeda2e2 (patch) | |
tree | 79a7aa810d0493cd0cf4adebac26d37f12e8b545 /arch/mips/kvm/emulate.c | |
parent | 25ed6a5e97809129a1bc852b6b5c7d03baa112c4 (diff) | |
parent | 33688abb2802ff3a230bd2441f765477b94cc89e (diff) |
Merge 4.7-rc4 into staging-next
We want the fixes in here, and we can resolve a merge issue in
drivers/iio/industrialio-trigger.c
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/mips/kvm/emulate.c')
-rw-r--r-- | arch/mips/kvm/emulate.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c index 396df6eb0a12..645c8a1982a7 100644 --- a/arch/mips/kvm/emulate.c +++ b/arch/mips/kvm/emulate.c | |||
@@ -1636,6 +1636,7 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, | |||
1636 | if (index < 0) { | 1636 | if (index < 0) { |
1637 | vcpu->arch.host_cp0_entryhi = (va & VPN2_MASK); | 1637 | vcpu->arch.host_cp0_entryhi = (va & VPN2_MASK); |
1638 | vcpu->arch.host_cp0_badvaddr = va; | 1638 | vcpu->arch.host_cp0_badvaddr = va; |
1639 | vcpu->arch.pc = curr_pc; | ||
1639 | er = kvm_mips_emulate_tlbmiss_ld(cause, NULL, run, | 1640 | er = kvm_mips_emulate_tlbmiss_ld(cause, NULL, run, |
1640 | vcpu); | 1641 | vcpu); |
1641 | preempt_enable(); | 1642 | preempt_enable(); |
@@ -1647,6 +1648,8 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, | |||
1647 | * invalid exception to the guest | 1648 | * invalid exception to the guest |
1648 | */ | 1649 | */ |
1649 | if (!TLB_IS_VALID(*tlb, va)) { | 1650 | if (!TLB_IS_VALID(*tlb, va)) { |
1651 | vcpu->arch.host_cp0_badvaddr = va; | ||
1652 | vcpu->arch.pc = curr_pc; | ||
1650 | er = kvm_mips_emulate_tlbinv_ld(cause, NULL, | 1653 | er = kvm_mips_emulate_tlbinv_ld(cause, NULL, |
1651 | run, vcpu); | 1654 | run, vcpu); |
1652 | preempt_enable(); | 1655 | preempt_enable(); |
@@ -1666,7 +1669,7 @@ enum emulation_result kvm_mips_emulate_cache(uint32_t inst, uint32_t *opc, | |||
1666 | cache, op, base, arch->gprs[base], offset); | 1669 | cache, op, base, arch->gprs[base], offset); |
1667 | er = EMULATE_FAIL; | 1670 | er = EMULATE_FAIL; |
1668 | preempt_enable(); | 1671 | preempt_enable(); |
1669 | goto dont_update_pc; | 1672 | goto done; |
1670 | 1673 | ||
1671 | } | 1674 | } |
1672 | 1675 | ||
@@ -1694,16 +1697,20 @@ skip_fault: | |||
1694 | kvm_err("NO-OP CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n", | 1697 | kvm_err("NO-OP CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n", |
1695 | cache, op, base, arch->gprs[base], offset); | 1698 | cache, op, base, arch->gprs[base], offset); |
1696 | er = EMULATE_FAIL; | 1699 | er = EMULATE_FAIL; |
1697 | preempt_enable(); | ||
1698 | goto dont_update_pc; | ||
1699 | } | 1700 | } |
1700 | 1701 | ||
1701 | preempt_enable(); | 1702 | preempt_enable(); |
1703 | done: | ||
1704 | /* Rollback PC only if emulation was unsuccessful */ | ||
1705 | if (er == EMULATE_FAIL) | ||
1706 | vcpu->arch.pc = curr_pc; | ||
1702 | 1707 | ||
1703 | dont_update_pc: | 1708 | dont_update_pc: |
1704 | /* Rollback PC */ | 1709 | /* |
1705 | vcpu->arch.pc = curr_pc; | 1710 | * This is for exceptions whose emulation updates the PC, so do not |
1706 | done: | 1711 | * overwrite the PC under any circumstances |
1712 | */ | ||
1713 | |||
1707 | return er; | 1714 | return er; |
1708 | } | 1715 | } |
1709 | 1716 | ||