Port-sparc64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Ultrasparc III+ kernel panic
On Tue, 24 Feb 2015, BERTRAND Joël wrote:
> Eduardo Horvath a écrit :
> > On Tue, 24 Feb 2015, BERTRAND Joël wrote:
> >
> > > matthew green a écrit :
> > > > > Hm. From what I remember, f000xxxx is inside OBP.
> > > >
> > > > that's correct :-)
> > > >
> > > > > Instead of randomly swapping out hardware you really should try to
> > > > > diagnose the problem. I'd turn on ddb and traptrace in the kernel and
> > > > > examine the contents of the traptrace buffer after the panic. That
> > > > > should
> > > > > tell us the sequence of traps that caused the panic.
> > > >
> > > > FWIW, traptrace never was updated for SMP.
> > > >
> > >
> > > Will there a hope to quickly have a fix to obtain traptrace in syslog
> > > ? I'm trying to reproduce this bug on Blade 2000 I have at home without
> > > any
> > > success.
> >
> > Putting traptrace back in is not trivial. It basically involves taking
> > all of the traptrace code that was removed in locore.s version 1.214,
> > enhancing it for SMP, and reinserting it into locore.s. How good are your
> > SPARC assembly language skills?
>
> I haven't written sparc assembly for a very long time (and only on
> sparc32...) :-(
>
> I can try to do something, but I'm not sure I have required knowledge
> to do that without help.
I can give you some advice, but I don't have the time or easy access to
the hardware to re-implement traptrace.
Take a look at the diffs between locore.s versions 1.213 and 1.214. Some
of that code needs to be added back. The first thing to do is rewrite
this TRACEIT macro:
-#define TRACEIT(tt,r3,r4,r2,r6,r7)
\
- set trap_trace, r2; \
- lduw [r2+TRACEDIS], r4; \
- brnz,pn r4, 1f; \
- lduw [r2+TRACEPTR], r3; \
- rdpr %tl, r4; \
- cmp r4, 1; \
- sllx r4, 13, r4; \
- rdpr %pil, r6; \
- or r4, %g5, r4; \
- mov %g0, %g5; \
- andncc r3, (TRACESIZ-1), %g0; /* At end of buffer? */ \
- sllx r6, 9, r6; \
- or r6, r4, r4; \
- movnz %icc, %g0, r3; /* Wrap buffer if needed */ \
- rdpr %tstate, r6; \
- rdpr %tpc, r7; \
- sth r4, [r2+r3]; \
- inc 2, r3; \
- sth %g5, [r2+r3]; \
- inc 2, r3; \
- stw r6, [r2+r3]; \
- inc 4, r3; \
- stw %sp, [r2+r3]; \
- inc 4, r3; \
- stw r7, [r2+r3]; \
- inc 4, r3; \
- mov TLB_TAG_ACCESS, r7; \
- ldxa [r7] ASI_DMMU, r7; \
- stw r7, [r2+r3]; \
- inc 4, r3; \
- stw r3, [r2+TRACEPTR]; \
-1:
What the code does is check the contents of TRACEDIS. If it's zero, it
loads TRACEPTR, writes a bunch of stuff to the buffer, and updates
TRACEPTR.
To simplify adding fields to the traptrace structure I wrote the code as a
series of stores and pointer increments. Instead of that, it needs to be
written as a single pointer increment followed by the store operations.
Then get rid of the last instruction that updates TRACEPTR, instead
creating a spinloop at the beginning that looks something like this:
- lduw [r2+TRACEPTR], r3; \
+0:
+ add r2, TRACEPTR, r4;
+ lduw [r4], r3; /* Load the offset of the next slot */
+ add r3, ENTRY_SIZE /* <- Needs to be calculated */, r6; /* Allocate */
+ cas [r4], r6, r7;
+ cmp r6, r7;
+ bne,pn %icc, 0b; /* Oops.. spin */
+ add r2, r3, r3 /* r3 now points to the entry. */
All the register+register stores ([r2+r3]) need to be rewritten as r3+constant.
After that, traceit and traceitwin should be able to use the TRACEIT
macro.
Hm. There may be some reason why I implemented traceit and traceitwin
with inline code rather than the TRACEIT macro, but I don't recall right
now.
Eduardo
Home |
Main Index |
Thread Index |
Old Index