questions around Book III-E and branch trace
Hi,
I'm trying to wrap my head around how linux handles branch tracing on Book III-E. I think I understand how we set MSR[DE] and DBCR0[IDM|BT], and how we handle fixing things up if an instruction being traced causes an exception.
I have a few questions though:
1) Does user_enable_block_step() have a bug in it? The current code has
task->thread.dbcr0 = DBCR0_IDM | DBCR0_BT;
Should that be as follows (to match the singel-step case)?
task->thread.dbcr0 |= DBCR0_IDM | DBCR0_BT;
2) Why doesn't DBCR0_ACTIVE_EVENTS include DBCR0_BT?
3) In sys_debug_setcontext() why does SIG_DBG_BRANCH_TRACING return -EINVAL if CONFIG_PPC_ADV_DEBUG_REGS is set? Would it not be possible to use DBCR0_BT?
Thanks,
Chris
Signature · 8 lines
Chris Friesen Software Designer 500 Palladium Drive, Suite 2100 Ottawa, Ontario K2N 1C2, Canada www.genband.com office:+1.343.883.2717 [email protected]
BUG: branch trace support for 64-bit Book-E (was Re: questions around Book III-E and branch trace)
Quoted 6 lines · Chris Friesen
Hi,
I'm trying to wrap my head around how linux handles branch tracing on Book III-E. I think I understand how we set MSR[DE] and DBCR0[IDM|BT], and how we handle fixing things up if an instruction being traced causes an exception.
While poking around looking for answers to my previous questions I seem to have stumbled over a bug in branch tracing for 64-bit Book-E.
Commit ec097c8 added support for branch tracing for 32-bit code, but didn't do the 64-bit path. As it stands, debug_crit/debug_debug in exceptions-64e.S only check DBSR_IC, so branch tracing will not get fixed up and will die a horrible death (typically in a tbr exception handler).
I was banging my head trying to figure out why this wasn't working when I finally clued in to the fact that head_booke.h only applied to the 32-bit implementation. This might be something useful to put in a comment up at the top of the file.
Chris
Quoted 6 lines · Chris Friesen
Hi,
I'm trying to wrap my head around how linux handles branch tracing on Book III-E. I think I understand how we set MSR[DE] and DBCR0[IDM|BT], and how we handle fixing things up if an instruction being traced causes an exception.
That code is a mess and it wouldn't surprise me if it was broken...
At this point, the people who care the most about it are FSL, so that's where you have the most chance to find a satisfactory answer.
Cheers,
Ben.
Quoted 22 lines
I have a few questions though:
1) Does
user_enable_block_step()have a bug in it? The current code has
task->thread.dbcr0=DBCR0_IDM|DBCR0_BT;Should that be as follows (to match the singel-step case)?
task->thread.dbcr0|=DBCR0_IDM|DBCR0_BT;2) Why doesn't
DBCR0_ACTIVE_EVENTSincludeDBCR0_BT?3) In
sys_debug_setcontext()why doesSIG_DBG_BRANCH_TRACINGreturn-EINVALifCONFIG_PPC_ADV_DEBUG_REGSis set? Would it not be possible to useDBCR0_BT?Thanks,
Chris