Correct. On Thu, 8 May 2008 17:03:35 +0800 "jidong xiao" <[EMAIL PROTECTED]> wrote:
> On Mon, May 5, 2008 at 6:44 PM, Konstantin Baydarov > <[EMAIL PROTECTED]> wrote: > > Yes It's known issue. > > On Mon, 05 May 2008 13:06:11 +0300 > > Avi Nehori <[EMAIL PROTECTED]> wrote: > > > > > Hi, > > > I'm trying to set a watch point with bpha as follows : > > > bpha address dataw 4 > > > but the watchpoint is never called when the memory address is > > > changed. is it a know bug ? > > > is there a patch ? > > > > Here is my previous mail > > (http://oss.sgi.com/archives/kdb/2007-11/msg00037.html) with patch > > that fixes bpha problem: Global HW BP don't work: 1) Install global > > HW BP [EMAIL PROTECTED]:~# > > [EMAIL PROTECTED]:~# D > > Entering kdb (current=0xc04433a0, pid 0) on processor 0 due to > > Keyboard Entry [0]kdb> bpha do_sync > > Forced Instruction(Register) BP #0 at 0xc0181539 (do_sync) > > is enabled in dr0 globally > > [0]kdb> go > > > > -bash: D: command not found > > [EMAIL PROTECTED]:~# > > > > 1) Try CPU 0 > > [EMAIL PROTECTED]:~# > > [EMAIL PROTECTED]:~# taskset -c 0 sync > > Instruction(Register) breakpoint #0 at 0xc0181539 > > 0xc0181539 do_sync: push %ebx > > > > Entering kdb (0xc1b6d030, pid 1319) on processor 0 due to Debug @ > > 0xc0181539 [0]kdb> go > > [EMAIL PROTECTED]:~# > > - OK > > > > 1) Try CPU 1 > > [EMAIL PROTECTED]:~# > > [EMAIL PROTECTED]:~# taskset -c 1 sync > > [EMAIL PROTECTED]:~# > > - Doesn't work. > > > > Signed-off-by: Konstantin Baydarov <[EMAIL PROTECTED]> > > Description: > > 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 andkdba_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. > > > > Patch against kernel 2.6.24-rc2 > > > > Index: linux-2.6.24-rc2/arch/x86/kdb/kdba_bp_32.c > > =================================================================== > > --- linux-2.6.24-rc2.orig/arch/x86/kdb/kdba_bp_32.c > > +++ linux-2.6.24-rc2/arch/x86/kdb/kdba_bp_32.c > > @@ -22,10 +22,10 @@ static char *kdba_rwtypes[] = { "Instruc > > > > /* > > * Table describing processor architecture hardware > > - * breakpoint registers. > > + * breakpoint registers for every CPU. > > */ > > > > -static kdbhard_bp_t kdb_hardbreaks[KDB_MAXHARDBPT]; > > +static kdbhard_bp_t kdb_hardbreaks[NR_CPUS][KDB_MAXHARDBPT]; > > > > /* > > + * kdba_free_hwbp > > + * > > + * Frees allocated hw registers descriptors for bp. > > + * If hw bp is global, hw registers descriptors will be freed > > + * on every CPU. > > + * > > + * Parameters: > > + * bp - hardware bp > > + * Outputs: > > + * None. > > + * Returns: > > + * None > > + * Locking: > > + * None. > > + * Remarks: > > + * Should be called with correct bp->bp_template > > + */ > > + > > +void > > +kdba_free_hwbp(kdb_bp_t *bp) > > +{ > > + int i; > > + > > + /* When kernel enters KDB, first, all local bps > > + * are removed, so here we don't need to clear > > + * debug registers. > > + */ > > + > > + if (bp->bp_global){ > > + for (i = 0; i < NR_CPUS; ++i) { > > + if (!cpu_online(i)) > > + continue; > > + if (bp->bp_hard[i]) > > + kdba_freebp(bp->bp_hard[i]); > > + bp->bp_hard[i] = 0; > > + } > > + } else { > > + kdba_freebp(bp->bp_hard[bp->bp_cpu]); > > + bp->bp_hard[bp->bp_cpu] = NULL; > > + } > > + bp->bp_hardtype = 0; > > +} > > + > > +/* > > * kdba_initbp > > * > > * Initialize the breakpoint table for the hardware breakpoint > > @@ -653,7 +749,7 @@ kdba_freebp(kdbhard_bp_t *bph) > > void > > kdba_initbp(void) > > { > > - int i; > > + int i,j; > > kdbhard_bp_t *bph; > > > > /* > > @@ -662,9 +758,15 @@ kdba_initbp(void) > > > > memset(kdb_hardbreaks, '\0', sizeof(kdb_hardbreaks)); > > > > - for(i=0,bph=kdb_hardbreaks; i<KDB_MAXHARDBPT; i++, bph++) { > > - bph->bph_reg = i; > > - bph->bph_free = 1; > > + for (i = 0; i < NR_CPUS; ++i) { > > + /* Called early so we don't know actual > > + * ammount of CPUs > > + */ > > + for(j=0; j < KDB_MAXHARDBPT; j++) { > > + bph=&(kdb_hardbreaks[i][j]); > > + bph->bph_reg = j; > > + bph->bph_free = 1; > > + } > > } > > } > > > > @@ -698,6 +800,8 @@ kdba_initbp(void) > > int > > kdba_installbp(struct pt_regs *regs, kdb_bp_t *bp) > > { > > + int cpu = smp_processor_id(); > > + > > /* > > * Install the breakpoint, if it is not already installed. > > */ > > @@ -707,15 +811,27 @@ kdba_installbp(struct pt_regs *regs, kdb > > } > > if (!KDB_STATE(SSBPT)) > > bp->bp_delay = 0; > > - if (!bp->bp_installed) { > > - if (bp->bp_hardtype) { > > + > > + if (bp->bp_hardtype) { > > + if (KDB_DEBUG(BP) && !bp->bp_global && cpu != > > bp->bp_cpu){ > > + kdb_printf("kdba_removebp: cpu != > > bp->bp_cpu for local hw bp\n"); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > "s/kdba_removebp/kdba_installbp/", right? > > + } > > + > > + if (KDB_DEBUG(BP) && !bp->bp_hard[cpu]){ > > + kdb_printf("kdba_removebp: Error - > > bp_hard[smp_processor_id()] is emply\n"); > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > And here. > > + return 1; > > + } > > + > > + if (!bp->bp_hard[cpu]->bph_installed){ > > kdba_installdbreg(bp); > > - bp->bp_installed = 1; > > + bp->bp_hard[cpu]->bph_installed = 1; > > if (KDB_DEBUG(BP)) { > > kdb_printf("kdba_installbp hardware > > reg %ld at " kdb_bfd_vma_fmt "\n", > > - bp->bp_hard->bph_reg, > > bp->bp_addr); > > + bp->bp_hard[cpu]->bph_reg, > > bp->bp_addr); } > > - } else if (bp->bp_delay) { > > + } > > + } else if (!bp->bp_installed) { > > + if (bp->bp_delay) { > > if (KDB_DEBUG(BP)) > > kdb_printf("kdba_installbp delayed > > bp\n"); kdba_handle_bp(regs, bp); > > @@ -753,6 +869,8 @@ kdba_installbp(struct pt_regs *regs, kdb > > int > > kdba_removebp(kdb_bp_t *bp) > > { > > + int cpu = smp_processor_id(); > > + > > /* > > * For hardware breakpoints, remove it from the active > > register, > > * for software breakpoints, restore the instruction stream. > --------------------------- > Use http://oss.sgi.com/ecartis to modify your settings or to > unsubscribe. -- With Best Regards, Konstantin Baydarov, Software Engineer Montavista Russia mail-to: [EMAIL PROTECTED] --------------------------- Use http://oss.sgi.com/ecartis to modify your settings or to unsubscribe.
