Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp4629531ybg; Tue, 29 Oct 2019 10:00:17 -0700 (PDT) X-Google-Smtp-Source: APXvYqxNlg0eQ6A/vFjPSgptN8B3d6jaHf2Mqx/HfYBGbVjpDes1R+YdxNFtu48koCslCISWiqct X-Received: by 2002:aa7:c757:: with SMTP id c23mr14792999eds.209.1572368417528; Tue, 29 Oct 2019 10:00:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572368417; cv=none; d=google.com; s=arc-20160816; b=jZyDoUANbbR9wCETzSEBhql9qFcZgtVoiNPxAZvZ33W4UnfcdHC4ZTrKe0sQvykYVo LORIedJ5rhmlTDzjcfQucs2xPrC821KCeeZnQ/M3ReLWU7FWQyF5aRZH3FnfKKaCJZlv b5m9I6lpumYRWs+3n0GdPjFlIrE5K0Qfw3pAC+Ar8Ou00ipoJUNY03Qb3MTsYhnh31wZ x4nXzKQMkH9sogdtnkwBs14JqYnzUUgpdcwj4zGTc8fqnkrC6Ag6qX9Yp36GG5RZXFRB l4mSHBk1qk+2n2Q4oMLD6rhH+kxctwvsw9shfN64fVZDKVAXuTL3oxJLv++TujC8d5i+ prNg== 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; bh=L/trl+ls8G0PlpDrS/qP/gBJZEbSL+as8I1pnXDEWU8=; b=lKP5gxBU8mXVWaxaBvKtyBeJ+TT3IN0FBHZ3TdnEP+0C/58XYhd6+cAcZI5NvwBl6n NpIPsFqcCi9AJGaYlxEnNXonxqjPKXDrjDMOy7QmfNHV26I7m+Ye1Ar4+KIdNF1FgcJZ 57ZjgGwdNHcrcrstTurobUSakQlflvM5v4affdh+7e64zUHNlOdRhy5R9rjtwBA3KbLy 0VQ9hFN1cAuR5fplr5Nlw+PD6iWRAoKlJGr+NYbFVj2RjUKe3OX+bysbQ55h2xis5Ap8 10VURhNhhbQN3KOygHjLnz8/HOtaPHuMDKo+h+H3MRqn8HLEV9mHmbJDT+U0Wvb5ZRD7 KysA== 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 p15si6838352ejo.212.2019.10.29.09.59.48; Tue, 29 Oct 2019 10:00:17 -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 S2390683AbfJ2Q7A (ORCPT + 99 others); Tue, 29 Oct 2019 12:59:00 -0400 Received: from foss.arm.com ([217.140.110.172]:54620 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390643AbfJ2Q7A (ORCPT ); Tue, 29 Oct 2019 12:59:00 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 41AB94B2; Tue, 29 Oct 2019 09:58:59 -0700 (PDT) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D887C3F71F; Tue, 29 Oct 2019 09:58:56 -0700 (PDT) From: Mark Rutland To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, amit.kachhap@arm.com, catalin.marinas@arm.com, deller@gmx.de, duwe@suse.de, James.Bottomley@HansenPartnership.com, james.morse@arm.com, jeyu@kernel.org, jpoimboe@redhat.com, jthierry@redhat.com, linux-parisc@vger.kernel.org, mark.rutland@arm.com, mingo@redhat.com, peterz@infradead.org, rostedt@goodmis.org, svens@stackframe.org, takahiro.akashi@linaro.org, will@kernel.org Subject: [PATCHv2 3/8] arm64: module: rework special section handling Date: Tue, 29 Oct 2019 16:58:27 +0000 Message-Id: <20191029165832.33606-4-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20191029165832.33606-1-mark.rutland@arm.com> References: <20191029165832.33606-1-mark.rutland@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we load a module, we have to perform some special work for a couple of named sections. To do this, we iterate over all of the module's sections, and perform work for each section we recognize. To make it easier to handle the unexpected absence of a section, and to make the section-specific logic easer to read, let's factor the section search into a helper. Similar is already done in the core module loader, and other architectures (and ideally we'd unify these in future). If we expect a module to have an ftrace trampoline section, but it doesn't have one, we'll now reject loading the module. When ARM64_MODULE_PLTS is selected, any correctly built module should have one (and this is assumed by arm64's ftrace PLT code) and the absence of such a section implies something has gone wrong at build time. Subsequent patches will make use of the new helper. Signed-off-by: Mark Rutland Reviewed-by: Ard Biesheuvel Cc: Catalin Marinas Cc: James Morse Cc: Will Deacon --- arch/arm64/kernel/module.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c index 03ff15bffbb6..763a86d52fef 100644 --- a/arch/arm64/kernel/module.c +++ b/arch/arm64/kernel/module.c @@ -470,22 +470,39 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, return -ENOEXEC; } -int module_finalize(const Elf_Ehdr *hdr, - const Elf_Shdr *sechdrs, - struct module *me) +static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, + const Elf_Shdr *sechdrs, + const char *name) { const Elf_Shdr *s, *se; const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) { - if (strcmp(".altinstructions", secstrs + s->sh_name) == 0) - apply_alternatives_module((void *)s->sh_addr, s->sh_size); + if (strcmp(name, secstrs + s->sh_name) == 0) + return s; + } + + return NULL; +} + +int module_finalize(const Elf_Ehdr *hdr, + const Elf_Shdr *sechdrs, + struct module *me) +{ + const Elf_Shdr *s; + + s = find_section(hdr, sechdrs, ".altinstructions"); + if (s) + apply_alternatives_module((void *)s->sh_addr, s->sh_size); + #ifdef CONFIG_ARM64_MODULE_PLTS - if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE) && - !strcmp(".text.ftrace_trampoline", secstrs + s->sh_name)) - me->arch.ftrace_trampoline = (void *)s->sh_addr; -#endif + if (IS_ENABLED(CONFIG_DYNAMIC_FTRACE)) { + s = find_section(hdr, sechdrs, ".text.ftrace_trampoline"); + if (!s) + return -ENOEXEC; + me->arch.ftrace_trampoline = (void *)s->sh_addr; } +#endif return 0; } -- 2.11.0