]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
KVM: MIPS: Update exit handler for VZ
authorJames Hogan <james.hogan@imgtec.com>
Tue, 14 Mar 2017 10:15:30 +0000 (10:15 +0000)
committerJames Hogan <james.hogan@imgtec.com>
Tue, 28 Mar 2017 13:53:53 +0000 (14:53 +0100)
The general guest exit handler needs a few tweaks for VZ compared to
trap & emulate, which for now are made directly depending on
CONFIG_KVM_MIPS_VZ:

- There is no need to re-enable the hardware page table walker (HTW), as
  it can be left enabled during guest mode operation with VZ.

- There is no need to perform a privilege check, as any guest privilege
  violations should have already been detected by the hardware and
  triggered the appropriate guest exception.

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
arch/mips/kvm/mips.c

index 1fa088854cb66e6833d11aec91ff2f569a5587b1..8c10148a345c5e4692363085469ec793a6de535e 100644 (file)
@@ -1230,7 +1230,8 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
        vcpu->mode = OUTSIDE_GUEST_MODE;
 
        /* re-enable HTW before enabling interrupts */
-       htw_start();
+       if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
+               htw_start();
 
        /* Set a default exit reason */
        run->exit_reason = KVM_EXIT_UNKNOWN;
@@ -1248,17 +1249,20 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
                        cause, opc, run, vcpu);
        trace_kvm_exit(vcpu, exccode);
 
-       /*
-        * Do a privilege check, if in UM most of these exit conditions end up
-        * causing an exception to be delivered to the Guest Kernel
-        */
-       er = kvm_mips_check_privilege(cause, opc, run, vcpu);
-       if (er == EMULATE_PRIV_FAIL) {
-               goto skip_emul;
-       } else if (er == EMULATE_FAIL) {
-               run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
-               ret = RESUME_HOST;
-               goto skip_emul;
+       if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ)) {
+               /*
+                * Do a privilege check, if in UM most of these exit conditions
+                * end up causing an exception to be delivered to the Guest
+                * Kernel
+                */
+               er = kvm_mips_check_privilege(cause, opc, run, vcpu);
+               if (er == EMULATE_PRIV_FAIL) {
+                       goto skip_emul;
+               } else if (er == EMULATE_FAIL) {
+                       run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+                       ret = RESUME_HOST;
+                       goto skip_emul;
+               }
        }
 
        switch (exccode) {
@@ -1418,7 +1422,8 @@ skip_emul:
        }
 
        /* Disable HTW before returning to guest or host */
-       htw_stop();
+       if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
+               htw_stop();
 
        return ret;
 }