Plumb the MMIO checking code into the MMIO fault handling code. Nothing allows a region to be registered yet, so there should be no funtional change either. Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> --- arch/arm64/kvm/mmio.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/arch/arm64/kvm/mmio.c b/arch/arm64/kvm/mmio.c index 3dd38a151d2a..dfa375823264 100644 --- a/arch/arm64/kvm/mmio.c +++ b/arch/arm64/kvm/mmio.c @@ -6,6 +6,7 @@ #include <linux/kvm_host.h> #include <asm/kvm_emulate.h> +#include <asm/kvm_mmu.h> #include <trace/events/kvm.h> #include "trace.h" @@ -135,6 +136,13 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa) * volunteered to do so, and bail out otherwise. */ if (!kvm_vcpu_dabt_isvalid(vcpu)) { + /* With MMIO guard enabled, the guest should know better */ + if (test_bit(KVM_ARCH_FLAG_MMIO_GUARD, + &vcpu->kvm->arch.flags)) { + kvm_inject_dabt(vcpu, kvm_vcpu_get_hfar(vcpu)); + return 1; + } + if (test_bit(KVM_ARCH_FLAG_RETURN_NISV_IO_ABORT_TO_USER, &vcpu->kvm->arch.flags)) { run->exit_reason = KVM_EXIT_ARM_NISV; @@ -156,6 +164,15 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa) len = kvm_vcpu_dabt_get_as(vcpu); rt = kvm_vcpu_dabt_get_rd(vcpu); + /* Check failed? Return to the guest for debriefing... */ + if (!kvm_check_ioguard_page(vcpu, fault_ipa)) + return 1; + + /* If we cross a page boundary, check that too... */ + if (((fault_ipa + len - 1) & PAGE_MASK) != (fault_ipa & PAGE_MASK) && + !kvm_check_ioguard_page(vcpu, fault_ipa + len - 1)) + return 1; + if (is_write) { data = vcpu_data_guest_to_host(vcpu, vcpu_get_reg(vcpu, rt), len); -- 2.30.2