From: "Ulrich Weigand" <uweigand@de.ibm.com>
To: koriakin@0x04.net (Marcin Kościelnicki)
Cc: gdb-patches@sourceware.org, koriakin@0x04.net (Marcin Kościelnicki)
Subject: Re: [PATCH 3/4 v2] gdbserver: Add powerpc fast tracepoint support.
Date: Wed, 16 Mar 2016 16:58:00 -0000 [thread overview]
Message-ID: <20160316165841.59F891537@oc7340732750.ibm.com> (raw)
In-Reply-To: <1457993420-3934-1-git-send-email-koriakin@0x04.net> from "=?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?=" at Mar 14, 2016 11:10:20 PM
Marcin KoÃ
Âcielnicki wrote:
> I'm not sure how to properly determine whether ELFv1 or ELFv2 is in use
> by the target, so I assume it's the same ABI as in gdbserver itself.
That's a generally sensible assumption. In principle, you can check
which ABI the target is using by checking the e_flags field in the
ELF header. The problem for gdbserver is that it usually doesn't
access the ELF file. However, the ELF header is mapped into target
memory, so could be checked there. Yet again, the *address* of the
ELF header is not very easily detectable without making assumptions
on how memory is layed out.
The best bet would probably be to determine the AT_PHDR auxillary vector,
which gives you the address of the *program headers* for the main
executable in the target, and then round that address down to the page
size boundary. This should give you the address of the ELF header,
when making the assumption that the linker places program headers
in the fist page, following the ELF header. This is not necessarily
guaranteed by the ELF format, but is what all linkers happen to do.
> Allocating the jump pad buffer needs a mention. On powerpc64, IPA simply
> scans from 0x10000000 (the executable load address) downwards until it
> find a free address. However, on 32-bit, ld.so loads dynamic libraries
> there, and they can easily cause us to exceed the 32MiB branch range -
> so, instead I aim right after the executable, at sbrk(0). This will
> of course cause further memory allocation via brk to fail, but glibc
> transparently falls back to mmap in this case, so that's not a problem.
> Of course, given a program with large data/bss section, this might
> exceed the branch range as well, so perhaps some better heuristic is
> in order here.
These heuristics seem reasonable to me.
> This fixes get_raw_reg for 32-bit (ULONGEST was used to read the
> registers dumped by jump pad instead of unsigned long). Also slightly
> optimizes gen_limm and fixes a few comments.
> +alloc_jump_pad_buffer (size_t size)
> +{
> +#ifdef __powerpc64__
> + uintptr_t addr;
> + int pagesize;
> + void *res;
> +
> + pagesize = sysconf (_SC_PAGE_SIZE);
> + if (pagesize == -1)
> + perror_with_name ("sysconf");
> +
> + addr = 0x10000000 - size;
It also would be preferable to dynamically determine the actual
load address, since 0x10000000 is just the default, which can
be changed e.g. via linker script or due to PIE address randomization.
You might again use the AT_PHDR auxillary vector (which is what
Wei-cheng's patches did).
> +/* Get the thread area address. This is used to recognize which
> + thread is which when tracing with the in-process agent library. We
> + don't read anything from the address, and treat it as opaque; it's
> + the address itself that we assume is unique per-thread. */
> +
> +static int
> +ppc_get_thread_area (int lwpid, CORE_ADDR *addr)
> +{
> +#ifdef __powerpc64__
> + struct lwp_info *lwp = find_lwp_pid (pid_to_ptid (lwpid));
> + struct thread_info *thr = get_lwp_thread (lwp);
> + struct regcache *regcache = get_thread_regcache (thr, 1);
> + int is_64 = register_size (regcache->tdesc, 0) == 8;
> +#endif
> + long res;
> +
> +#ifdef __powerpc64__
> + if (is_64)
> + res = ptrace (PTRACE_PEEKUSER, lwpid, (long) PT_R13 * sizeof (long),
> + (long) 0);
> + else
> +#endif
> + res = ptrace (PTRACE_PEEKUSER, lwpid, (long) PT_R2 * sizeof (long),
> + (long) 0);
Was there a particular reason why you changed to using direct ptrace
calls instead of collecting the value from the regcache as in the
original patch?
> +/* GEN_LOAD and GEN_STORE generate 64- or 32-bit load/store for ppc64 or ppc32
> + respectively. They are primary used for save/restore GPRs in jump-pad,
> + not used for bytecode compiling. */
> +
> +#if defined __powerpc64__
> +#define GEN_LOAD(buf, rt, ra, si) (is_64 ? GEN_LD (buf, rt, ra, si) : \
> + GEN_LWZ (buf, rt, ra, si))
> +#define GEN_STORE(buf, rt, ra, si) (is_64 ? GEN_STD (buf, rt, ra, si) : \
> + GEN_STW (buf, rt, ra, si))
Huh, using the is_64 variable from the surrounding routine without
passing it in as macro argument is probably not the best idea :-)
> +#if _CALL_ELF == 2
> + /* XXX is there a way to get this dynamically from the inferior? */
> + int is_opd = 0;
See above.
Otherwise, this looks good to me.
Thanks,
Ulrich
--
Dr. Ulrich Weigand
GNU/Linux compilers and toolchain
Ulrich.Weigand@de.ibm.com
next prev parent reply other threads:[~2016-03-16 16:58 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-13 2:31 [PATCH 0/3] " Marcin Kościelnicki
2016-03-13 2:32 ` [PATCH 1/3] gdbserver/IPA: Export some functions via global function pointers Marcin Kościelnicki
2016-03-14 14:41 ` Ulrich Weigand
2016-03-14 14:53 ` Marcin Kościelnicki
2016-03-14 17:49 ` Ulrich Weigand
2016-03-22 9:19 ` Marcin Kościelnicki
2016-03-29 18:08 ` Ulrich Weigand
2016-03-29 21:51 ` Pedro Alves
2016-03-30 11:30 ` Ulrich Weigand
2016-03-29 21:52 ` Marcin Kościelnicki
2016-03-30 11:32 ` Ulrich Weigand
2016-03-30 22:02 ` Marcin Kościelnicki
2016-03-31 18:22 ` Sergio Durigan Junior
2016-03-31 21:42 ` [PATCH obv] gdbserver: Fix C++ build errors in tracepoint.c Marcin Kościelnicki
2016-03-14 17:08 ` [PATCH 1/3] gdbserver/IPA: Export some functions via global function pointers Simon Marchi
2016-03-14 17:40 ` Ulrich Weigand
2016-03-13 2:32 ` [PATCH 3/3] gdbserver: Add powerpc fast tracepoint support Marcin Kościelnicki
2016-03-14 22:10 ` [PATCH 3/4 v2] " Marcin Kościelnicki
2016-03-16 16:58 ` Ulrich Weigand [this message]
2016-03-16 17:55 ` Marcin Kościelnicki
2016-03-17 6:30 ` Ulrich Weigand
2016-03-18 15:09 ` [PATCH v2 3/4] " Marcin Kościelnicki
2016-03-29 18:23 ` Ulrich Weigand
2016-03-30 14:52 ` Simon Marchi
2016-03-30 14:57 ` Ulrich Weigand
2016-03-30 15:24 ` Simon Marchi
2016-03-30 15:28 ` Simon Marchi
2016-03-30 15:35 ` Ulrich Weigand
2016-03-31 1:31 ` Marcin Kościelnicki
2016-03-31 11:39 ` Ulrich Weigand
2016-03-31 13:45 ` Marcin Kościelnicki
2016-03-13 2:32 ` [PATCH 2/3] IPA: Add alloc_jump_pad_buffer target hook Marcin Kościelnicki
2016-03-18 15:08 ` [PATCH 2/4 v2] " Marcin Kościelnicki
2016-03-29 18:18 ` Ulrich Weigand
2016-03-29 22:04 ` Marcin Kościelnicki
2016-03-30 11:38 ` Ulrich Weigand
2016-03-30 14:50 ` Yao Qi
2016-03-30 14:58 ` Ulrich Weigand
2016-03-31 7:34 ` Yao Qi
2016-03-31 11:37 ` Ulrich Weigand
2016-03-31 1:16 ` [PATCH 2/4 v3] " Marcin Kościelnicki
2016-03-31 11:38 ` Ulrich Weigand
2016-03-31 13:42 ` Marcin Kościelnicki
2016-04-01 14:43 ` Ulrich Weigand
2016-04-03 12:31 ` [PATCH] IPA: Fix build problem on !HAVE_GETAUXVAL Marcin Kościelnicki
2016-04-03 16:26 ` Ulrich Weigand
2016-04-03 16:28 ` Marcin Kościelnicki
2016-04-04 14:41 ` Ulrich Weigand
2016-04-05 13:33 ` [PATCH] IPA: Move getauxval out of #ifndef IN_PROCESS_AGENT Marcin Kościelnicki
2016-04-05 15:04 ` Ulrich Weigand
2016-04-05 16:55 ` Marcin Kościelnicki
2016-03-14 22:25 ` [PATCH 4/4] gdbserver: Add emit_ops for powerpc Marcin Kościelnicki
2016-03-16 17:16 ` Ulrich Weigand
2016-03-18 15:10 ` [PATCH v2 " Marcin Kościelnicki
2016-03-29 18:25 ` Ulrich Weigand
2016-03-31 13:45 ` Marcin Kościelnicki
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=20160316165841.59F891537@oc7340732750.ibm.com \
--to=uweigand@de.ibm.com \
--cc=gdb-patches@sourceware.org \
--cc=koriakin@0x04.net \
/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