summaryrefslogtreecommitdiffstats
path: root/arch/mips/kvm/mips.c
diff options
context:
space:
mode:
authorJames Hogan <james.hogan@imgtec.com>2016-06-23 18:34:46 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2016-07-05 16:08:55 +0200
commit1f9ca62cbc5f4d1663a0f0d193156ce9dc6ed452 (patch)
tree263a795bad14def08539b3c8947ed5f176b4f52d /arch/mips/kvm/mips.c
parentMIPS: KVM: Dynamically choose scratch registers (diff)
downloadlinux-1f9ca62cbc5f4d1663a0f0d193156ce9dc6ed452.tar.xz
linux-1f9ca62cbc5f4d1663a0f0d193156ce9dc6ed452.zip
MIPS: KVM: Relative branch to common exit handler
Use a relative branch to get from the individual exception vectors to the common guest exit handler, rather than loading the address of the exit handler and jumping to it. This is made easier due to the fact we are now generating the entry code dynamically. This will also allow the exception code to be further reduced in future patches. 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 Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/mips/kvm/mips.c')
-rw-r--r--arch/mips/kvm/mips.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
index 26cc0b93c565..7c76768ff364 100644
--- a/arch/mips/kvm/mips.c
+++ b/arch/mips/kvm/mips.c
@@ -265,7 +265,7 @@ static inline void dump_handler(const char *symbol, void *start, void *end)
struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
{
int err, size;
- void *gebase, *p;
+ void *gebase, *p, *handler;
int i;
struct kvm_vcpu *vcpu = kzalloc(sizeof(struct kvm_vcpu), GFP_KERNEL);
@@ -304,22 +304,24 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
vcpu->arch.guest_ebase = gebase;
/* Build guest exception vectors dynamically in unmapped memory */
+ handler = gebase + 0x2000;
/* TLB Refill, EXL = 0 */
- kvm_mips_build_exception(gebase);
+ kvm_mips_build_exception(gebase, handler);
/* General Exception Entry point */
- kvm_mips_build_exception(gebase + 0x180);
+ kvm_mips_build_exception(gebase + 0x180, handler);
/* For vectored interrupts poke the exception code @ all offsets 0-7 */
for (i = 0; i < 8; i++) {
kvm_debug("L1 Vectored handler @ %p\n",
gebase + 0x200 + (i * VECTORSPACING));
- kvm_mips_build_exception(gebase + 0x200 + i * VECTORSPACING);
+ kvm_mips_build_exception(gebase + 0x200 + i * VECTORSPACING,
+ handler);
}
/* General exit handler */
- p = gebase + 0x2000;
+ p = handler;
p = kvm_mips_build_exit(p);
/* Guest entry routine */