Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp2445909yba; Mon, 15 Apr 2019 11:48:06 -0700 (PDT) X-Google-Smtp-Source: APXvYqxVFPaYWBXlkRwNmM8HtcgKAEaQJjbYa+qpvOZVloKd3I0w6uAwhUaXR0FnGe7EV95bvCdK X-Received: by 2002:a17:902:2a4b:: with SMTP id i69mr21543051plb.292.1555354086056; Mon, 15 Apr 2019 11:48:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555354086; cv=none; d=google.com; s=arc-20160816; b=ZbIauUf3cAl6yu3pPn/WvHf8aN7ggGIqSjvZkT9/Sv4fwvlyMgtzBnDZywsMI4f5dN Mb9gcLGbGQkJbDDXqFD8++4EE32Iq/cpxglkOqHzXj6fVVh5i2MKyZQ3+9RMmgg2JN9a mSdVjy78hCBs3HfH28Ts6ivlDFDcL3cehoF5b/tTJtmRlXDo1/wpKycNfHde3agr6928 QMYLmqKbEjZzVmzuIlev930R9gLneqkgIp01+hbxlQAPw8R5hdG3DK/Gm+jxZ8rgG9X9 u2qa69yLnBh+EPNj9wCKz36WRtB0YCygvvkqIU79tMUfxKAnwZTSL0L4/61QHIqbMu15 sm/A== 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=iCsujwGPUqmhtvu7LQSKvNY/df2hr85o9oywLdnrbjU=; b=XenTg+0v3uyRJBWQ2joVp01hNYSjYXno5G/NMyiKx4Pkqhz8ghcHIunwpQPTa3L4GP tr0dyiOOwZIK4ladVZNuRheIpuSsxnELKujBP2Py7PUvsjLKRHuo9g+moB3tHoiGulc+ bokaU0S09o2tYJuwnEvSSflAhWgyal37O0PpGIwc0a+IpNt/w5IzKj8Dzc5NApxmZdu2 uWZswH9S775YBOuuEvqbztHlcqJ6n1uRiVoPhym49I3Tvr3rsNs+d7kQm/mG3fouBiPa Kmz0DTMveTxbaueXiRrkmqOcTqsF704FEJ4eBEeYUsIIiRY7ffmKYYVslKqog7aPR75X w3Vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=n3hec6ye; 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 3si22308731plz.312.2019.04.15.11.47.49; Mon, 15 Apr 2019 11:48:06 -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=n3hec6ye; 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 S1728661AbfDOSqi (ORCPT + 99 others); Mon, 15 Apr 2019 14:46:38 -0400 Received: from mail.kernel.org ([198.145.29.99]:49332 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728637AbfDOSqg (ORCPT ); Mon, 15 Apr 2019 14:46:36 -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 F25B1218EA; Mon, 15 Apr 2019 18:46:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555353995; bh=YL+YBOT6nSq7/kJn06kWbVEJVEWsXbkiZf3Z1BXnUcQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n3hec6yeRBhwvDOmMpuVJINO0NpMYjhhXDFBUMnRCiioxred0iuANtPjPD8TV5rQl cDY9GLFUr8C/75b/7aM56ltPX+kzmfjd337UEerOnqI6ezsMmh7LxFpwwvdzit0n4n L5V8Pswkr1CyZmN0FaylvnHlpeBOXRE3Nzfin3JI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Diana Craciun , Michael Ellerman , Sasha Levin Subject: [PATCH 4.9 32/76] powerpc/fsl: Add infrastructure to fixup branch predictor flush Date: Mon, 15 Apr 2019 20:43:56 +0200 Message-Id: <20190415183715.999898401@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190415183707.712011689@linuxfoundation.org> References: <20190415183707.712011689@linuxfoundation.org> User-Agent: quilt/0.66 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 commit 76a5eaa38b15dda92cd6964248c39b5a6f3a4e9d upstream. In order to protect against speculation attacks (Spectre variant 2) on NXP PowerPC platforms, the branch predictor should be flushed when the privillege level is changed. This patch is adding the infrastructure to fixup at runtime the code sections that are performing the branch predictor flush depending on a boot arg parameter which is added later in a separate patch. Signed-off-by: Diana Craciun Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/feature-fixups.h | 12 ++++++++++++ arch/powerpc/include/asm/setup.h | 2 ++ arch/powerpc/kernel/vmlinux.lds.S | 8 ++++++++ arch/powerpc/lib/feature-fixups.c | 23 +++++++++++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/arch/powerpc/include/asm/feature-fixups.h b/arch/powerpc/include/asm/feature-fixups.h index afd3efd38938..175128e19025 100644 --- a/arch/powerpc/include/asm/feature-fixups.h +++ b/arch/powerpc/include/asm/feature-fixups.h @@ -221,6 +221,17 @@ void setup_feature_keys(void); FTR_ENTRY_OFFSET 953b-954b; \ .popsection; +#define START_BTB_FLUSH_SECTION \ +955: \ + +#define END_BTB_FLUSH_SECTION \ +956: \ + .pushsection __btb_flush_fixup,"a"; \ + .align 2; \ +957: \ + FTR_ENTRY_OFFSET 955b-957b; \ + FTR_ENTRY_OFFSET 956b-957b; \ + .popsection; #ifndef __ASSEMBLY__ @@ -229,6 +240,7 @@ extern long __start___stf_entry_barrier_fixup, __stop___stf_entry_barrier_fixup; extern long __start___stf_exit_barrier_fixup, __stop___stf_exit_barrier_fixup; extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup; extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup; +extern long __start__btb_flush_fixup, __stop__btb_flush_fixup; #endif diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index d3e9da62d029..23ee67e279ae 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h @@ -65,6 +65,8 @@ void do_barrier_nospec_fixups_range(bool enable, void *start, void *end); static inline void do_barrier_nospec_fixups_range(bool enable, void *start, void *end) { }; #endif +void do_btb_flush_fixups(void); + #endif /* !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_SETUP_H */ diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 5c6cf58943b9..50d365060855 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S @@ -164,6 +164,14 @@ SECTIONS } #endif /* CONFIG_PPC_BARRIER_NOSPEC */ +#ifdef CONFIG_PPC_FSL_BOOK3E + . = ALIGN(8); + __spec_btb_flush_fixup : AT(ADDR(__spec_btb_flush_fixup) - LOAD_OFFSET) { + __start__btb_flush_fixup = .; + *(__btb_flush_fixup) + __stop__btb_flush_fixup = .; + } +#endif EXCEPTION_TABLE(0) NOTES :kernel :notes diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c index b3e362437ec4..e6ed0ec94bc8 100644 --- a/arch/powerpc/lib/feature-fixups.c +++ b/arch/powerpc/lib/feature-fixups.c @@ -347,6 +347,29 @@ void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_ printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); } + +static void patch_btb_flush_section(long *curr) +{ + unsigned int *start, *end; + + start = (void *)curr + *curr; + end = (void *)curr + *(curr + 1); + for (; start < end; start++) { + pr_devel("patching dest %lx\n", (unsigned long)start); + patch_instruction(start, PPC_INST_NOP); + } +} + +void do_btb_flush_fixups(void) +{ + long *start, *end; + + start = PTRRELOC(&__start__btb_flush_fixup); + end = PTRRELOC(&__stop__btb_flush_fixup); + + for (; start < end; start += 2) + patch_btb_flush_section(start); +} #endif /* CONFIG_PPC_FSL_BOOK3E */ void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) -- 2.19.1