dwarves.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Nathan Chancellor <nathan@kernel.org>, Yonghong Song <yhs@fb.com>
Cc: Nick Desaulniers <ndesaulniers@google.com>,
	dwarves@vger.kernel.org, llvm@lists.linux.dev
Subject: BTF: A fix and more work to do :Re: die__process_unit: DW_TAG_label (0xa) @ <0x7b> not handled!
Date: Thu, 29 Sep 2022 09:42:53 -0300	[thread overview]
Message-ID: <YzWSzXKcm6rSWOC5@kernel.org> (raw)
In-Reply-To: <YzRnfz0sVpX8CzeL@dev-arch.thelio-3990X>

Em Wed, Sep 28, 2022 at 08:25:51AM -0700, Nathan Chancellor escreveu:
> On Wed, Sep 28, 2022 at 10:42:53AM -0300, Arnaldo Carvalho de Melo wrote:
> > Can you please provide the vmlinux file where this takes place?
> 
> Sure thing, it is compressed to save some bandwidth while downloading:
> 
> https://1drv.ms/u/s!AsQNYeB-IEbqnnzsULjM1pXmOlI5?e=qHKjuW

So, fixed the case reported, DW_TAG_label outside a DW_TAG_lexblock, on
asm DW_TAG_compile_unit DWARF containers, now I noticed that pahole
suports encoding BTF_KIND_TAG (18) but not _decoding_ those, so off I go
to work on it on btf_loader.c, looking at what btf_encoder.c does.

Good that you got me this vmlinux built by clang 15 :-)

Now we can BTF encode a vmlinux (-J) using all the CPUs in the system
(-j), and then we end up with a kernel with BTF_KIND_TAG that can't be
properly grokked by pahole when loading from BTF:

⬢[acme@toolbox pahole]$ pahole -j -J vmlinux-pahole-warnings
⬢[acme@toolbox pahole]$ pahole -F btf vmlinux-pahole-warnings  > pahole-pretty-printed-from-btf
BTF: idx: 277, Unknown kind 18
BTF: idx: 281, Unknown kind 18
BTF: idx: 331, Unknown kind 18
BTF: idx: 689, Unknown kind 18
BTF: idx: 692, Unknown kind 18

For instance:

⬢[acme@toolbox pahole]$ pahole -C __sifields -F btf vmlinux-pahole-warnings
BTF: idx: 277, Unknown kind 18
BTF: idx: 281, Unknown kind 18
BTF: idx: 331, Unknown kind 18
BTF: idx: 689, Unknown kind 18
<BIG SNIP>
BTF: idx: 128403, Unknown kind 18
BTF: idx: 128409, Unknown kind 18
union __sifields {
	struct {
		__kernel_pid_t     _pid;               /*     0     4 */
		__kernel_uid32_t   _uid;               /*     4     4 */
	} _kill;                                       /*     0     8 */
	struct {
		__kernel_timer_t   _tid;               /*     0     4 */
		int                _overrun;           /*     4     4 */
		sigval_t           _sigval;            /*     8     8 */
		int                _sys_private;       /*    16     4 */
	} _timer;                                      /*     0    24 */
	struct {
		__kernel_pid_t     _pid;               /*     0     4 */
		__kernel_uid32_t   _uid;               /*     4     4 */
		sigval_t           _sigval;            /*     8     8 */
	} _rt;                                         /*     0    16 */
	struct {
		__kernel_pid_t     _pid;               /*     0     4 */
		__kernel_uid32_t   _uid;               /*     4     4 */
		int                _status;            /*     8     4 */

		/* XXX 4 bytes hole, try to pack */

