Port-sparc archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: mostly working SMP again
matthew green a écrit :
BERTRAND Joel a écrit :
> matthew green a écrit :
>> yeah - there seems to be some problem(s) remaining, and hypersparc
>> seems to fail much worse.
>>
>> we're still investigating. thanks for testing!
>>
>
> I'm doing some tests with dual SM71 to see if this bug is Hypersparc
> specific.
It's not Hypersparc specific. With two SM71-1, kernel hangs and opens
internal debugger :
CPU1: data fault: pc=0xf000ab3c addr=0x80
this is probably the savefpstate() crash i've been looking into.
can you see what addr 0xf000ab3c is in your kernel?
Here is gdb's output :
(gdb) disassemble 0xf000ab00 0xf000b000
Dump of assembler code from 0xf000ab00 to 0xf000b000:
0xf000ab00 <Lkcopy_done+4>: retl
0xf000ab04 <Lkcopy_done+8>: clr %o0
0xf000ab08 <Lkcopy_done+12>: stb %o4, [ %o1 ]
0xf000ab0c <Lkcopy_done+16>: st %g1, [ %o5 + 0xc ]
0xf000ab10 <Lkcopy_done+20>: retl
0xf000ab14 <Lkcopy_done+24>: clr %o0
0xf000ab18 <Lkcerr+0>: retl
0xf000ab1c <Lkcerr+4>: st %g1, [ %o5 + 0xc ]
0xf000ab20 <savefpstate+0>: rd %psr, %o1
0xf000ab24 <savefpstate+4>: sethi %hi(0x1000), %o2
0xf000ab28 <savefpstate+8>: or %o1, %o2, %o1
0xf000ab2c <savefpstate+12>: mov %o1, %psr
0xf000ab30 <savefpstate+16>: sethi %hi(0x2000), %o5
0xf000ab34 <savefpstate+20>: mov %g0, %o3
0xf000ab38 <savefpstate+24>: nop
0xf000ab3c <special_fp_store+0>: st %fsr, [ %o0 + 0x80 ]
0xf000ab40 <special_fp_store+4>: ld [ %o0 + 0x80 ], %o4
0xf000ab44 <special_fp_store+8>: btst %o5, %o4
0xf000ab48 <special_fp_store+12>: bne 0xf000ab94 <Lfp_storeq>
0xf000ab4c <special_fp_store+16>: std %f0, [ %o0 ]
0xf000ab50 <Lfp_finish+0>: st %o3, [ %o0 + 0x84 ]
0xf000ab54 <Lfp_finish+4>: std %f2, [ %o0 + 8 ]
0xf000ab58 <Lfp_finish+8>: std %f4, [ %o0 + 0x10 ]
0xf000ab5c <Lfp_finish+12>: std %f6, [ %o0 + 0x18 ]
0xf000ab60 <Lfp_finish+16>: std %f8, [ %o0 + 0x20 ]
0xf000ab64 <Lfp_finish+20>: std %f10, [ %o0 + 0x28 ]
0xf000ab68 <Lfp_finish+24>: std %f12, [ %o0 + 0x30 ]
0xf000ab6c <Lfp_finish+28>: std %f14, [ %o0 + 0x38 ]
0xf000ab70 <Lfp_finish+32>: std %f16, [ %o0 + 0x40 ]
0xf000ab74 <Lfp_finish+36>: std %f18, [ %o0 + 0x48 ]
0xf000ab78 <Lfp_finish+40>: std %f20, [ %o0 + 0x50 ]
0xf000ab7c <Lfp_finish+44>: std %f22, [ %o0 + 0x58 ]
0xf000ab80 <Lfp_finish+48>: std %f24, [ %o0 + 0x60 ]
0xf000ab84 <Lfp_finish+52>: std %f26, [ %o0 + 0x68 ]
0xf000ab88 <Lfp_finish+56>: std %f28, [ %o0 + 0x70 ]
0xf000ab8c <Lfp_finish+60>: retl
This code comes from sparc/locore.s, line 5874 :
special_fp_store:
st %fsr, [%o0 + FS_FSR] ! f->fs_fsr = getfsr();
/*
* Even if the preceding instruction did not trap, the queue
* is not necessarily empty: this state save might be happening
* because user code tried to store %fsr and took the FPU
* from `exception pending' mode to `exception' mode.
* So we still have to check the blasted QNE bit.
* With any luck it will usually not be set.
*/
ld [%o0 + FS_FSR], %o4 ! if (f->fs_fsr & QNE)
btst %o5, %o4
bnz Lfp_storeq ! goto storeq;
std %f0, [%o0 + FS_REGS + (4*0)] ! f->fs_f0 = etc;
I can read 'Even if the preceding instruction did not trap', thus I
suppose that trap is not caught in MP kernel.
Regards,
JKB
Home |
Main Index |
Thread Index |
Old Index