]> git.baikalelectronics.ru Git - kernel.git/commit
KVM: arm64: Assume write fault on S1PTW permission fault on instruction fetch
authorMarc Zyngier <maz@kernel.org>
Tue, 15 Sep 2020 10:42:17 +0000 (11:42 +0100)
committerMarc Zyngier <maz@kernel.org>
Fri, 18 Sep 2020 17:01:48 +0000 (18:01 +0100)
commit2540b1eeaecfd1f3094b39c8e107c86372988260
tree1bcc372ed898fb2ec9f0529ef6daa6847616efeb
parent066be0958686f2c849bc78a712b5c3dc6d7e6e8e
KVM: arm64: Assume write fault on S1PTW permission fault on instruction fetch

KVM currently assumes that an instruction abort can never be a write.
This is in general true, except when the abort is triggered by
a S1PTW on instruction fetch that tries to update the S1 page tables
(to set AF, for example).

This can happen if the page tables have been paged out and brought
back in without seeing a direct write to them (they are thus marked
read only), and the fault handling code will make the PT executable(!)
instead of writable. The guest gets stuck forever.

In these conditions, the permission fault must be considered as
a write so that the Stage-1 update can take place. This is essentially
the I-side equivalent of the problem fixed by 1ff97ad58a0b ("arm64: KVM:
Take S1 walks into account when determining S2 write faults").

Update kvm_is_write_fault() to return true on IABT+S1PTW, and introduce
kvm_vcpu_trap_is_exec_fault() that only return true when no faulting
on a S1 fault. Additionally, kvm_vcpu_dabt_iss1tw() is renamed to
kvm_vcpu_abt_iss1tw(), as the above makes it plain that it isn't
specific to data abort.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Will Deacon <will@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20200915104218.1284701-2-maz@kernel.org
arch/arm64/include/asm/kvm_emulate.h
arch/arm64/kvm/hyp/include/hyp/switch.h
arch/arm64/kvm/mmu.c