Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea1bdbf6 authored by James Hogan's avatar James Hogan
Browse files

KVM: MIPS: Update exit handler for VZ



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: default avatarJames 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
parent 60c7aa33
Loading
Loading
Loading
Loading
+18 −13
Original line number Original line Diff line number Diff line
@@ -1230,6 +1230,7 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
	vcpu->mode = OUTSIDE_GUEST_MODE;
	vcpu->mode = OUTSIDE_GUEST_MODE;


	/* re-enable HTW before enabling interrupts */
	/* re-enable HTW before enabling interrupts */
	if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
		htw_start();
		htw_start();


	/* Set a default exit reason */
	/* Set a default exit reason */
@@ -1248,9 +1249,11 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
			cause, opc, run, vcpu);
			cause, opc, run, vcpu);
	trace_kvm_exit(vcpu, exccode);
	trace_kvm_exit(vcpu, exccode);


	if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ)) {
		/*
		/*
	 * Do a privilege check, if in UM most of these exit conditions end up
		 * Do a privilege check, if in UM most of these exit conditions
	 * causing an exception to be delivered to the Guest Kernel
		 * end up causing an exception to be delivered to the Guest
		 * Kernel
		 */
		 */
		er = kvm_mips_check_privilege(cause, opc, run, vcpu);
		er = kvm_mips_check_privilege(cause, opc, run, vcpu);
		if (er == EMULATE_PRIV_FAIL) {
		if (er == EMULATE_PRIV_FAIL) {
@@ -1260,6 +1263,7 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
			ret = RESUME_HOST;
			ret = RESUME_HOST;
			goto skip_emul;
			goto skip_emul;
		}
		}
	}


	switch (exccode) {
	switch (exccode) {
	case EXCCODE_INT:
	case EXCCODE_INT:
@@ -1418,6 +1422,7 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
	}
	}


	/* Disable HTW before returning to guest or host */
	/* Disable HTW before returning to guest or host */
	if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
		htw_stop();
		htw_stop();


	return ret;
	return ret;