Received: by 10.192.165.148 with SMTP id m20csp4191241imm; Mon, 23 Apr 2018 21:20:41 -0700 (PDT) X-Google-Smtp-Source: AIpwx48KVOXIpaRVskUQHTL6noJlusMKiN2rFaKb9wSy/QWpjlO2HOCQPrEWU7TMxrFuZilQF/U/ X-Received: by 10.99.67.65 with SMTP id q62mr19469789pga.358.1524543641868; Mon, 23 Apr 2018 21:20:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524543641; cv=none; d=google.com; s=arc-20160816; b=dIjOYQpyITLEs2TopbA+kKV5AU5u+Sttors5g6OZ7HL1cuWr0e047QV6z9LVQUl36S Ae6XIUYpoyw9rlYhlnec9Fhfgjy+gQM5MIjK5OctqSt0G5zv9CU4m2BWUTzM3Lz/yyaS UrpISImJh/asQWQsgYrzNih0NVK8lCUPIc02b/PwlUZjyzBvFPP/Ahpaihqcjd2Ts+gU hl2/qVfHwtcuxDnMJDIeW2u3snYH/2HdEgt+DX/+L3ZpK5znWrd38XQT73U+BpSVbMpz NcfYKRQZPpeP84QlF6YnvJ0aAWfCiOxnDdTXhDnC3EoF5gb3Ub3dVyqeX4+OdspMDBKN AErg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=40ukrSmnKnYF6HCbbSvyHI8k4DifhSlhUz09JBP8GiA=; b=RFfI7h7fbkIuwDKR/2gvP9Hmkpv1Rf8rdvv6kvE6BLQZOIQ3rGziIDffXfAJaSH+Ir TXY6W7fdVWMIKza0eZmkx1I4B7jAQL3JbcjI9siizLu8Iw6r4yijDL5eKlkmHq4fdYoI tbiSrIwOt5HOrFJ1vzvRqlsH+OqRrvI3n1wH1WvSdU+5uGoqd8BP9vjUYBfRt2yfM0oS TORjgASHI8kSimPTBona61lcO8EIVvIygYd8Yjl4f0u/4yKntqvh9gJdBTDfLmHePCT5 042MlzLajYEtciVlrljntCVNLJLo68oj74WhdRrLnTqHnAhoWo4nrKOS2dMdJJGttfT8 sh5Q== ARC-Authentication-Results: i=1; mx.google.com; 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 32-v6si13105006pld.65.2018.04.23.21.20.27; Mon, 23 Apr 2018 21:20:41 -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; 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 S1755900AbeDXERh (ORCPT + 99 others); Tue, 24 Apr 2018 00:17:37 -0400 Received: from ozlabs.org ([203.11.71.1]:39643 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751432AbeDXEQJ (ORCPT ); Tue, 24 Apr 2018 00:16:09 -0400 Received: by ozlabs.org (Postfix, from userid 1034) id 40VVPh36mJz9ry1; Tue, 24 Apr 2018 14:16:08 +1000 (AEST) From: Michael Ellerman To: linuxppc-dev@ozlabs.org Cc: npiggin@gmail.com, msuchanek@suse.de, linux-kernel@vger.kernel.org Subject: [PATCH 3/6] powerpc/64s: Patch barrier_nospec in modules Date: Tue, 24 Apr 2018 14:15:56 +1000 Message-Id: <20180424041559.32410-3-mpe@ellerman.id.au> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180424041559.32410-1-mpe@ellerman.id.au> References: <20180424041559.32410-1-mpe@ellerman.id.au> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michal Suchanek Note that unlike RFI which is patched only in kernel the nospec state reflects settings at the time the module was loaded. Iterating all modules and re-patching every time the settings change is not implemented. Based on lwsync patching. Signed-off-by: Michal Suchanek Signed-off-by: Michael Ellerman --- arch/powerpc/include/asm/setup.h | 6 ++++++ arch/powerpc/kernel/module.c | 6 ++++++ arch/powerpc/lib/feature-fixups.c | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/include/asm/setup.h b/arch/powerpc/include/asm/setup.h index afc7280cce3b..4335cddc1cf2 100644 --- a/arch/powerpc/include/asm/setup.h +++ b/arch/powerpc/include/asm/setup.h @@ -54,6 +54,12 @@ void setup_rfi_flush(enum l1d_flush_type, bool enable); void do_rfi_flush_fixups(enum l1d_flush_type types); void do_barrier_nospec_fixups(bool enable); +#ifdef CONFIG_PPC_BOOK3S_64 +void do_barrier_nospec_fixups_range(bool enable, void *start, void *end); +#else +static inline void do_barrier_nospec_fixups_range(bool enable, void *start, void *end) { }; +#endif + #endif /* !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_SETUP_H */ diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c index 3f7ba0f5bf29..a72698cd3dd0 100644 --- a/arch/powerpc/kernel/module.c +++ b/arch/powerpc/kernel/module.c @@ -72,6 +72,12 @@ int module_finalize(const Elf_Ehdr *hdr, do_feature_fixups(powerpc_firmware_features, (void *)sect->sh_addr, (void *)sect->sh_addr + sect->sh_size); + + sect = find_section(hdr, sechdrs, "__spec_barrier_fixup"); + if (sect != NULL) + do_barrier_nospec_fixups_range(true, + (void *)sect->sh_addr, + (void *)sect->sh_addr + sect->sh_size); #endif sect = find_section(hdr, sechdrs, "__lwsync_fixup"); diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c index 093c1d2ea5fd..3b37529f82f8 100644 --- a/arch/powerpc/lib/feature-fixups.c +++ b/arch/powerpc/lib/feature-fixups.c @@ -163,14 +163,14 @@ void do_rfi_flush_fixups(enum l1d_flush_type types) : "unknown"); } -void do_barrier_nospec_fixups(bool enable) +void do_barrier_nospec_fixups_range(bool enable, void *fixup_start, void *fixup_end) { unsigned int instr, *dest; long *start, *end; int i; - start = PTRRELOC(&__start___barrier_nospec_fixup), - end = PTRRELOC(&__stop___barrier_nospec_fixup); + start = fixup_start; + end = fixup_end; instr = 0x60000000; /* nop */ @@ -189,6 +189,16 @@ void do_barrier_nospec_fixups(bool enable) printk(KERN_DEBUG "barrier-nospec: patched %d locations\n", i); } +void do_barrier_nospec_fixups(bool enable) +{ + void *start, *end; + + start = PTRRELOC(&__start___barrier_nospec_fixup), + end = PTRRELOC(&__stop___barrier_nospec_fixup); + + do_barrier_nospec_fixups_range(enable, start, end); +} + #endif /* CONFIG_PPC_BOOK3S_64 */ void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end) -- 2.14.1