Date: Tue, 24 Aug 1999 13:29:43 -0700 From: John Plevyak <jplevyak@inktomi.com> To: freebsd-hackers@freebsd.org Subject: K6/3 on 3.2-STABLE Message-ID: <19990824132943.B11107@proxydev.inktomi.com>
next in thread | raw e-mail | index | archive | help
I am experiencing reproducible crashes with FreeBSD (3.2-STABLE) on
a K6/3-450 running on an ASUS P5S-VM motherboard. The problem is highly
repeatable (happens about 1/4 of the way through compiling the kernel)
and goes away if a K6/2-450 is substituted for the K6/3-450 with
all other things held equal.
The problem shows up in sys/kern/vfs_bio.c on line 757 in brelse:
if ((bp->b_flags & B_INVAL) ||
(bp->b_flags & (B_LOCKED|B_DELWRI)) == 0) {
if (bp->b_flags & B_DELWRI) {
--numdirtybuffers;
bp->b_flags &= ~B_DELWRI;
}
vfs_bio_need_satisfy();
}
The corresponding assembly code is:
.stabn 68,0,757,.LM335-brelse
.LM335:
testb $32,37(%esi)
jne .L560
testl $16512,36(%esi)
jne .L559
.L560:
.stabn 68,0,759,.LM336-brelse
.LM336:
cmpb $0,36(%esi)
jge .L561
.stabn 68,0,760,.LM337-brelse
.LM337:
decl numdirtybuffers
The problem is that the K6/3 ends up *between* instructions.
In the image this code corresponds to :
0xc017ed35 <brelse+1077>: movl %ebx,0xc02d681c
0xc017ed3b <brelse+1083>: testb $0x20,0x25(%esi)
0xc017ed3f <brelse+1087>: jne 0xc017ed4a <brelse+1098>
0xc017ed41 <brelse+1089>: testl $0x4080,0x24(%esi)
0xc017ed48 <brelse+1096>: jne 0xc017ed62 <brelse+1122>
0xc017ed4a <brelse+1098>: cmpb $0x0,0x24(%esi)
0xc017ed4e <brelse+1102>: jnl 0xc017ed5d <brelse+1117>
0xc017ed50 <brelse+1104>: decl 0xc030680c
0xc017ed56 <brelse+1110>: andl $0xffffff7f,0x24(%esi)
0xc017ed5d <brelse+1117>: call 0xc017e720 <vfs_bio_need_satisfy>
But the kernel crashes with the $pc == 0xc017ed46
which corresponds to :
(gdb) x/10i 0xc017ed46
0xc017ed46 <brelse+1094>: addb %al,(%eax)
0xc017ed48 <brelse+1096>: jne 0xc017ed62 <brelse+1122>
0xc017ed4a <brelse+1098>: cmpb $0x0,0x24(%esi)
0xc017ed4e <brelse+1102>: jnl 0xc017ed5d <brelse+1117>
0xc017ed50 <brelse+1104>: decl 0xc030680c
and since eax is 0, this results in a protection fault.
This is very repeatable, as I said, it happens about 1/4 of the way
through building the kernel. It is next to impossible to get through
an entire build of the kernel.
Swapping out the K6/3 for a K6/2 solved the problem as does running
the same binaries on Intel hardware.
Has anyone else had any similar experience with the K6/3?
Has anyone had success with the K6/3?
On further note: recompiling the kernel with egcs-1.1.2 causes the
problem to go away (probably different instruction selection/scheduling)
but a problem remains in libc (in the 'free' function) which prevents
reliable operation. 'make world' with egcs-1.1.2 requuires a number of
changes, so I haven't tried that yet, but in any case I don't feel
comfortable with changing out the compiler and hoping that
the bug doesn't just move somewhere else.
Any ideas/pointers appreciated.
john
--
John Bradley Plevyak, PhD, jplevyak@inktomi.com, PGP KeyID: 051130BD
Inktomi Corporation, 1900 S. Norfolk Street, Suite 310, San Mateo, CA 94403
W:(650)653-2830 F:(650)653-2889 P:(888)491-1332/5103192436.4911332@pagenet.net
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990824132943.B11107>
