From: Luis Gustavo <luis_gustavo@mentor.com>
To: gdb-patches@sourceware.org
Cc: prasad@linux.vnet.ibm.com, benh@kernel.crashing.org
Subject: [PATCH, ppc] Fix hw *points for embedded ppc in a threaded environment.
Date: Mon, 06 Aug 2012 14:33:00 -0000 [thread overview]
Message-ID: <501FD5D6.30005@mentor.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1371 bytes --]
Hi,
GDB has always assumed that hardware watchpoints and breakpoints should
be replicated for every new thread in ppc. This worked fine for the old
DABR-based mechanism since both server and embedded ppc's supported only
a single hw watchpoint or breakpoint.
With the somewhat recent booke kernel interface, more hw
watchpoints/breakpoints are available to GDB.
The logic of replicating the existing process' debug state to the new
thread is still there though, but the new booke interface in the kernel
already replicates that state. More precisely, the kernel gives the new
thread the debug state of its parent thread.
When GDB tries to replicate the debug state, it will actually cause the
kernel to allocate a new hw *point entry, leading to inadequate
consumption of hw debug resources.
It's still unclear if the kernel is supposed to do this and i'm chasing
answers with the ppc linux kernel folks
(https://lists.ozlabs.org/pipermail/linuxppc-dev/2012-August/100083.html).
Nonetheless, the kernel is out and it has such behavior.
This patch tries to address this problem by clearing any debug state
prior to replicating *points to the new thread. If the kernel is doing
something it's not supposed to, then this is a workaround for the broken
kernels.
This would be nice to include before 7.5, as it's an annoying problem.
OK?
Regards,
Luis
[-- Attachment #2: 0001-fix_ppc_hw_watch.diff --]
[-- Type: text/x-patch, Size: 1467 bytes --]
2012-08-06 Luis Machado <lgustavo@codesourcery.com>
* ppc-linux-nat.c (ppc_linux_new_thread): Clear the new thread's
debug state prior to replicating existing hardware watchpoints or
breakpoints.
Index: gdb_head/gdb/ppc-linux-nat.c
===================================================================
--- gdb_head.orig/gdb/ppc-linux-nat.c 2012-08-06 11:02:12.538532628 -0300
+++ gdb_head/gdb/ppc-linux-nat.c 2012-08-06 11:04:38.486536320 -0300
@@ -2179,7 +2179,21 @@ ppc_linux_new_thread (struct lwp_info *l
/* Copy that thread's breakpoints and watchpoints to the new thread. */
for (i = 0; i < max_slots_number; i++)
if (hw_breaks[i].hw_break)
- booke_insert_point (hw_breaks[i].hw_break, tid);
+ {
+ /* The ppc Linux kernel causes a thread to inherit its parent
+ thread's debug state, and that includes any hardware
+ watchpoints or breakpoints that the parent thread may have set.
+
+ For this reason, the debug state of the new thread is cleared
+ before trying to replicate any hardware watchpoints or
+ breakpoints contained in other threads. */
+
+ /* The ppc debug resource accounting is done through "slots".
+ Ask the kernel the deallocate this specific *point's slot. */
+ ptrace (PPC_PTRACE_DELHWDEBUG, tid, 0, hw_breaks[i].slot);
+
+ booke_insert_point (hw_breaks[i].hw_break, tid);
+ }
}
else
ptrace (PTRACE_SET_DEBUGREG, tid, 0, saved_dabr_value);
next reply other threads:[~2012-08-06 14:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-06 14:33 Luis Gustavo [this message]
2012-08-06 18:40 ` Jan Kratochvil
2012-08-06 19:02 ` Luis Gustavo
2012-08-06 20:28 ` Jan Kratochvil
2012-08-07 14:55 ` Luis Gustavo
2012-08-07 15:00 ` Jan Kratochvil
2012-08-07 15:02 ` Luis Gustavo
2012-12-27 19:50 ` Luis Machado
2013-01-22 12:12 ` Pedro Alves
2013-04-17 20:33 Luis Machado
2013-04-18 0:19 ` Sergio Durigan Junior
2013-04-18 0:51 ` Luis Machado
2013-04-22 21:09 ` Luis Machado
2013-04-22 21:09 ` Pedro Alves
2013-04-23 0:05 ` Pedro Alves
2013-04-23 1:15 ` Pedro Alves
2013-04-23 20:25 ` Luis Machado
2013-04-23 23:18 ` Luis Machado
2013-04-24 3:19 ` Pedro Alves
2013-04-24 6:28 ` Luis Machado
2013-04-24 19:04 ` Pedro Alves
2013-04-25 14:13 ` Luis Machado
2013-05-07 7:44 ` Luis Machado
2013-04-24 4:36 ` Pedro Alves
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=501FD5D6.30005@mentor.com \
--to=luis_gustavo@mentor.com \
--cc=benh@kernel.crashing.org \
--cc=gdb-patches@sourceware.org \
--cc=prasad@linux.vnet.ibm.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