All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Helsley <mhelsley@vmware.com>
To: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
Cc: <linux-kernel@vger.kernel.org>,
	Josh Poimboeuf <jpoimboe@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Sami Tolvanen <samitolvanen@google.com>,
	Julien Thierry <jthierry@redhat.com>
Subject: Re: [RFC][PATCH v4 27/32] objtool: mcount: Generic location and relocation table types
Date: Tue, 9 Jun 2020 11:12:31 -0700	[thread overview]
Message-ID: <20200609181231.GD1284251@rlwimi.vmware.com> (raw)
In-Reply-To: <79552506-b994-63ce-d3d9-8053dcbc02db@linux.vnet.ibm.com>

On Tue, Jun 09, 2020 at 12:11:55PM +0530, Kamalesh Babulal wrote:
> On 6/3/20 1:20 AM, Matt Helsley wrote:
> > Rather than building the exact ELF section data we need and
> > avoiding libelf's conversion step, use more GElf types
> > and then libelf's elfxx_xlatetof() functions to convert
> > the mcount locations (GElf_Addr) and associated relocations.
> > 
> > This converts sift_rel_mcount() so that it doesn't use the
> > recordmcount wrapper. The next patch will move it out of the
> > wrapper.
> > 
> > Signed-off-by: Matt Helsley <mhelsley@vmware.com>
> > ---
> >  tools/objtool/recordmcount.c |  44 +++----------
> >  tools/objtool/recordmcount.h | 120 ++++++++++++++---------------------
> >  2 files changed, 59 insertions(+), 105 deletions(-)
> > 
> > diff --git a/tools/objtool/recordmcount.c b/tools/objtool/recordmcount.c
> > index 06a8f8ddefa7..ef3c360a3db9 100644
> > --- a/tools/objtool/recordmcount.c
> > +++ b/tools/objtool/recordmcount.c
> 
> [...]
> 
> > -static uint_t *sift_rel_mcount(uint_t *mlocp,
> > -			       unsigned const offbase,
> > -			       Elf_Rel **const mrelpp,
> > +static void sift_rel_mcount(GElf_Addr **mlocpp,
> > +			       GElf_Sxword *r_offsetp,
> > +			       void **const mrelpp,
> >  			       const struct section * const rels,
> >  			       unsigned const recsym_index,
> >  			       unsigned long const recval,
> > -			       unsigned const reltype)
> > +			       unsigned const reltype,
> > +			       bool is_rela)
> >  {
> > -	uint_t *const mloc0 = mlocp;
> > -	Elf_Rel *mrelp = *mrelpp;
> > -	unsigned int rel_entsize = rels->sh.sh_entsize;
> > -	unsigned mcountsym = 0;
> > +	GElf_Rel *mrelp = *mrelpp;
> > +	GElf_Rela *mrelap = *mrelpp;
> > +	unsigned int mcount_sym_info = 0;
> >  	struct reloc *reloc;
> > 
> >  	list_for_each_entry(reloc, &rels->reloc_list, list) {
> > -		if (!mcountsym)
> > -			mcountsym = get_mcountsym(reloc);
> > -
> > -		if (mcountsym == GELF_R_INFO(reloc->sym->idx, reloc->type) && !is_fake_mcount(reloc)) {
> > -			uint_t const addend =
> > -				_w(reloc->offset - recval + mcount_adjust);
> > -			mrelp->r_offset = _w(offbase
> > -				+ ((void *)mlocp - (void *)mloc0));
> > -			Elf_r_info(mrelp, recsym_index, reltype);
> > -			if (rel_entsize == sizeof(Elf_Rela)) {
> > -				((Elf_Rela *)mrelp)->r_addend = addend;
> > -				*mlocp++ = 0;
> > -			} else
> > -				*mlocp++ = addend;
> > -
> > -			mrelp = (Elf_Rel *)(rel_entsize + (void *)mrelp);
> > +		unsigned long addend;
> > +
> > +		if (!mcount_sym_info)
> > +			mcount_sym_info = get_mcount_sym_info(reloc);
> > +
> > +		if (mcount_sym_info != GELF_R_INFO(reloc->sym->idx, reloc->type) || is_fake_mcount(reloc))
> > +			continue;
> 
> Hi Matt,
> 
> I was trying out the patch series on ppc64le and found that __mcount_loc
> and .rela__mcount_loc section pairs do not get generated. 
> 
> # readelf -S fs/proc/cmdline.o|grep mcount
> #
> 
> Debugged the cause to get_mcountsym()'s return type.  It returns reloc
> type from GELF_R_INFO() and expects Elf64_Xword a.k.a unsigned long
> to be the return type but get_mcountsym() returns unsigned int on 64-bit.
> 
> On power the _mcount is of relocation type R_PPC64_REL24 (info 0x170000000a),
> using unsigned int truncates the value to 0xa and fails the above check.
> Using below fix, that converts mcount_sym_info to use unsigned long, generates
> the __mcount_loc section pairs.
> 
> --- a/tools/objtool/mcount.c
> +++ b/tools/objtool/mcount.c
> @@ -163,7 +163,7 @@ static int is_mcounted_section_name(char const *const txtname)
>                 strcmp(".cpuidle.text", txtname) == 0;
>  }
>  
> -static unsigned int get_mcount_sym_info(struct reloc *reloc)
> +static unsigned long get_mcount_sym_info(struct reloc *reloc)
>  {
>         struct symbol *sym = reloc->sym;
>         char const *symname = sym->name;
> @@ -274,7 +274,7 @@ static int nop_mcount(struct section * const rels,
>  {
>         struct reloc *reloc;
>         struct section *txts = find_section_by_index(lf, rels->sh.sh_info);
> -       unsigned int mcount_sym_info = 0;
> +       unsigned long mcount_sym_info = 0;
>         int once = 0;
>  
>         list_for_each_entry(reloc, &rels->reloc_list, list) {
> @@ -363,7 +363,7 @@ static void sift_rel_mcount(GElf_Addr **mlocpp,
>  {
>         GElf_Rel *mrelp = *mrelpp;
>         GElf_Rela *mrelap = *mrelpp;
> -       unsigned int mcount_sym_info = 0;
> +       unsigned long mcount_sym_info = 0;
>         struct reloc *reloc;
>  
>         list_for_each_entry(reloc, &rels->reloc_list, list) {
> 
> # readelf -S fs/proc/cmdline.o|grep mcount
>   [31] __mcount_loc      PROGBITS         0000000000000000  00022f10
>   [32] .rela__mcount_loc RELA             0000000000000000  00022f20

Fixed for next posting.

I've essentially added this as another patch before it moves into
recordmcount.c, gets renamed to get_mcount_sym_info(), etc. I did it
this way because it only becomes necessary to change the type before
moving the function (and eventually its callers) out of the wrapper.

I feel I should credit you as author or at least co-author of the added
patch since it's basically a "backported" version of the changes you
suggested. I reviewed the process in submitting-patches.rst and propose
the commit message:
	
	objtool: mcount: Extend mcountsym size
	    
	Before we can move this function out of the wrapper and into
	wordsize-independent code we need to explicitly size the
	type returned from get_mcountsym() to preserve the symbol info.

	Reported-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
	Signed-off-by: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
	Signed-off-by: Matt Helsley <mhelsley@vmware.com>

Is that OK with you or do you have another preference?

> 
> 
> > +
> > +		addend = reloc->offset - recval + mcount_adjust;
> > +		if (is_rela) {
> > +			mrelap->r_offset = *r_offsetp;
> > +			mrelap->r_info = GELF_R_INFO(recsym_index, reltype);
> > +			mrelap->r_addend = addend;
> > +			mrelap++;
> > +			**mlocpp = 0;
> > +		} else {
> > +			mrelp->r_offset = *r_offsetp;
> > +			mrelp->r_info = GELF_R_INFO(recsym_index, reltype);
> > +			mrelp++;
> > +			**mlocpp = addend;
> >  		}
> > +		(*mlocpp)++;
> > +		r_offsetp += loc_size;
> 
> the offsets generated for rela__mcount_loc section are incorrect:
> 
> # readelf -rW fs/proc/meminfo.o
> [...]
> Relocation section '.rela__mcount_loc' at offset 0x59a48 contains 4 entries:
>     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
> 0000000000000000  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + c
> 00000a059c401f38  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + 64
> 0000000000000000  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + 7c
> 0000000000000000  0000000600000026 R_PPC64_ADDR64         0000000000000000 .init.text + c
> 
> changing the above line to *r_offsetp += loc_size and initializing
> r_offset=0 in do_mcount() generates the correct offset:
> 
> # readelf -rW fs/proc/meminfo.o
> [...]
> Relocation section '.rela__mcount_loc' at offset 0x59a48 contains 4 entries:
>     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
> 0000000000000000  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + c
> 0000000000000008  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + 64
> 0000000000000010  0000000200000026 R_PPC64_ADDR64         0000000000000000 .text + 7c
> 0000000000000018  0000000600000026 R_PPC64_ADDR64         0000000000000000 .init.text + c

Fixed for next posting.

Thank you for testing these out and the fixes!

Cheers,
	-Matt Helsley

  reply	other threads:[~2020-06-09 18:12 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-02 19:49 [RFC][PATCH v4 00/32] objtool: Make recordmcount a subcommand Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 01/32] objtool: Prepare to merge recordmcount Matt Helsley
2020-06-09  8:54   ` Julien Thierry
2020-06-09 15:42     ` Matt Helsley
2020-06-09 19:31       ` Julien Thierry
2020-06-02 19:49 ` [RFC][PATCH v4 02/32] objtool: Make recordmcount into mcount subcmd Matt Helsley
2020-06-09  9:00   ` Julien Thierry
2020-06-09 18:39     ` Matt Helsley
2020-06-09 18:52       ` Steven Rostedt
2020-06-09 18:56         ` Matt Helsley
2020-06-09 19:11       ` Julien Thierry
2020-06-02 19:49 ` [RFC][PATCH v4 03/32] objtool: recordmcount: Start using objtool's elf wrapper Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 04/32] objtool: recordmcount: Search for __mcount_loc before walking the sections Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 05/32] objtool: recordmcount: Convert do_func() relhdrs Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 06/32] objtool: mcount: Remove unused fname parameter Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 07/32] objtool: mcount: Use libelf for section header names Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 08/32] objtool: mcount: Walk objtool Elf structs in find_secsym_ndx Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 09/32] objtool: mcount: Use symbol structs to find mcount relocations Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 10/32] objtool: mcount: Walk relocation lists Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 11/32] objtool: mcount: Move get_mcountsym Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 12/32] objtool: mcount: Replace MIPS offset types Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 13/32] objtool: mcount: Move is_fake_mcount() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 14/32] objtool: mcount: Stop using ehdr in find_section_sym_index Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 15/32] objtool: mcount: Move find_section_sym_index() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 16/32] objtool: mcount: Restrict using ehdr in append_func() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 17/32] objtool: mcount: Use objtool ELF to write Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 18/32] objtool: mcount: Move nop_mcount() Matt Helsley
2020-06-12 13:26   ` Peter Zijlstra
2020-06-12 16:05     ` Peter Zijlstra
2020-06-17 17:36       ` Matt Helsley
2020-06-17 18:30         ` Peter Zijlstra
2020-06-13 19:49     ` Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 19/32] objtool: mcount: Move has_rel_mcount() and tot_relsize() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 20/32] objtool: mcount: Move relocation entry size detection Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 21/32] objtool: mcount: Only keep ELF file size Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 22/32] objtool: mcount: Use ELF header from objtool Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 23/32] objtool: mcount: Remove unused file mapping Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 24/32] objtool: mcount: Reduce usage of _size wrapper Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 25/32] objtool: mcount: Move mcount_adjust out of wrapper Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 26/32] objtool: mcount: Pre-allocate new ELF sections Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 27/32] objtool: mcount: Generic location and relocation table types Matt Helsley
2020-06-09  6:41   ` Kamalesh Babulal
2020-06-09 18:12     ` Matt Helsley [this message]
2020-06-10  4:35       ` Kamalesh Babulal
2020-06-02 19:50 ` [RFC][PATCH v4 28/32] objtool: mcount: Move sift_rel_mcount out of wrapper file Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 29/32] objtool: mcount: Remove wrapper for ELF relocation type Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 30/32] objtool: mcount: Remove wrapper double-include trick Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 31/32] objtool: mcount: Remove endian wrappers Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 32/32] objtool: mcount: Rename Matt Helsley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200609181231.GD1284251@rlwimi.vmware.com \
    --to=mhelsley@vmware.com \
    --cc=jpoimboe@redhat.com \
    --cc=jthierry@redhat.com \
    --cc=kamalesh@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=samitolvanen@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.