lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <53872A72.6040007@hitachi.com>
Date:	Thu, 29 May 2014 21:39:14 +0900
From:	Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
To:	linux-kernel@...r.kernel.org,
	Arnaldo Carvalho de Melo <acme@...nel.org>
Cc:	Namhyung Kim <namhyung@...nel.org>, Jiri Olsa <jolsa@...hat.com>,
	Ingo Molnar <mingo@...hat.com>,
	Paul Mackerras <paulus@...ba.org>,
	Peter Zijlstra <a.p.zijlstra@...llo.nl>
Subject: Re: [PATCH -tip ] [BUGFIX] perf/probe: Fix perf probe to find correct
 variable DIE

Hi Arnaldo,

Here is the patch which fixes perf probe to find variable
location correctly, on the recent dwarf format. This is not
related to the SEGV issue which I fixed in previous mail.

Thank you,

(2014/05/29 21:19), Masami Hiramatsu wrote:
> Fix perf probe to find correct variable DIE which has location or
> external instance by tracking down the lexical blocks.
> 
> Current die_find_variable() expects that the all variable DIEs
> which has DW_TAG_variable have a location. However, since recent
> dwarf information may have declaration variable DIEs at the
> entry of function (subprogram), die_find_variable() returns it.
> 
> To solve this problem, it must track down the DIE tree to find
> a DIE which has an actual location or a reference for external
> instance.
> 
> e.g. finding a DIE which origin is <0xdc73>;
> 
>  <1><11496>: Abbrev Number: 95 (DW_TAG_subprogram)
>     <11497>   DW_AT_abstract_origin: <0xdc42>
>     <1149b>   DW_AT_low_pc      : 0x1850
> [...]
>  <2><114cc>: Abbrev Number: 119 (DW_TAG_variable) <- this is a declaration
>     <114cd>   DW_AT_abstract_origin: <0xdc73>
>  <2><114d1>: Abbrev Number: 119 (DW_TAG_variable)
> [...]
>  <3><115a7>: Abbrev Number: 105 (DW_TAG_lexical_block)
>     <115a8>   DW_AT_ranges      : 0xaa0
>  <4><115ac>: Abbrev Number: 96 (DW_TAG_variable) <- this has a location
>     <115ad>   DW_AT_abstract_origin: <0xdc73>
>     <115b1>   DW_AT_location    : 0x486c        (location list)
> 
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
> Cc: Arnaldo Carvalho de Melo <acme@...nel.org>
> Cc: Peter Zijlstra <a.p.zijlstra@...llo.nl>
> Cc: Paul Mackerras <paulus@...ba.org>
> Cc: Ingo Molnar <mingo@...hat.com>
> Cc: Namhyung Kim <namhyung@...nel.org>
> Cc: Jiri Olsa <jolsa@...hat.com>
> ---
>  tools/perf/util/dwarf-aux.c |    7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c
> index 7defd77..cc66c40 100644
> --- a/tools/perf/util/dwarf-aux.c
> +++ b/tools/perf/util/dwarf-aux.c
> @@ -747,14 +747,17 @@ struct __find_variable_param {
>  static int __die_find_variable_cb(Dwarf_Die *die_mem, void *data)
>  {
>  	struct __find_variable_param *fvp = data;
> +	Dwarf_Attribute attr;
>  	int tag;
>  
>  	tag = dwarf_tag(die_mem);
>  	if ((tag == DW_TAG_formal_parameter ||
>  	     tag == DW_TAG_variable) &&
> -	    die_compare_name(die_mem, fvp->name))
> +	    die_compare_name(die_mem, fvp->name) &&
> +	/* Does the DIE have location information or external instance? */
> +	    (dwarf_attr(die_mem, DW_AT_external, &attr) ||
> +	     dwarf_attr(die_mem, DW_AT_location, &attr)))
>  		return DIE_FIND_CB_END;
> -
>  	if (dwarf_haspc(die_mem, fvp->addr))
>  		return DIE_FIND_CB_CONTINUE;
>  	else
> 
> 
> 
> 


-- 
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Research Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@...achi.com


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