> [ NOTE: a print-EIP patch for 2.0.35 would be helpful here, if someone has
> such as beast, then could they forward me a copy - DL ]
Sorry by my ignorance, do you refer to the print-EIP patch to a program to
print kernel oops from the syslogd's messages? If so, my Linux doesn't
generate any oopds (Anyway I resend a perl program from Thomas Koenig,
find it at the end of the message...).
> [ This is normally a problem with reading the SEEPROM on the aic7xxx
> controller, so if the motherboard controller uses NVRAM to store settings
> instead of a SEEPROM, then we won't be able to read it ]
I just got a new BIOS and config utililities from Intel, the server is now
in production, but when I guess I can change to a better kernel/driver
version, I will try to reconfig everything and I will send another report.
> [ On the Intel DK440LX, which is very similar in make, there are BIOS
> options to disable the controllers under advanced peripheral setup ]
No way in my current BIOS/utilities.
Thanks to everyone that sent comments.
-- A PERL PROGRAM ----
#!/usr/bin/perl
$reading = 0;
$map = "/usr/src/linux/System.map";
while (<>) {
if (($start = index($_,"Oops: ")) >=0 ) {
$block = "";
$reading = 1;
$rstart = $start;
}
if ($reading) {
$block .= substr($_, $rstart);
if (/Code: /) {
$reading = 0;
}
}
}
die "No kernel Oops found, aborting\n" unless $block;
print $block,"\n";
$block =~ s/\n\s+/ /g;
foreach(split("\n",$block)) {
if (/EIP:/) {
($dummy, $dummy, $hstr) = split(':',$_);
$fcn_name = &lookup_fcn($hstr);
print "EIP = $hstr ($fcn_name)\n";
}
elsif(/Call Trace/) {
($dummy, @addr) = split(' ',$_);
foreach $calltrace(@addr) {
$fcn_name = &lookup_fcn($calltrace);
print "Call trace = $calltrace ($fcn_name)\n";
}
}
}
sub lookup_fcn
{
local($straddr) = @_;
local($_,$name,$addr,$dummy,$saddr,$upper,$lower);
$saddr = hex($straddr);
if ($#names < 0) {
open(MAP,$map) || die "Cannot open $map:\n";
while(<MAP>) {
($addr, $dummy, $name) = split(' ');
push(@addrs,hex ($addr));
push(@names,$name);
}
}
$lower = 0;
$upper = $#addrs;
if (($saddr < $addrs[$lower]) || ($saddr > $addrs[$upper])) {
return "unknown";
}
while (1) {
if ($upper - $lower <=1) {
$diff = $saddr - $addrs[$lower];
return sprintf ("%s + 0x%4.4x",$names[$lower],$diff);
}
$middle = ($upper + $lower)/2;
if ($addrs[$middle] > $saddr) {
$upper = $middle;
}
else {
$lower = $middle;
}
}
}
-- Ricardo Galli Member of ACM - Association for Computing Machinery University of Balearic Islands ATLAS Internet Access Provider mailto:gallir@atlas-iap.es mailto:rgalli@acm.org http://www.atlas-iap.es
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.altern.org/andrebalsa/doc/lkml-faq.html