From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Auger Subject: Re: [PATCH v2 2/5] KVM: ARM: on IO mem abort - route the call to KVM MMIO bus Date: Mon, 12 Jan 2015 18:09:13 +0100 Message-ID: <54B3FFB9.3050406@linaro.org> References: <20141207093641.17563.84226.stgit@i3820> <20141207093749.17563.12497.stgit@i3820> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Cc: tech@virtualopensystems.com, linux-arm-kernel@lists.infradead.org To: Nikolay Nikolaev , kvm@vger.kernel.org, marc.zyngier@arm.com, andre.przywara@arm.com, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org Return-path: Received: from mail-wg0-f43.google.com ([74.125.82.43]:43179 "EHLO mail-wg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751008AbbALRKz (ORCPT ); Mon, 12 Jan 2015 12:10:55 -0500 Received: by mail-wg0-f43.google.com with SMTP id k14so20508614wgh.2 for ; Mon, 12 Jan 2015 09:10:54 -0800 (PST) In-Reply-To: <20141207093749.17563.12497.stgit@i3820> Sender: kvm-owner@vger.kernel.org List-ID: Hi Nikolay, On 12/07/2014 10:37 AM, Nikolay Nikolaev wrote: > On IO memory abort, try to handle the MMIO access thorugh the KVM > registered read/write callbacks. This is done by invoking the relevant > kvm_io_bus_* API. > > Signed-off-by: Nikolay Nikolaev > --- > arch/arm/kvm/mmio.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c > index 4cb5a93..e42469f 100644 > --- a/arch/arm/kvm/mmio.c > +++ b/arch/arm/kvm/mmio.c > @@ -162,6 +162,36 @@ static int decode_hsr(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, > return 0; > } > > +/** > + * handle_kernel_mmio - handle an in-kernel MMIO access > + * @vcpu: pointer to the vcpu performing the access > + * @run: pointer to the kvm_run structure > + * @mmio: pointer to the data describing the access > + * > + * returns true if the MMIO access has been performed in kernel space, > + * and false if it needs to be emulated in user space. > + */ > +static bool handle_kernel_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run, > + struct kvm_exit_mmio *mmio) > +{ > + int ret; > + > + if (mmio->is_write) { > + ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, mmio->phys_addr, > + mmio->len, &mmio->data); > + > + } else { > + ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, mmio->phys_addr, > + mmio->len, &mmio->data); > + } > + if (!ret) { > + kvm_prepare_mmio(run, mmio); > + kvm_handle_mmio_return(vcpu, run); > + } > + > + return !ret; in case ret < 0 (-EOPNOTSUPP = -95) aren't we returning true too? return (ret==0)? > +} > + > int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run, > phys_addr_t fault_ipa) > { > @@ -200,6 +230,9 @@ int io_mem_abort(struct kvm_vcpu *vcpu, struct kvm_run *run, > if (vgic_handle_mmio(vcpu, run, &mmio)) > return 1; > > + if (handle_kernel_mmio(vcpu, run, &mmio)) > + return 1; > + > kvm_prepare_mmio(run, &mmio); > return 0; currently the io_mem_abort returned value is not used by mmu.c code. I think this should be handed in kvm_handle_guest_abort. What do you think? Best Regards Eric > } >