summaryrefslogtreecommitdiffstats
path: root/arch/mips/kvm/interrupt.c
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-11-14 23:59:27 +0000
committerJames Hogan <james.hogan@imgtec.com>2017-02-03 15:21:30 +0000
commit7801bbe1bd907a8f8b136fc184583260508febb6 (patch)
tree657af8c96b0d433c9fe1297756fa2c80bfddb321 /arch/mips/kvm/interrupt.c
parent654229a02456a9af372defb13d1911345360074d (diff)
downloadop-kernel-dev-7801bbe1bd907a8f8b136fc184583260508febb6.zip
op-kernel-dev-7801bbe1bd907a8f8b136fc184583260508febb6.tar.gz
KVM: MIPS/T&E: Implement CP0_EBase register
The CP0_EBase register is a standard feature of MIPS32r2, so we should always have been implementing it properly. However the register value was ignored and wasn't exposed to userland. Fix the emulation of exceptions and interrupts to use the value stored in guest CP0_EBase, and fix the masks so that the top 3 bits (rather than the standard 2) are fixed, so that it is always in the guest KSeg0 segment. Also add CP0_EBASE to the KVM one_reg interface so it can be accessed by userland, also allowing the CPU number field to be written (which isn't permitted by the guest). Signed-off-by: James 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: linux-mips@linux-mips.org Cc: kvm@vger.kernel.org
Diffstat (limited to 'arch/mips/kvm/interrupt.c')
-rw-r--r--arch/mips/kvm/interrupt.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/mips/kvm/interrupt.c b/arch/mips/kvm/interrupt.c
index e88403b..aa0a1a0 100644
--- a/arch/mips/kvm/interrupt.c
+++ b/arch/mips/kvm/interrupt.c
@@ -183,10 +183,11 @@ int kvm_mips_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority,
(exccode << CAUSEB_EXCCODE));
/* XXXSL Set PC to the interrupt exception entry point */
+ arch->pc = kvm_mips_guest_exception_base(vcpu);
if (kvm_read_c0_guest_cause(cop0) & CAUSEF_IV)
- arch->pc = KVM_GUEST_KSEG0 + 0x200;
+ arch->pc += 0x200;
else
- arch->pc = KVM_GUEST_KSEG0 + 0x180;
+ arch->pc += 0x180;
clear_bit(priority, &vcpu->arch.pending_exceptions);
}
OpenPOWER on IntegriCloud