		__kernel_clock_t   _utime;             /*    16     8 */
		__kernel_clock_t   _stime;             /*    24     8 */
	} _sigchld;                                    /*     0    32 */
	struct {
		<ERROR            > _addr;             /*     0     8 */
		union {
			int        _trapno;            /*     8     4 */
			short      _addr_lsb;          /*     8     2 */
			struct {
				char _dummy_bnd[8];    /*     8     8 */
				<ERROR> _lower;        /*    16     8 */
				<ERROR> _upper;        /*    24     8 */
			} _addr_bnd;                   /*     8    24 */
			struct {
				char _dummy_pkey[8];   /*     8     8 */
				__u32 _pkey;           /*    16     4 */
			} _addr_pkey;                  /*     8    12 */
			struct {
				unsigned long _data;   /*     8     8 */
				__u32 _type;           /*    16     4 */
				__u32 _flags;          /*    20     4 */
			} _perf;                       /*     8    16 */
		};                                     /*     8    24 */
	} _sigfault;                                   /*     0    32 */
	struct {
		long               _band;              /*     0     8 */
		int                _fd;                /*     8     4 */
	} _sigpoll;                                    /*     0    16 */
	struct {
		<ERROR            > _call_addr;        /*     0     8 */
		int                _syscall;           /*     8     4 */
		unsigned int       _arch;              /*    12     4 */
	} _sigsys;                                     /*     0    16 */
};

⬢[acme@toolbox pahole]$

And if we look from DWARF:

⬢[acme@toolbox pahole]$ pahole -C __sifields -F dwarf vmlinux-pahole-warnings   | grep -w _addr -B2 -A2
	} _sigchld;                                    /*     0    32 */
	struct {
		user *             _addr;              /*     0     8 */
		union {
			int        _trapno;            /*     8     4 */
⬢[acme@toolbox pahole]$

And from the source code:

        /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
        struct {
                void __user *_addr; /* faulting insn/memory ref. */
#ifdef __ia64__
                int _imm;               /* immediate value for "break" */
                unsigned int _flags;    /* see ia64 si_flags */
                unsigned long _isr;     /* isr */
#endif

#define __ADDR_BND_PKEY_PAD  (__alignof__(void *) < sizeof(short) ? \
                              sizeof(short) : __alignof__(void *))
                union {
                        /* used on alpha and sparc */
                        int _trapno;    /* TRAP # which caused the signal */
                        /*
                         * used when si_code=BUS_MCEERR_AR or
                         * used when si_code=BUS_MCEERR_AO
                         */
                        short _addr_lsb; /* LSB of the reported address */
                        /* used when si_code=SEGV_BNDERR */
                        struct {
                                char _dummy_bnd[__ADDR_BND_PKEY_PAD];
                                void __user *_lower;
                                void __user *_upper;
                        } _addr_bnd;


Ok:

#  define __user        BTF_TYPE_TAG(user)

#if defined(CONFIG_DEBUG_INFO_BTF) && defined(CONFIG_PAHOLE_HAS_BTF_TAG) && \
        __has_attribute(btf_type_tag)
# define BTF_TYPE_TAG(value) __attribute__((btf_type_tag(#value)))
#else
# define BTF_TYPE_TAG(value) /* nothing */
#endif

Ok, homework to do: we need to better support btf_type_tag in both
pahole pretty printer and in its BTF loader. :-)

One of the new features will be:

	pahole --types_with_user_members

- Arnaldo

  parent reply	other threads:[~2022-09-29 12:43 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-27 18:56 die__process_unit: DW_TAG_label (0xa) @ <0x7b> not handled! Nathan Chancellor
2022-09-27 19:08 ` Arnaldo Carvalho de Melo
2022-09-27 19:59   ` Nathan Chancellor
2022-09-28 13:42     ` Arnaldo Carvalho de Melo
2022-09-28 15:25       ` Nathan Chancellor
2022-09-29  1:03         ` Arnaldo Carvalho de Melo
2022-09-29 12:42         ` Arnaldo Carvalho de Melo [this message]
2022-09-29 12:50           ` BTF: A fix and more work to do :Re: " Arnaldo Carvalho de Melo
2022-09-29 19:33           ` Arnaldo Carvalho de Melo
2022-10-07 23:32             ` Yonghong Song
2022-09-28 21:35 ` Nick Desaulniers
2022-09-29  0:57   ` Arnaldo Carvalho de Melo

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=YzWSzXKcm6rSWOC5@kernel.org \
    --to=acme@kernel.org \
    --cc=dwarves@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=yhs@fb.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).