Hi Ulrich,

> I've now got it working reliably on on Versatile Express, after fixing
> a couple of bugs on the GDB side (both in the HW-watchpoint patch, and
> in common GDB code).  The testsuite now passes with no regressions when
> enabling HW watchpoints, except for two tests that require more than one
> single watchpoint to be supported.

That's good to hear, thanks.
 
> This raises another couple of issues/questions, however:
> 
> - In testing on Versatile Express, I noticed what appears to be SMP
>   related bugs in handling regular software breakpoints: occasionally,
>   software breakpoints simply are not hit and execution continues as if
>   the underlying code had not been changed at all.  This symptom
>   completely goes away if GDB and the debugged process are forced to
>   the same CPU using the affinity feature (e.g. with schedtool).

I've seen this issue in the past but I thought I'd fixed it. What kernel are
you using and do you have CONFIG_ARM_ERRATA_720789 enabled?

>   My guess, just from seeing those symptoms, would be that when inserting
>   a software breakpoint via ptrace, not all i-caches on all CPUs are
>   reliably flushed ...   Any thoughts on this?

There was an I-cache aliasing problem in the kernel coupled with a TLB
invalidation hardware bug on the versatile express. I fixed these though
and haven't seen any problems since.

> - As mentioned above, the kernel currently only supports one single
>   watchpoint to be active at a time, even though hardware might support
>   multiple ones.  The reason seems to be that when a watchpoint triggers,
>   the kernel cannot figure out which one it was (if there's more than one
>   choice).
> 
>   This is a bit unfortunate, given that GDB will attempt to insert two
>   or more watchpoints in many interesting cases (e.g. a "watch *p"
>   command will insert *two* low-level watchpoints, one at the address
>   of p, and one at the address where p (currently) points to).
> 
>   In addition, for regular (write) watchpoints, GDB does not actually
>   *require* the underlying hardware/kernel to specify which watchpoint
>   was hit; GDB is able to find out by itself by checking whether the
>   values at any of the currently active locations actually changed.
>   (For read/access type watchpoints, GDB does require that underlying
>   support -- but those are much more rarely used anyway.)
> 
>   Do you see any chance of improving upon the current behaviour?

Hmmm, I'll need to have a think about this. What does GDB do if it receives
a SIGTRAP with si_addr set to (potentially) complete nonsense? As an aside,
Cortex-A15 reports the faulting address for a watchpoint correctly, so we
will be able to use multiple watchpoints there.

> - Finally, I noticed when reading kernel code that under some
>   circumstances, the kernel will automatically do a single step to
>   get off a watchpoint that was just hit.  However, this does not
>   happen for user-space watchpoints installed via ptrace, right?
>   (Just wanting to confirm; since GDB currently does that single
>   step itself -- we don't want *both* kernel and GDB to issue a
>   single step each ...)

If the {break,watch}point has been inserted via ptrace, the kernel will
send a SIGTRAP instead of stepping the instruction.

> I haven't gotten to looking further into other hardware (IGEP,
> Panda) -- that's next on the list.

Good stuff, keep me posted if you see any further problems!

Thanks,

Will




_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to