]> git.baikalelectronics.ru Git - kernel.git/commit
KVM: arm64: Stop handle_exit() from handling HVC twice when an SError occurs
authorJames Morse <james.morse@arm.com>
Thu, 27 Jan 2022 12:20:51 +0000 (12:20 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 3 Feb 2022 09:20:05 +0000 (09:20 +0000)
commite51014763540c7c4458445ea8e72c3c2efc122ab
treedba4454a67f3e3946d7a4caf780f5a710866df11
parentaeb7a294c291ee4bba1a43d32d609132499cd862
KVM: arm64: Stop handle_exit() from handling HVC twice when an SError occurs

Prior to commit f02b3c0497d4 ("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 f02b3c0497d4 didn't preserve the behaviour of the 'return 1'
that skips the rest of handle_exit().

Since commit f02b3c0497d4, 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: f02b3c0497d4 ("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
arch/arm64/kvm/handle_exit.c