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: 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
This commit is contained in:
parent
60c7aa3320
commit
ea1bdbf683
|
@ -1230,7 +1230,8 @@ 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 */
|
||||||
htw_start();
|
if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
|
||||||
|
htw_start();
|
||||||
|
|
||||||
/* Set a default exit reason */
|
/* Set a default exit reason */
|
||||||
run->exit_reason = KVM_EXIT_UNKNOWN;
|
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);
|
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
|
/*
|
||||||
* causing an exception to be delivered to the Guest Kernel
|
* Do a privilege check, if in UM most of these exit conditions
|
||||||
*/
|
* end up causing an exception to be delivered to the Guest
|
||||||
er = kvm_mips_check_privilege(cause, opc, run, vcpu);
|
* Kernel
|
||||||
if (er == EMULATE_PRIV_FAIL) {
|
*/
|
||||||
goto skip_emul;
|
er = kvm_mips_check_privilege(cause, opc, run, vcpu);
|
||||||
} else if (er == EMULATE_FAIL) {
|
if (er == EMULATE_PRIV_FAIL) {
|
||||||
run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
goto skip_emul;
|
||||||
ret = RESUME_HOST;
|
} else if (er == EMULATE_FAIL) {
|
||||||
goto skip_emul;
|
run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||||
|
ret = RESUME_HOST;
|
||||||
|
goto skip_emul;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (exccode) {
|
switch (exccode) {
|
||||||
|
@ -1418,7 +1422,8 @@ skip_emul:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable HTW before returning to guest or host */
|
/* Disable HTW before returning to guest or host */
|
||||||
htw_stop();
|
if (!IS_ENABLED(CONFIG_KVM_MIPS_VZ))
|
||||||
|
htw_stop();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue