On Wed, Apr 12, 2006 at 04:43:12PM +0800, Oliver Yang wrote: > Jonathan Adams wrote: > > >On Tue, Apr 11, 2006 at 08:22:15AM +0800, Oliver Yang wrote: > > > > > >>Sorry for raising the question again, maybe my question is not very > >>clear... > >> > >>Actually, I need check the general register's value for a specific CPU > >>on MP system. But, it seems like ::regs couldn't meet my requirement. > >>Does anybody know the other way? > >> > >> > > > >Typically, you want to look at the trap frame on the active thread on the > >CPU. I haven't done this on i386 in a while; can someone chime in with the > >procedure? > > > >On sparc, you just take the active thread on the cpu, do a ::findstack on > >it, > >take the ktl0 frame address, and do: > > > > addr::print struct frame fr_local[7] | ::print struct regs > > > > > Sorry. Thank you for your response, although I'm not familiar with sparc > platform. > > I ask this question because sometimes ::findstack doesn't work for me on > my crashdump file: > > > ::cpuinfo -v > ID ADDR FLG NRUN BSPL PRI RNRN KRNRN SWITCH THREAD PROC > 0 fec22eb4 1b 1 6 165 no no t-0 cb956de0 sched > | | | > RUNNING <--+ | +--> PIL THREAD > READY | 6 cb956de0 > EXISTS | > ENABLE +--> PRI THREAD PROC > 0 cca2a600 rsh > > ID ADDR FLG NRUN BSPL PRI RNRN KRNRN SWITCH THREAD PROC > 1 cc1449c0 1f 2 0 -1 no no t-0 cc2e6de0 sched > | | > RUNNING <--+ +--> PRI THREAD PROC > READY 60 cba61de0 sched > QUIESCED 60 cbaa7de0 sched > EXISTS > ENABLE > > > cb956de0::findstack > stack pointer for thread cb956de0: cb956ab8 > cb956de0 0xcc9f7130() > > cc2e6de0::findstack > Possible stack pointers for thread cc2e6de0: > cc2e6d00 (2) > cc2e6d54 (2) > cc2e6db8 (2) > > cb956ab8,30/nap > > > If ::findstack doesn't work, we have to check stack by stack pointer > register (esp) on x86. > > But you know, ::regs just can output 1 cpu's register value, in above > case, I couldn't get cpu 1 's register value.
As part of a panic, the panicking CPU cross-calls the other CPUs, inducing them to call panic_idle(). In panic_idle(), the stack pointer is stored in the thread's t_pcb field. Something like: addr::print kthread_t t_pcb.value[1] | $C (where addr is the active thread on the CPU) might get you a stack trace. Cheers, - jonathan -- Jonathan Adams, Solaris Kernel Development