From patchwork Fri Dec 7 03:43:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suraj Jitindar Singh X-Patchwork-Id: 1009160 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=kvm-ppc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="PoH4roc6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 439yxs0P65z9sN4 for ; Fri, 7 Dec 2018 14:44:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725950AbeLGDn7 (ORCPT ); Thu, 6 Dec 2018 22:43:59 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:32985 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726032AbeLGDn6 (ORCPT ); Thu, 6 Dec 2018 22:43:58 -0500 Received: by mail-pg1-f194.google.com with SMTP id z11so1102532pgu.0; Thu, 06 Dec 2018 19:43:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=e3i0Je8vY1d0fv+s5DNcU463pzhlEPKl1gJssLI/xzU=; b=PoH4roc66Qr+co5w9zMBmznaah8VRS5DhaJoR1tFlnNNDDnOp1xH4S92Yb6oxAaCgC hzPCXEMIiVINFg0/288qkYx3NsBX45oMSf/HJiZ5+qTWc/wYZa5AqP9GsFetCbOWKoVa 5XenyGNfENlIDrmLNQcPF2hGeePkSH//Dv8DI/XOhAXDXUDUYU7+p+p9L4lqC7wH07QM J/HsVUi705h9N9+hVafBu8Z8h9su29r5zO4godfzDQZnvQXEKLdeYF24eK1lh+EkuYi0 pPKKi1mYaphkYOCDkpCoWgjGZ4L5meFpW8ttRen+6SOTcoE1HsNAYk6dFGYit+7NkgrA Lz9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=e3i0Je8vY1d0fv+s5DNcU463pzhlEPKl1gJssLI/xzU=; b=bEv5bL+qOOVtUznuGzoLTWhsS4p3Qu+4XVKZlddq48RYik3YlIKWmFAhdoo//UE5R1 aYYlCHNcpI3qSbU46F/P+x0RTrIJI99RaU/ni+mNYZEmHl6G5CF3u/XFDYi/w7niWhUX MKPctv01bDu5Y3YuUdcTZI9H32eWxEmU9AiMQj9xtzVEIYVtVKApcZZHlCwlNrZ9RT38 5qDaUek1S0AoZdUed+AOps+myCQxOTEreQc2A+qwt20xcka3sQ7seVPejDkjSML4Wcjp cqWyNWfpZlmzuJoilsjZDuXZa7LA9joOXjg5T8bYB7X/L+GGsnkJS9kfW5StbZlQBWg8 wj6w== X-Gm-Message-State: AA+aEWZeYu41O9eRvlvXGymtt9LunLjk2suyDfvrXZ9lau0En/KfD9fw TAG9pt1YpJApLh83zA6LlzQGSl95 X-Google-Smtp-Source: AFSGD/XBBVdVTk31ogLdH4iIKg9WF8KOAyZDY5f4RsfO/het8yZQqb6t0yb3X/Ny4MARfJOJWcTdjA== X-Received: by 2002:a62:31c1:: with SMTP id x184mr698240pfx.204.1544154237748; Thu, 06 Dec 2018 19:43:57 -0800 (PST) Received: from localhost.localdomain ([1.129.152.198]) by smtp.gmail.com with ESMTPSA id e23sm2262646pfh.68.2018.12.06.19.43.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 06 Dec 2018 19:43:57 -0800 (PST) From: Suraj Jitindar Singh To: kvm-ppc@vger.kernel.org Cc: sjitindarsingh@gmail.com, kvm@vger.kernel.org, paulus@ozlabs.org, linuxppc-dev@lists.ozlabs.org, aik@ozlabs.ru Subject: [PATCH 4/8] KVM: PPC: Add load_from_eaddr and store_to_eaddr to the kvmppc_ops struct Date: Fri, 7 Dec 2018 14:43:22 +1100 Message-Id: <20181207034326.3564-6-sjitindarsingh@gmail.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181207034326.3564-1-sjitindarsingh@gmail.com> References: <20181207034326.3564-1-sjitindarsingh@gmail.com> Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org The kvmppc_ops struct is used to store function pointers to kvm implementation specific functions. Introduce two new functions load_from_eaddr and store_to_eaddr to be used to load from and store to a guest effective address respectively. Also implement these for the kvm-hv module. If we are using the radix mmu then we can call the functions to access quadrant 1 and 2. Signed-off-by: Suraj Jitindar Singh --- arch/powerpc/include/asm/kvm_ppc.h | 4 ++++ arch/powerpc/kvm/book3s_hv.c | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 9b89b1918dfc..159dd76700cb 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -326,6 +326,10 @@ struct kvmppc_ops { unsigned long flags); void (*giveup_ext)(struct kvm_vcpu *vcpu, ulong msr); int (*enable_nested)(struct kvm *kvm); + int (*load_from_eaddr)(struct kvm_vcpu *vcpu, ulong *eaddr, void *ptr, + int size); + int (*store_to_eaddr)(struct kvm_vcpu *vcpu, ulong *eaddr, void *ptr, + int size); }; extern struct kvmppc_ops *kvmppc_hv_ops; diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index d65b961661fb..6c8b4f632168 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -5213,6 +5213,44 @@ static int kvmhv_enable_nested(struct kvm *kvm) return 0; } +static int kvmhv_load_from_eaddr(struct kvm_vcpu *vcpu, ulong *eaddr, void *ptr, + int size) +{ + int rc = -EINVAL; + + if (kvmhv_vcpu_is_radix(vcpu)) { + rc = kvmhv_copy_from_guest_radix(vcpu, *eaddr, ptr, size); + + if (rc > 0) + rc = -EINVAL; + } + + /* For now quadrants are the only way to access nested guest memory */ + if (rc && vcpu->arch.nested) + rc = -EAGAIN; + + return rc; +} + +static int kvmhv_store_to_eaddr(struct kvm_vcpu *vcpu, ulong *eaddr, void *ptr, + int size) +{ + int rc = -EINVAL; + + if (kvmhv_vcpu_is_radix(vcpu)) { + rc = kvmhv_copy_to_guest_radix(vcpu, *eaddr, ptr, size); + + if (rc > 0) + rc = -EINVAL; + } + + /* For now quadrants are the only way to access nested guest memory */ + if (rc && vcpu->arch.nested) + rc = -EAGAIN; + + return rc; +} + static struct kvmppc_ops kvm_ops_hv = { .get_sregs = kvm_arch_vcpu_ioctl_get_sregs_hv, .set_sregs = kvm_arch_vcpu_ioctl_set_sregs_hv, @@ -5253,6 +5291,8 @@ static struct kvmppc_ops kvm_ops_hv = { .get_rmmu_info = kvmhv_get_rmmu_info, .set_smt_mode = kvmhv_set_smt_mode, .enable_nested = kvmhv_enable_nested, + .load_from_eaddr = kvmhv_load_from_eaddr, + .store_to_eaddr = kvmhv_store_to_eaddr, }; static int kvm_init_subcore_bitmap(void)