From: Pedro Alves <pedro@codesourcery.com>
To: Thiago Jung Bauermann <bauerman@br.ibm.com>
Cc: gdb-patches@sourceware.org,
Jan Kratochvil <jan.kratochvil@redhat.com>,
Joel Brobecker <brobecker@adacore.com>,
Eli Zaretskii <eliz@gnu.org>
Subject: Re: [patch 2/3] Implement support for PowerPC BookE ranged watchpoints
Date: Thu, 25 Nov 2010 17:32:00 -0000 [thread overview]
Message-ID: <201011251731.58135.pedro@codesourcery.com> (raw)
In-Reply-To: <1290632755.3164.94.camel@hactar>
On Wednesday 24 November 2010 21:05:55, Thiago Jung Bauermann wrote:
> On Tue, 2010-11-23 at 23:16 +0000, Pedro Alves wrote:
> > On Tuesday 23 November 2010 21:51:40, Thiago Jung Bauermann wrote:
> > > Ok?
> >
> > Apologies for jumping in so late, but, I don't think I understand
> > why does the user need to know that a watchpoint is "ranged"
> > or not. All (low-level) watchpoints are ranged,
>
> Good point. At the time these patches were made, GDB didn't behave that
> way, but it was fixed one year ago already[1]. I guess I just kept the
> old mentality...
That patch helped in the array case (maybe it was even a regression
that was fixed?), but even the structure case, gdb always behaved
the "ranged" way, AFAIK. E.g., if you "(gdb) watch" an int, assuming
32-bit, gdb is supposed to be watching the range of 4 bytes starting
from the int's address. And watching "int i;" is supposed to be
the same as watching "struct {int i;} i";
>
> > and what's
> > relevant here is only the width of the range the hardware can watch,
> > but that is already a parameter to the target_insert_watchpoint
> > method. So I guess my question is, why can't the target backend
> > manage whether to use a range or "normal" watchpoint when asked to
> > inserted a watchpoint? Is it the watch resource accounting done
> > by breakpoint.c (which is known to be something that should just
> > go away)?
>
> Yes, the resource accounting is an issue.
> But also, the target needs to
> know that it's being asked to watch a region which is expected to have
> accesses in the middle of it. This is because of the difference of how
> hardware watchpoints work in server and embedded PowerPC processors. In
> the former, a hardware watchpoint triggers when any byte within an 8
> byte window starting at the given address is accessed. In the latter,
> only accesses at the given address trigger the watchpoint.
Hmm.. Oh? Without knowing a think about BookE, that is not what I'd
infer from:
static int
ppc_linux_region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
{
/* Handle sub-8-byte quantities. */
if (len <= 0)
return 0;
/* The new BookE ptrace interface tells if there are alignment restrictions
for watchpoints in the processors. In that case, we use that information
to determine the hardcoded watchable region for watchpoints. */
if (have_ptrace_booke_interface ())
{
if (booke_debug_info.data_bp_alignment
&& (addr + len > (addr & ~(booke_debug_info.data_bp_alignment - 1))
+ booke_debug_info.data_bp_alignment))
return 0;
}
/* addr+len must fall in the 8 byte watchable region for DABR-based
processors (i.e., server processors). Without the new BookE ptrace
interface, DAC-based processors (i.e., embedded processors) will use
addresses aligned to 4-bytes due to the way the read/write flags are
passed in the old ptrace interface. */
else if (((ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
&& (addr + len) > (addr & ~3) + 4)
|| (addr + len) > (addr & ~7) + 8)
return 0;
return 1;
}
The use of "addr + len" in both BookE cases above
seems to allow setting a BookE exact PPC_BREAKPOINT_MODE_EXACT
watchpoint watching [0x..002, 0x..003] (say, eith an
"int foo" global, watch ((char *)&foo)[2]), but, if this
only traps on exact address matches, rather than on accesses
within the watchable regision, why is there a "len" contemplated?
Confusing.
> So for an embedded powerpc processor, it's not enough to know that it
> should watch a 4 byte region at a given address. If it represents an
> integer and thus it can expect accesses only at that address then a
> regular watchpoint is enough. But if it's an array of four chars, then
> it needs two watchpoint registers to set up a hardware watchpoint...
It all looks to me that the "ranged" notion is backwards.
The default watchpoint that GDB expects to handle _is_ ranged.
E.g., that's how it works on x86, and DABR based PPC.
That's why this:
+* GDB now supports ranged watchpoints, which stop the inferior when it
+ accesses any address within a specified memory range.
Is just confusing, because this is not a new GDB feature.
BTW, it's not only useful to watch the whole range of a
structure or arrays. It's often useful to watch what random
code is clobbering an int or pointer. The bad write may well be
to the middle of the integer or pointer. I bet that
users end up surprised if PPC doesn't catch that with
gdb's "watch" command.
> So that's way I created a target_insert_ranged_watchpoint. The other
> option would be to add a flag to target_insert_watchpoint...
It appears to me that if there should be a new kind of way to
insert watchpoints, it should be to allow setting watchpoints
that only work if the accesses are aligned, that is to support
the behaviour you describe with PPC_BREAKPOINT_MODE_EXACT
in embedded processors.
--
Pedro Alves
next prev parent reply other threads:[~2010-11-25 17:32 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-23 21:52 Thiago Jung Bauermann
2010-11-23 23:17 ` Pedro Alves
2010-11-24 21:06 ` Thiago Jung Bauermann
2010-11-25 17:32 ` Pedro Alves [this message]
2010-11-26 11:09 ` Eli Zaretskii
2010-11-27 13:25 ` Thiago Jung Bauermann
2010-11-27 15:28 ` Eli Zaretskii
2010-11-26 21:15 ` Thiago Jung Bauermann
2010-11-27 17:47 ` Pedro Alves
2010-11-27 18:01 ` Pedro Alves
2010-12-09 1:44 ` Thiago Jung Bauermann
2010-12-23 19:07 ` Thiago Jung Bauermann
2010-12-23 19:13 ` Eli Zaretskii
2010-12-23 20:17 ` Thiago Jung Bauermann
2010-12-23 22:18 ` Pedro Alves
2010-12-24 5:10 ` Joel Brobecker
2010-12-25 14:13 ` Eli Zaretskii
2010-12-27 20:18 ` Thiago Jung Bauermann
2010-12-28 2:30 ` Thiago Jung Bauermann
2010-12-28 5:47 ` Joel Brobecker
2010-12-28 16:42 ` Pedro Alves
2010-12-28 16:10 ` Pedro Alves
2010-12-29 1:00 ` Thiago Jung Bauermann
2010-11-26 10:59 ` Eli Zaretskii
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=201011251731.58135.pedro@codesourcery.com \
--to=pedro@codesourcery.com \
--cc=bauerman@br.ibm.com \
--cc=brobecker@adacore.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=jan.kratochvil@redhat.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