Hi,

I have integrated hardware breakpoint (bph/bpha) support on
IA64 from Greg Banks <[EMAIL PROTECTED]> and support on x86 arch from
Konstantin Baydarov <[EMAIL PROTECTED]> in the
kdb-v4.4-2.6.26-{common,ia64,x86)-2 patches.

This will break compilation of other platforms. Basically, two
things you need to change:
1) write a pair of wrapper, kdba_alloc_hwbp & kdba_free_hwbp,
   in your arch/*/kdb/kdba_bp.c to call kdba_allocbp and
   kdba_freebp.
2) change all references to bp->bp_hard bp->bp_hard[0] if you keep
   one kdbhard_bp_t pointer in the kdb_bp_t struct (as in the IA64
   case), or change to bp->bp_hard[<cpu>] if you keep kdbhard_bp_t
   pointer per cpu in the kdb_bp_t struct (as in the case of x86.)

The above steps would only get your arch-dependent code compiled
again. You still need to provide your own implementation to support
hardware breakpoints.

Send me email <[EMAIL PROTECTED]> if you need help.

I will attach Greg's and Konstantin's original description below.
Note that i had to twist their codes a bit, especially the common
code, to get a version that works on ia64, x86_64 and i386.

Another note. You should use bph/bpha to set breakpoints on data
addresses and use bp to set breakpoints on instruction. At least
the bph/bpha on ia64 does not support instruction mode.

Avi Nehori reported that the case below did not work. It may still
true. I did nothing in this regard.
    when you set an hardware break point to address XXXXX
      int *ptr = XXXXX -4;
      *(ptr + 4) =9;
    didnt work.


Regards,
 - jay



[Description from Greg Banks]

The patch implements only the bare minimum to solve my particular
problem. Things it does *NOT* do include:

 * Implement "inst" type breakpoints (using the IBR registers instead
   of the DBR registers).  This would be fairly easy but utterly
   redundant given that existing software breakpoints (which writes
   a break.m instruction into RAM) work fine.

 * Implement "io" type breakpoints.  I have no idea how.

 * Fix KDB to allow a read+write breakpoint, i.e. a breakpoint which
   traps when the cpu either reads or writes.  You get to choose read
   breakpoints, or write breakpoints, but not both, and you can't put
   two breakpoints on the same address either.

 * Fix KDB to allow watching areas of memory other than 1, 2 or 4 bytes
   in size.  The natural size on ia64 would be 8 bytes, and the format
   of the DBR registers allows much larger areas (powers of 2 up to
   2^56).

 * Fix KDB to align the breakpoint address to the watched size (the
   hardware does this internally, so KDB should report what the hw is
   actually going to do).

IA64 hardware debug registers generate faults, not traps.  IOW, on
return from the debugger, the cpu executes exactly the same instruction
again. This patch gets around that this way:

  - Force the user to use the "ss" command to single-step the
    instruction manually; this was how I got through my debugging
    sessions.

Caveats:
    Any process using ptrace() or perfmon() to access
    DBRs from userspace will be surprised to see psr.db propagate across
    fork.  However, as the wider problem of making those processes and
    KDB co-exist while using the same small set of DBRs remains
    unaddressed, I wasn't too worried.


[Description from Konstantin Baydarov]:

This patch adds support for global hardware breakpoints to KDB on x86
targets.  Hardware breakpoints are installed by setting per CPU db
registers. So to make a hardware breakpoint global it should be
installed in db registers on every CPU in system.  So global hw bp
can't be handle by kdb_bp_install_global and kdb_bp_remove_global
because these functions are called only on "monarch" CPU,
kdb_bp_install_local and kdb_bp_remove_local should be used instead
because these are called for all CPUs.

Main changes:
  - kdb_hardbreaks[KDB_MAXHARDBPT] - The processor architecture
    hardware breakpoint registers descriptors is defined for every
    CPU:
      static kdbhard_bp_t kdb_hardbreaks[NR_CPUS][KDB_MAXHARDBPT];

  - "kdb_bp_t" (main breakpint structure) contains hardware
    breakpoint registers for every CPU:
      kdbhard_bp_t*     bp_hard[NR_CPUS];

  - global hardware breakpoint installation and removal is handled
    by kdb_bp_install_local and kdb_bp_remove_local which are
    executed on every CPU

  - kdba_allocbp and kdba_freebp are static, now kdba_alloc_hwbp and
    kdba_free_hwbp are used for allocating/freeing hardware breakpoint
    registers.  If the hardware breakpoint is global then
    kdba_alloc_hwbp tries to allocate hardware breakpoint registers on
    every CPU. If there is no free hardware breakpoint on a CPU the
    allocation fails.

  - bph_installed was added to the hardware breakpoint descriptor to
    track per CPU hardware breakpoint installation.

---------------------------
Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.

Reply via email to