Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Mar 2011 20:20:07 +0200
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Xingxing Pan <panxingxing@mprc.pku.edu.cn>
Cc:        freebsd-hackers@freebsd.org, Chagin Dmitry <dchagin@freebsd.org>
Subject:   Re: GSoC'11: DWARF2 call frame information
Message-ID:  <20110322182007.GV78089@deviant.kiev.zoral.com.ua>
In-Reply-To: <AANLkTi=nvGeGRVk2KV-6G8ktAohcaOZXpS%2B1MRBbYcJu@mail.gmail.com>
References:  <AANLkTinz6B7fsG7Cjc3ZTZ0OAmsOG8x1P25EfOE7Bt4J@mail.gmail.com> <20110319174115.GA33282@dchagin.static.corbina.ru> <AANLkTimp9qoOFr0VfK1F_r1nE3n_5d7W2-q_vSK_UzgW@mail.gmail.com> <20110320071847.GA10579@dchagin.static.corbina.ru> <AANLkTinxVYZcfvpj4mn7kd%2BfiJ83p7430JSsqxatHCeZ@mail.gmail.com> <20110320181911.GA79862@dchagin.static.corbina.ru> <AANLkTinx%2Bv5ZRr7zq%2BP8gW=umX3PNvhfXpgW8bmUZdtw@mail.gmail.com> <20110321173204.GA7575@dchagin.static.corbina.ru> <20110321200025.GP78089@deviant.kiev.zoral.com.ua> <AANLkTi=nvGeGRVk2KV-6G8ktAohcaOZXpS%2B1MRBbYcJu@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--k5TNUgu2IV3nirhI
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Mar 22, 2011 at 11:39:58PM +0800, Xingxing Pan wrote:
> 2011/3/22 Kostik Belousov <kostikbel@gmail.com>:
> > On Mon, Mar 21, 2011 at 08:32:04PM +0300, Chagin Dmitry wrote:
> >> On Mon, Mar 21, 2011 at 05:36:13PM +0800, Xingxing Pan wrote:
> >> > 2011/3/21 Chagin Dmitry <dchagin@freebsd.org>:
> >> > >> powerfull script.
> >> > >>
> >> > >> Xingxing Pan
> >> > >
> >> > > hmm, which script? I think enough amd64, i386 and amd64/ia32.
> >> > >
> >> > > I suggest to write a example before continuing the conversation
> >> > > about the GSoC. For example (bcopy || bzero) && cpu_switch.
> >> > > Is it ok for you?
> >> > >
> >> > > --
> >> > > Have fun!
> >> > > chd
> >> > >
> >> >
> >> > Hi Chargin,
> >> >
> >> > Thank you for your reply.
> >> > The followings shows how I try to add DWARF for bcopy.
> >> >
> >> > --- ../8.2.0/sys/i386/include/asm.h =9A =9A 2011-03-21 14:35:56.1119=
73722 +0800
> >> > +++ asm.h =9A =9A =9A 2011-03-21 15:25:31.564636162 +0800
> >> > @@ -71,7 +71,7 @@
> >> >
> >> > =9A#define _ENTRY(x) =9A =9A =9A_START_ENTRY; \
> >> > =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A .globl CNAME(x); .ty=
pe CNAME(x),@function; CNAME(x):
> >> > -#define =9A =9A =9A =9AEND(x) =9A =9A =9A =9A =9A.size x, . - x
> >> > +#define =9A =9A =9A =9AEND(x) =9A =9A =9A =9A =9A.cfi_endproc; .siz=
e x, . - x
> >> >
> >> > =9A#ifdef PROF
> >> > =9A#define =9A =9A =9A =9AALTENTRY(x) =9A =9A _ENTRY(x); \
> >> > @@ -80,9 +80,10 @@
> >> > =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A popl %ebp; \
> >> > =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A jmp 9f
> >> > =9A#define =9A =9A =9A =9AENTRY(x) =9A =9A =9A =9A_ENTRY(x); \
> >> > - =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A pushl %ebp; movl %esp,=
%ebp; \
> >> > + =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A .cfi_startproc; \
> >> > + =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A pushl %ebp; .cfi_adjus=
t_cfa_offset 4; movl
> >> > %esp,%ebp; .cfi_def_cfa_register %ebp; \
> >> > =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A call PIC_PLT(HIDENAM=
E(mcount)); \
> >> > - =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A popl %ebp; \
> >> > + =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A =9A popl %ebp; .cfi_def_cf=
a %esp, 4; \
> >> >
> >> > --- bcopy.S =9A =9A 2011-03-21 15:51:26.804203809 +0800
> >> > +++ ../8.2.0/lib/libc/i386/string/bcopy.S =9A =9A =9A 2011-03-21
> >> > 14:28:15.023069890 +0800
> >> > @@ -51,9 +51,7 @@ ENTRY(bcopy)
> >> > =9A#endif
> >> > =9A#endif
> >> > =9A =9A =9A =9A pushl =9A %esi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset 4;
> >> > =9A =9A =9A =9A pushl =9A %edi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset 4;
> >> > =9A#if defined(MEMCOPY) || defined(MEMMOVE)
> >> > =9A =9A =9A =9A movl =9A =9A12(%esp),%edi
> >> > =9A =9A =9A =9A movl =9A =9A16(%esp),%esi
> >> > @@ -77,9 +75,7 @@ ENTRY(bcopy)
> >> > =9A =9A =9A =9A rep
> >> > =9A =9A =9A =9A movsb
> >> > =9A =9A =9A =9A popl =9A =9A%edi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset -4;
> >> > =9A =9A =9A =9A popl =9A =9A%esi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset -4;
> >> > =9A =9A =9A =9A ret
> >> > =9A1:
> >> > =9A =9A =9A =9A addl =9A =9A%ecx,%edi =9A =9A =9A /* copy backwards.=
 */
