Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp1544188ybg; Tue, 2 Jun 2020 12:55:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy23vhF5HlS0UGS6YuaAuH5/0BbSpl/3VUYrXQirCT02UOY9GB8bMPld+3xRNY/dPuwHC3d X-Received: by 2002:a17:906:838a:: with SMTP id p10mr24447056ejx.243.1591127758589; Tue, 02 Jun 2020 12:55:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591127758; cv=none; d=google.com; s=arc-20160816; b=rYYiVdmbScHDbnW4xoyqzmOnK/FHw2isf8pyQW6zV5LP5yaXjidu/0LWrJH1L7ns5Q Hvz4JC0rvZDsbgQH73Xs++rO2oz6ShJys3rWWcjEE9Ypy+scRHr2K567xGgx0mdlNOVS 3FJiYYtkFkKLZRvdsxlSXRkSK7URyUO/ZYlrW063C7Y9T4EXnDVj86V3Kqpr/I0Vq3K3 LIfn2vQyRQSfjKkuVmndZ+stis/kwsHmvxuNJMPVc1gdXa/arGjxnJO7rxRzQrtf5hRr RttmVNvId82+0SnJj5RlqiaYvcYbUXZI3hPdgRWVQmzin+tz2YyJHAkMqrd3qizDhVFe /fLw== 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=dIrvvDfb0wttmwvWd9SWX3o5pAYdqNfd2vT+e9833qU=; b=t5dYVF1eJFEDpIdZxuxm+BhoW5dEJ8fS5OSrNrfGgCm9QwPEPOw4XDkdWwXyRjx+dn nhCpAj93ghNGQHS30LZIH/lEVGfpbbS6fceo5/325kOSH9qjVzlF3uh6xG/8fW5bU2L8 4ZvldFkrOFKgSE6AOn6cFXwHrBmBrYQGtKCPKfK+XyMvdgnACwBMqZewMwutqJFXMw2Y iMSMxpSWzl3sNGjEd6eqt0nf/+dR1FSFJLiDStYZG2lpUnGB5yXICh9IL3GGSZE4o2Kq ZLdxV9AZyH+dJc4Nab8L5MeJguFWDz4YWK8bLIUf+XxQWH9XH0tNAFeylzJGcGAw1bqK lRDQ== 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 oz26si2050762ejb.252.2020.06.02.12.55.35; Tue, 02 Jun 2020 12:55:58 -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 S1728672AbgFBTwa (ORCPT + 99 others); Tue, 2 Jun 2020 15:52:30 -0400 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:36862 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728327AbgFBTvB (ORCPT ); Tue, 2 Jun 2020 15:51:01 -0400 Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Tue, 2 Jun 2020 12:50:56 -0700 Received: from sc9-mailhost3.vmware.com (unknown [10.200.192.49]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id B5DE140BF5; Tue, 2 Jun 2020 12:50:56 -0700 (PDT) From: Matt Helsley To: CC: Josh Poimboeuf , Peter Zijlstra , Steven Rostedt , Sami Tolvanen , Julien Thierry , Kamalesh Babulal , Matt Helsley Subject: [RFC][PATCH v4 13/32] objtool: mcount: Move is_fake_mcount() Date: Tue, 2 Jun 2020 12:50:06 -0700 Message-ID: X-Mailer: git-send-email 2.25.1 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 Promote the now-bit-independent is_fake_mcount() out of the old recordmcount ELF wrapper. Signed-off-by: Matt Helsley --- tools/objtool/recordmcount.c | 48 +++++++++++++++++++++++++++++++--- tools/objtool/recordmcount.h | 50 ------------------------------------ 2 files changed, 45 insertions(+), 53 deletions(-) diff --git a/tools/objtool/recordmcount.c b/tools/objtool/recordmcount.c index f72d313a2b51..24090f36d26d 100644 --- a/tools/objtool/recordmcount.c +++ b/tools/objtool/recordmcount.c @@ -438,6 +438,48 @@ static unsigned get_mcountsym(struct reloc *reloc) return 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 + * tracing(ftrace_make_nop), the instruction in the position is replaced with + * the "b label" instruction, to enable tracing(ftrace_make_call), replace the + * instruction back. So, here, we set the 2nd one as fake and filter it. + * + * c: 3c030000 lui v1,0x0 <--> b label + * c: R_MIPS_HI16 _mcount + * c: R_MIPS_NONE *ABS* + * c: R_MIPS_NONE *ABS* + * 10: 64630000 daddiu v1,v1,0 + * 10: R_MIPS_LO16 _mcount + * 10: R_MIPS_NONE *ABS* + * 10: R_MIPS_NONE *ABS* + * 14: 03e0082d move at,ra + * 18: 0060f809 jalr v1 + * label: + */ +#define MIPS_FAKEMCOUNT_OFFSET 4 + +static int MIPS_is_fake_mcount(struct reloc const *reloc) +{ + static unsigned long old_r_offset = ~0UL; + unsigned long current_r_offset = reloc->offset; + int is_fake; + + is_fake = (old_r_offset != ~0UL) && + (current_r_offset - old_r_offset == MIPS_FAKEMCOUNT_OFFSET); + old_r_offset = current_r_offset; + + return is_fake; +} + +/* Functions and pointers that do_file() may override for specific e_machine. */ +static int fn_is_fake_mcount(struct reloc const *reloc) +{ + return 0; +} + +static int (*is_fake_mcount)(struct reloc const *reloc) = fn_is_fake_mcount; + static const unsigned int missing_sym = (unsigned int)-1; /* 32 bit and 64 bit are very similar */ @@ -557,7 +599,7 @@ static int do_file(char const *const fname) altmcount = "__gnu_mcount_nc"; make_nop = make_nop_arm; rel_type_nop = R_ARM_NONE; - is_fake_mcount32 = arm_is_fake_mcount; + is_fake_mcount = arm_is_fake_mcount; gpfx = 0; break; case EM_AARCH64: @@ -597,7 +639,7 @@ static int do_file(char const *const fname) } if (w2(ehdr->e_machine) == EM_MIPS) { reltype = R_MIPS_32; - is_fake_mcount32 = MIPS32_is_fake_mcount; + is_fake_mcount = MIPS_is_fake_mcount; } if (do32(ehdr, reltype) < 0) goto out; @@ -617,7 +659,7 @@ static int do_file(char const *const fname) if (w2(ghdr->e_machine) == EM_MIPS) { reltype = R_MIPS_64; Elf64_r_info = MIPS64_r_info; - is_fake_mcount64 = MIPS64_is_fake_mcount; + is_fake_mcount = MIPS_is_fake_mcount; } if (do64(ghdr, reltype) < 0) goto out; diff --git a/tools/objtool/recordmcount.h b/tools/objtool/recordmcount.h index 1a39f7acac11..65386938693b 100644 --- a/tools/objtool/recordmcount.h +++ b/tools/objtool/recordmcount.h @@ -18,9 +18,6 @@ * Copyright 2010 Steven Rostedt , Red Hat Inc. */ #undef append_func -#undef is_fake_mcount -#undef fn_is_fake_mcount -#undef MIPS_is_fake_mcount #undef mcount_adjust #undef sift_rel_mcount #undef nop_mcount @@ -48,9 +45,6 @@ # define has_rel_mcount has64_rel_mcount # define tot_relsize tot64_relsize # define do_func do64 -# define is_fake_mcount is_fake_mcount64 -# define fn_is_fake_mcount fn_is_fake_mcount64 -# define MIPS_is_fake_mcount MIPS64_is_fake_mcount # define mcount_adjust mcount_adjust_64 # define Elf_Ehdr Elf64_Ehdr # define Elf_Shdr Elf64_Shdr @@ -71,9 +65,6 @@ # define has_rel_mcount has32_rel_mcount # define tot_relsize tot32_relsize # define do_func do32 -# define is_fake_mcount is_fake_mcount32 -# define fn_is_fake_mcount fn_is_fake_mcount32 -# define MIPS_is_fake_mcount MIPS32_is_fake_mcount # define mcount_adjust mcount_adjust_32 # define Elf_Ehdr Elf32_Ehdr # define Elf_Shdr Elf32_Shdr @@ -88,13 +79,6 @@ # define _size 4 #endif -/* Functions and pointers that do_file() may override for specific e_machine. */ -static int fn_is_fake_mcount(struct reloc const *reloc) -{ - return 0; -} -static int (*is_fake_mcount)(struct reloc const *reloc) = fn_is_fake_mcount; - static void fn_ELF_R_INFO(Elf_Rel *const rp, unsigned sym, unsigned type) { rp->r_info = _w(ELF_R_INFO(sym, type)); @@ -103,40 +87,6 @@ static void (*Elf_r_info)(Elf_Rel *const rp, unsigned sym, unsigned type) = fn_E static int mcount_adjust = 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 - * tracing(ftrace_make_nop), the instruction in the position is replaced with - * the "b label" instruction, to enable tracing(ftrace_make_call), replace the - * instruction back. So, here, we set the 2nd one as fake and filter it. - * - * c: 3c030000 lui v1,0x0 <--> b label - * c: R_MIPS_HI16 _mcount - * c: R_MIPS_NONE *ABS* - * c: R_MIPS_NONE *ABS* - * 10: 64630000 daddiu v1,v1,0 - * 10: R_MIPS_LO16 _mcount - * 10: R_MIPS_NONE *ABS* - * 10: R_MIPS_NONE *ABS* - * 14: 03e0082d move at,ra - * 18: 0060f809 jalr v1 - * label: - */ -#define MIPS_FAKEMCOUNT_OFFSET 4 - -static int MIPS_is_fake_mcount(struct reloc const *reloc) -{ - static unsigned long old_r_offset = ~0UL; - unsigned long current_r_offset = reloc->offset; - int is_fake; - - is_fake = (old_r_offset != ~0UL) && - (current_r_offset - old_r_offset == MIPS_FAKEMCOUNT_OFFSET); - old_r_offset = current_r_offset; - - return is_fake; -} - /* Append the new shstrtab, Elf_Shdr[], __mcount_loc and its relocations. */ static int append_func(Elf_Ehdr *const ehdr, Elf_Shdr *const shstr, -- 2.20.1