Skip to content

Commit 1229630

Browse files
James MorseMarc Zyngier
authored andcommitted
KVM: arm64: Stop handle_exit() from handling HVC twice when an SError occurs
Prior to commit defe21f ("KVM: arm64: Move PC rollback on SError to HYP"), when an SError is synchronised due to another exception, KVM handles the SError first. If the guest survives, the instruction that triggered the original exception is re-exectued to handle the first exception. HVC is treated as a special case as the instruction wouldn't normally be re-exectued, as its not a trap. Commit defe21f didn't preserve the behaviour of the 'return 1' that skips the rest of handle_exit(). Since commit defe21f, KVM will try to handle the SError and the original exception at the same time. When the exception was an HVC, fixup_guest_exit() has already rolled back ELR_EL2, meaning if the guest has virtual SError masked, it will execute and handle the HVC twice. Restore the original behaviour. Fixes: defe21f ("KVM: arm64: Move PC rollback on SError to HYP") Cc: stable@vger.kernel.org Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20220127122052.1584324-4-james.morse@arm.com
1 parent 1c71dbc commit 1229630

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

arch/arm64/kvm/handle_exit.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,14 @@ int handle_exit(struct kvm_vcpu *vcpu, int exception_index)
228228
{
229229
struct kvm_run *run = vcpu->run;
230230

231+
if (ARM_SERROR_PENDING(exception_index)) {
232+
/*
233+
* The SError is handled by handle_exit_early(). If the guest
234+
* survives it will re-execute the original instruction.
235+
*/
236+
return 1;
237+
}
238+
231239
exception_index = ARM_EXCEPTION_CODE(exception_index);
232240

233241
switch (exception_index) {

0 commit comments

Comments
 (0)