Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1650401ybt; Thu, 18 Jun 2020 13:53:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUnb4mNhFJbigLSjm7aTPwDIPCzaSjVMhNCIUc9uZ4t81IlQQI8f5PAIvmlOLOlPJltrcl X-Received: by 2002:aa7:de14:: with SMTP id h20mr73921edv.173.1592513607611; Thu, 18 Jun 2020 13:53:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592513607; cv=none; d=google.com; s=arc-20160816; b=Ey8OPNP6+xvJEiRh8wutqPDDG4owz+VjTZ3Lw4lEDWpApZ7065auGA3KC/Y55951Fi iefZWzCQpdJxzjx0AN96ww4MHK+ZGxe9ExqKmK9HviAM/4nR5Kbs3SFbiUn9M/pu/kxc mfzFFcea9GElZK1NJTcfMbjlGIR4rdimVMS25SeFopfxPsZyhNpc4VSORh7uf+VyN1eB mG7tAhOhMgXca8tsIdq1DJBlRoiiZ4ssB0DpJQkQkdcpJv7AWLYZGtnqzCxq96QtcS3h yjnBCH3jtDV/5Grpv+ypMHAOLrLN5exRmMVL5BjZopwFEKnjHrIrxCRvrBX4O13J8xGu 2edw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=jaBfXmn8+9zavkdP+ScTrG7wTshcx9cxYqA4+ffplpw=; b=aL3xfPE4bRhPbKCJXLGpm2FiMkff4nm8OXy6itr9A4AnT8940t9lMHUFPYWTaU+AEC 7gfSr2e9rNTh96uPUJ0I3+QOLGlklWs7Zb+aGjEDO2JUv1Z+2oIYfh6GmfuLzjRIzMok JvQlx0lrwPTTPLF7qUaU/9LvcF7hsIGhT/x/5PS7O41taVQL/I1RpXMBzep0lZxwqQsP s2gv7v0Cd+DpgKiTIJbeOjpeG18hh7JS7zEqy9A/eF6OYWrMefuZGBYVqzK8WNe/GZ0H 0rJM9Hlr6TzlWUXAoyO2sh0FvWtm3TvIxez8Yg14m8XssIn0x5ReVkE5tPbTZ4wngR+z teoQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y15si2922109edm.260.2020.06.18.13.53.05; Thu, 18 Jun 2020 13:53:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727982AbgFRUlj (ORCPT + 99 others); Thu, 18 Jun 2020 16:41:39 -0400 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:36734 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730973AbgFRUjj (ORCPT ); Thu, 18 Jun 2020 16:39:39 -0400 Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Thu, 18 Jun 2020 13:39:34 -0700 Received: from sc9-mailhost2.vmware.com (unknown [10.129.221.29]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 01721B2659; Thu, 18 Jun 2020 16:39:37 -0400 (EDT) From: Matt Helsley To: CC: Josh Poimboeuf , Peter Zijlstra , Steven Rostedt , Julien Thierry , Kamalesh Babulal , Matt Helsley Subject: [RFC][PATCH v5 45/51] objtool: mcount: Move mcount section test to objtool ELF Date: Thu, 18 Jun 2020 13:38:31 -0700 Message-ID: <8bc94dfae5969002d946b1aad2f831474d4649fd.1592510545.git.mhelsley@vmware.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII Received-SPF: None (EX13-EDG-OU-002.vmware.com: mhelsley@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation for removing this first pass by mcount move the test for whether a section is mcountable into objtool's ELF read code, much like we did with the symbol name. A subsequent patch will eliminate the tot_relsize() function and thereby reduce the number of passes through the ELF data. Signed-off-by: Matt Helsley --- tools/objtool/elf.c | 16 ++++++++++++++++ tools/objtool/elf.h | 2 +- tools/objtool/mcount.c | 36 +++++++++++------------------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c index 666cbc01c332..dffdc3264a25 100644 --- a/tools/objtool/elf.c +++ b/tools/objtool/elf.c @@ -308,6 +308,20 @@ struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, uns return find_reloc_by_dest_range(elf, sec, offset, 1); } +/* Names of the sections that could contain calls to mcount. */ +static int is_mcounted_section_name(char const *const txtname) +{ + return strncmp(".text", txtname, 5) == 0 || + strcmp(".init.text", txtname) == 0 || + strcmp(".ref.text", txtname) == 0 || + strcmp(".sched.text", txtname) == 0 || + strcmp(".spinlock.text", txtname) == 0 || + strcmp(".irqentry.text", txtname) == 0 || + strcmp(".softirqentry.text", txtname) == 0 || + strcmp(".kprobes.text", txtname) == 0 || + strcmp(".cpuidle.text", txtname) == 0; +} + static int read_sections(struct elf *elf) { Elf_Scn *s = NULL; @@ -370,6 +384,8 @@ static int read_sections(struct elf *elf) } sec->len = sec->sh.sh_size; + sec->mcounted = is_mcounted_section_name(sec->name); + list_add_tail(&sec->list, &elf->sections); elf_hash_add(elf->section_hash, &sec->hash, sec->idx); elf_hash_add(elf->section_name_hash, &sec->name_hash, str_hash(sec->name)); diff --git a/tools/objtool/elf.h b/tools/objtool/elf.h index f0b02824f9d3..db207e93a1e6 100644 --- a/tools/objtool/elf.h +++ b/tools/objtool/elf.h @@ -39,7 +39,7 @@ struct section { char *name; int idx; unsigned int len; - bool changed, text, rodata, noinstr; + bool changed, text, rodata, noinstr, mcounted; }; enum symbol_class { diff --git a/tools/objtool/mcount.c b/tools/objtool/mcount.c index 7d7843f7cd44..a75d918a9fa5 100644 --- a/tools/objtool/mcount.c +++ b/tools/objtool/mcount.c @@ -144,20 +144,6 @@ static int make_nop_arm64(struct section *txts, size_t const offset) return elf_write_insn(lf, txts, offset, 4, ideal_nop); } -/* Names of the sections that could contain calls to mcount. */ -static int is_mcounted_section_name(char const *const txtname) -{ - return strncmp(".text", txtname, 5) == 0 || - strcmp(".init.text", txtname) == 0 || - strcmp(".ref.text", txtname) == 0 || - strcmp(".sched.text", txtname) == 0 || - strcmp(".spinlock.text", txtname) == 0 || - strcmp(".irqentry.text", txtname) == 0 || - strcmp(".softirqentry.text", txtname) == 0 || - strcmp(".kprobes.text", txtname) == 0 || - strcmp(".cpuidle.text", txtname) == 0; -} - /* * MIPS mcount long call has 2 _mcount symbols, only the position of the 1st * _mcount symbol is needed for dynamic function tracer, with it, to disable @@ -288,7 +274,7 @@ static int nop_mcount(struct section * const rels, return 0; } -static char const *has_rel_mcount(const struct section * const rels) +static struct section const *has_rel_mcount(const struct section * const rels) { const struct section *txts; if (rels->sh.sh_type != SHT_REL && rels->sh.sh_type != SHT_RELA) @@ -297,17 +283,17 @@ static char const *has_rel_mcount(const struct section * const rels) if ((txts->sh.sh_type != SHT_PROGBITS) || !(txts->sh.sh_flags & SHF_EXECINSTR)) return NULL; - return txts->name; + return txts; } static void tot_relsize(unsigned int *rel_entsize) { const struct section *sec; - char const *txtname; + const struct section *txts; list_for_each_entry(sec, &lf->sections, list) { - txtname = has_rel_mcount(sec); - if (!(txtname && is_mcounted_section_name(txtname))) + txts = has_rel_mcount(sec); + if (!(txts && txts->mcounted)) continue; *rel_entsize = sec->sh.sh_entsize; } @@ -441,25 +427,25 @@ static int do_mcount(unsigned const reltype, size_t rela_size) mrels->sh.sh_flags = 0; /* clear SHF_INFO_LINK */ list_for_each_entry(sec, &lf->sections, list) { - char const *txtname; + struct section const *txts; - txtname = has_rel_mcount(sec); - if (txtname && is_mcounted_section_name(txtname)) { + txts = has_rel_mcount(sec); + if (txts && txts->mcounted) { unsigned long recval = 0; unsigned int recsym; if (find_section_sym_index(sec->sh.sh_info, - txtname, &recval, &recsym)) + txts->name, &recval, &recsym)) goto out; sift_rel_mcount(&r_offset, sec, mrels, mlocs, recsym, recval, reltype, is_rela); - } else if (txtname && (warn_on_notrace_sect || make_nop)) { + } else if (txts && (warn_on_notrace_sect || make_nop)) { /* * This section is ignored by ftrace, but still * has mcount calls. Convert them to nops now. */ - if (nop_mcount(sec, txtname) < 0) + if (nop_mcount(sec, txts->name) < 0) goto out; } } -- 2.20.1