Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp669460img; Fri, 22 Mar 2019 06:16:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqz6BS3Dcjg3lJAGrr5e3FVz7ywE2qSOFcmWzlTnh6qhRf6VIoTvodegZFbBt2dHMHGAkR8X X-Received: by 2002:a63:2ad4:: with SMTP id q203mr9088369pgq.43.1553260563813; Fri, 22 Mar 2019 06:16:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553260563; cv=none; d=google.com; s=arc-20160816; b=V2OyvP3Khdpmj49iCX/NZaHonhs5/tZljQubgeVAawwYB3SKncvFTjaDoJIBWm8TPg niCM19s6/3ffYuQAknOWmWkiMaJSs3sAL8zUSK51yUMmpDuBKwGq9Po+j8musMQX8h3y 1JkeaLZYlRnXkUftFogzumBAyjmNuE1RQTQorUeISpB8LxT0iyF+Jl1GgQ6FsZebeshb P27kGPWRDlQfHX6VjDleCLw6QMHjDUhft/U9D6V9VDHHIl+Qd1U/4+GJyk3m4wvU5TzZ Rxrjloh+kapqw8jbX5Esehlh4y1kwArtFev+cgMWKYExQ7enkKlST5PQorOB52y2+6RR 9wAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Yiz02MZynUbGi1GtXenpzDNSdNaVAwiCUs/Zf0UQtKE=; b=XBAF9juRNszfkqXdFzeBGHKdT6evG9NMu1V9brWu7exx9O4I6NVCIPaTjeRSOdNSGz e0rQE/yyEjPuq9/ztpsih8Om5jIT4NJJOM/Hyy0FIPZnXTANUkMh7PiaXB1VKAVkwXZe MTCaDm4x5onAnZDRdI8J2ic6I93sdUAuNDUFWybzUQlbIRnWlM97QMMwE4MlgDu5HqB4 6IO3r4RxNwPe/R1A1I2kX2HJ+0DGvNzLEuDekIwwbhTfFY+k7yM6u09lx7BvH+pV7/ni xqc7dQa3aQHul0Qr+VUDo9TQZ17QPwCPcZA1PgSraONQHbLzWTXDT672WRGDf1SqcA0p 4W2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=noPPEUHn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l127si6789596pfl.2.2019.03.22.06.15.46; Fri, 22 Mar 2019 06:16:03 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=noPPEUHn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729788AbfCVL3X (ORCPT + 99 others); Fri, 22 Mar 2019 07:29:23 -0400 Received: from mail.kernel.org ([198.145.29.99]:57204 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729198AbfCVL3U (ORCPT ); Fri, 22 Mar 2019 07:29:20 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EF72C21939; Fri, 22 Mar 2019 11:29:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553254159; bh=SV6XOiXnZD3mO8ReoUkOsLkfx5rEmMY0xQCqBDed/CE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=noPPEUHneG6cbEp56kPnat43fHKWb//CSpT5P8NE0GCEULMf9gdjElHfRpZ1/yaMH OE3s+bBL7GSAGN6HIjcgFPxQZLoOENJRPs8/UpFfVEH7YpX3LOYhpyn7PxT5J0Lz6J 3YxXJiStKlYGs5yYtW5CN9SD3YyKKqYhVNtioXK4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andre Przywara , Christoffer Dall , Marc Zyngier Subject: [PATCH 4.4 050/230] KVM: arm/arm64: Fix MMIO emulation data handling Date: Fri, 22 Mar 2019 12:13:08 +0100 Message-Id: <20190322111240.212072102@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111236.796964179@linuxfoundation.org> References: <20190322111236.796964179@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Christoffer Dall commit 83091db981e105d97562d3ed3ffe676e21927e3a upstream. When the kernel was handling a guest MMIO read access internally, we need to copy the emulation result into the run->mmio structure in order for the kvm_handle_mmio_return() function to pick it up and inject the result back into the guest. Currently the only user of kvm_io_bus for ARM is the VGIC, which did this copying itself, so this was not causing issues so far. But with the upcoming new vgic implementation we need this done properly. Update the kvm_handle_mmio_return description and cleanup the code to only perform a single copying when needed. Code and commit message inspired by Andre Przywara. Reported-by: Andre Przywara Signed-off-by: Christoffer Dall Signed-off-by: Andre Przywara Reviewed-by: Marc Zyngier Reviewed-by: Andre Przywara Signed-off-by: Marc Zyngier Signed-off-by: Greg Kroah-Hartman --- arch/arm/kvm/mmio.c | 11 ++++++----- virt/kvm/arm/vgic.c | 7 ------- 2 files changed, 6 insertions(+), 12 deletions(-) --- a/arch/arm/kvm/mmio.c +++ b/arch/arm/kvm/mmio.c @@ -87,11 +87,10 @@ static unsigned long mmio_read_buf(char /** * kvm_handle_mmio_return -- Handle MMIO loads after user space emulation + * or in-kernel IO emulation + * * @vcpu: The VCPU pointer * @run: The VCPU run struct containing the mmio data - * - * This should only be called after returning from userspace for MMIO load - * emulation. */ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) { @@ -207,15 +206,17 @@ int io_mem_abort(struct kvm_vcpu *vcpu, run->mmio.is_write = is_write; run->mmio.phys_addr = fault_ipa; run->mmio.len = len; - if (is_write) - memcpy(run->mmio.data, data_buf, len); if (!ret) { /* We handled the access successfully in the kernel. */ + if (!is_write) + memcpy(run->mmio.data, data_buf, len); kvm_handle_mmio_return(vcpu, run); return 1; } + if (is_write) + memcpy(run->mmio.data, data_buf, len); run->exit_reason = KVM_EXIT_MMIO; return 0; } --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c @@ -821,7 +821,6 @@ static int vgic_handle_mmio_access(struc struct vgic_dist *dist = &vcpu->kvm->arch.vgic; struct vgic_io_device *iodev = container_of(this, struct vgic_io_device, dev); - struct kvm_run *run = vcpu->run; const struct vgic_io_range *range; struct kvm_exit_mmio mmio; bool updated_state; @@ -850,12 +849,6 @@ static int vgic_handle_mmio_access(struc updated_state = false; } spin_unlock(&dist->lock); - run->mmio.is_write = is_write; - run->mmio.len = len; - run->mmio.phys_addr = addr; - memcpy(run->mmio.data, val, len); - - kvm_handle_mmio_return(vcpu, run); if (updated_state) vgic_kick_vcpus(vcpu->kvm);