From patchwork Mon Dec 4 14:13:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Capper X-Patchwork-Id: 10090419 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6ECAB60329 for ; Mon, 4 Dec 2017 14:14:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5C7E42239C for ; Mon, 4 Dec 2017 14:14:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 50D1B27E5A; Mon, 4 Dec 2017 14:14:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 338802239C for ; Mon, 4 Dec 2017 14:14:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=6AUi124ijsc18JlTTIB2VzjUo50EFEIU94HdiSnXRgA=; b=oRjvhZALEiW30z5uWJxu7r302j o+1iXsGP8kmCyCTrrZLn9ahAZ65KbBYVcaFzyUiHaHgmlSX/pQlEZ2Fm6PgPXyDQGeESE5UXo1h4K YjjCXAxd/hLnS3i3mBIVcGdRCShd3kcqGHxmiX7i4CcqTVEyzsqB/y1+bDpDDZ3JTgtFp4zhBYlGh bvyBy2coiO4bwBq4VsO4wg90uBxPAkF/IJWqX9FH8fglVhIYL1iOmmG8007cbbBcO3qywmoR/Dpo/ gcnmLvnCREuJegd52bTNStQ0dQmINRdeUsJIlb6fD76Gg++chRxn3vRGt+sw4NWtNg9NgGkQtPqaK zxSRdChg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eLrVR-0004kM-5P; Mon, 04 Dec 2017 14:14:01 +0000 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70] helo=foss.arm.com) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eLrVK-0004On-QI for linux-arm-kernel@lists.infradead.org; Mon, 04 Dec 2017 14:13:57 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3CE3C15A2; Mon, 4 Dec 2017 06:13:33 -0800 (PST) Received: from capper-debian.emea.arm.com (unknown [10.37.7.145]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B1B8F3F236; Mon, 4 Dec 2017 06:13:31 -0800 (PST) From: Steve Capper To: linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu Subject: [PATCH 01/12] KVM: arm/arm64: vgic: Remove spurious call to kern_hyp_va Date: Mon, 4 Dec 2017 14:13:02 +0000 Message-Id: <20171204141313.31604-2-steve.capper@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204141313.31604-1-steve.capper@arm.com> References: <20171204141313.31604-1-steve.capper@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171204_061355_009896_48E6764F X-CRM114-Status: GOOD ( 13.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: catalin.marinas@arm.com, ard.biesheuvel@linaro.org, Steve Capper , James Morse , Suzuki.Poulose@arm.com MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP In save_elrsr(.), we use the following technique to ascertain the address of the vgic global state: (kern_hyp_va(&kvm_vgic_global_state))->nr_lr For arm, kern_hyp_va(va) == va, and this call effectively compiles out. For arm64, this call can be spurious as the address of kvm_vgic_global_state will usually be determined by relative page/absolute page offset relocation at link time. As the function is idempotent, having the call for arm64 does not cause any problems. Unfortunately, this is about to change for arm64 as we need to change the logic of kern_hyp_va to allow for kernel addresses that are outside the direct linear map. This patch removes the call to kern_hyp_va, and ensures that correct HYP addresses are computed via relative page offset addressing on arm64. This is achieved by a custom accessor, hyp_address(.), which on arm is a simple reference operator. Cc: James Morse Suggested-by: Marc Zyngier Signed-off-by: Steve Capper --- arch/arm/include/asm/kvm_hyp.h | 2 ++ arch/arm64/include/asm/kvm_hyp.h | 10 ++++++++++ virt/kvm/arm/hyp/vgic-v2-sr.c | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/arch/arm/include/asm/kvm_hyp.h b/arch/arm/include/asm/kvm_hyp.h index ab20ffa8b9e7..1864a9bdd160 100644 --- a/arch/arm/include/asm/kvm_hyp.h +++ b/arch/arm/include/asm/kvm_hyp.h @@ -26,6 +26,8 @@ #define __hyp_text __section(.hyp.text) notrace +#define hyp_address(symbol) (&(symbol)) + #define __ACCESS_VFP(CRn) \ "mrc", "mcr", __stringify(p10, 7, %0, CRn, cr0, 0), u32 diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index 08d3bb66c8b7..34a4ae906a97 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -25,6 +25,16 @@ #define __hyp_text __section(.hyp.text) notrace +#define hyp_address(symbol) \ +({ \ + typeof(&symbol) __ret; \ + asm volatile( \ + "adrp %[ptr], " #symbol "\n" \ + "add %[ptr], %[ptr], :lo12:" #symbol "\n" \ + : [ptr] "=r"(__ret)); \ + __ret; \ +}) + #define read_sysreg_elx(r,nvh,vh) \ ({ \ u64 reg; \ diff --git a/virt/kvm/arm/hyp/vgic-v2-sr.c b/virt/kvm/arm/hyp/vgic-v2-sr.c index a3f18d362366..330fd4637708 100644 --- a/virt/kvm/arm/hyp/vgic-v2-sr.c +++ b/virt/kvm/arm/hyp/vgic-v2-sr.c @@ -25,7 +25,7 @@ static void __hyp_text save_elrsr(struct kvm_vcpu *vcpu, void __iomem *base) { struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2; - int nr_lr = (kern_hyp_va(&kvm_vgic_global_state))->nr_lr; + int nr_lr = hyp_address(kvm_vgic_global_state)->nr_lr; u32 elrsr0, elrsr1; elrsr0 = readl_relaxed(base + GICH_ELRSR0); @@ -143,7 +143,7 @@ int __hyp_text __vgic_v2_perform_cpuif_access(struct kvm_vcpu *vcpu) return -1; rd = kvm_vcpu_dabt_get_rd(vcpu); - addr = kern_hyp_va((kern_hyp_va(&kvm_vgic_global_state))->vcpu_base_va); + addr = kern_hyp_va(hyp_address(kvm_vgic_global_state)->vcpu_base_va); addr += fault_ipa - vgic->vgic_cpu_base; if (kvm_vcpu_dabt_iswrite(vcpu)) {