> >> > @@ -98,9 +94,7 @@ ENTRY(bcopy)
> >> > =9A =9A =9A =9A rep
> >> > =9A =9A =9A =9A movsl
> >> > =9A =9A =9A =9A popl =9A =9A%edi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset -4;
> >> > =9A =9A =9A =9A popl =9A =9A%esi
> >> > - =9A =9A =9A .cfi_adjust_cfa_offset -4;
> >> > =9A =9A =9A =9A cld
> >> > =9A =9A =9A =9A ret
> >> > =9A#ifdef MEMCOPY
> >> >
> >> > But I don't know how to add DWARF for cpu_switch, because I have no
> >> > idea about the circumstance when we need to backtrace through this
> >> > function. Suppose there's a cpu switch like this,
> >> > threadA->kernel->threadB. Then should the expected backtrace has the
> >> > following result?
> >> >
> >> > threadB's stack
> >> > kernel's stack
> >> > threadA's stack
> >>
> >>
> >> hmm, ok. good, avoid cpu_switch.
> >> First of all, please, read style(9) man page.
> >> In the second, evaluate the proposed plan (discussed with kib@):
> >>
> >> 1) Annotate libc, msun, rtld, libthr (you)
> > 1a) Develop and implement a testing plan to verify the implementation.
> > 1b) consider doing full register tracking for assembler code.
> >
> >> 2) vdso (I'm)
> >> 3) Annotate signal trampolines (you, after vdso)
> >>
> >> And i'm going to understand what I need to do to start GSoC for you.
> >> Thanks!
> >>
> >>
> >> --
> >> Have fun!
> >> chd
> >
> >
> >
>=20
> Hi Kostik,
>=20
> I think the basic testing method can be using GDB to set breakpoint in
> functions and observing the backtrace result. GDB uses Expect. I can
> learn something from GDB's testsuite.
Sounds good.

>=20
> AFAIK, CFA and return address are enough for unwinding. Dose full
> register tracking
> means to emit DWARF for all the registers's saving and restoring in
> the life time of the function?

Not only save and restore, but also for move around. I am mostly about
the syscall entry sequence on amd64, see the description of the
`syscall' instruction and handling of %rcx in libc sources.

Rarely used routines could be left aside.

--k5TNUgu2IV3nirhI
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)

iEUEARECAAYFAk2I6FYACgkQC3+MBN1Mb4j60wCfdq9vKzB/bauW++Wd3pPckSh+
H9cAl1RGmx0k3/v3U3/DtlBBaOwkrW8=
=YxhI
-----END PGP SIGNATURE-----

--k5TNUgu2IV3nirhI--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110322182007.GV78089>