summaryrefslogtreecommitdiffstats
path: root/src/build/debug/Hostboot
diff options
context:
space:
mode:
authorVan Lee <vanlee@us.ibm.com>2012-04-19 14:15:59 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-05-04 15:23:53 -0500
commitec60904ef97e4cdd4f547549c6380e8a5aaa09ba (patch)
tree9819c0065dfa5d5969204f79b3479efce28094fd /src/build/debug/Hostboot
parent9a94e04ad4f91d72b43d42fc0a85e271085775e1 (diff)
downloadtalos-hostboot-ec60904ef97e4cdd4f547549c6380e8a5aaa09ba.tar.gz
talos-hostboot-ec60904ef97e4cdd4f547549c6380e8a5aaa09ba.zip
Fix continuous trace function losing traces in high traffic condition.
Change-Id: I9444e222e89e44017bf3039a09ecb28e9409a389 RTC: 39164 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/917 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/build/debug/Hostboot')
-rwxr-xr-xsrc/build/debug/Hostboot/ContTrace.pm167
1 files changed, 152 insertions, 15 deletions
diff --git a/src/build/debug/Hostboot/ContTrace.pm b/src/build/debug/Hostboot/ContTrace.pm
index a9ba5eadb..1559199be 100755
--- a/src/build/debug/Hostboot/ContTrace.pm
+++ b/src/build/debug/Hostboot/ContTrace.pm
@@ -28,8 +28,12 @@ package Hostboot::ContTrace;
use Exporter;
our @EXPORT_OK = ('main');
+use constant MAX_NUM_CONT_TRACE_CTL_STRUCT => 2;
+use constant CONT_TRACE_CTL_STRUCT_SIZE => 16;
+use constant CONT_TRACE_ENABLE_FLAG_OFFSET => MAX_NUM_CONT_TRACE_CTL_STRUCT * CONT_TRACE_CTL_STRUCT_SIZE;
use constant MAX_NUM_CONT_TRACE_BUFFERS => 2;
use constant DDWORD_SIZE => 8;
+use constant WORD_SIZE => 4;
use constant TRIG_BIT => 0x8000000000000000;
use File::Temp ('tempfile');
@@ -46,6 +50,12 @@ sub main
$args->{"fsp-trace"} = "fsp-trace";
}
+ my $dbgMsg = 0;
+ if (defined $args->{"debug"})
+ {
+ $dbgMsg = 1;
+ }
+
my $fsptrace_options = "";
if (defined $args->{"with-file-names"})
{
@@ -58,59 +68,184 @@ sub main
$last = 1;
}
- my ($symAddr, $symSize) =
+ my $on2off = 0;
+ my $symAddr = 0;
+ my $symSize = 0;
+
+ if (defined $args->{"enable-cont-trace"})
+ {
+ my $new_enable = $args->{"enable-cont-trace"};
+ $new_enable = $new_enable ? 2 : 0;
+ ($symAddr, $symSize) =
+ ::findSymbolAddress("TRACE::g_cont_trace_trigger_info");
+ if (not defined $symAddr)
+ {
+ ::userDisplay "Cannot find symbol.\n"; die;
+ }
+ my $enable = ::read64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET);
+ if ($dbgMsg)
+ {
+ ::userDisplay("current Cont Trace Enable Flag = $enable\n");
+ }
+ if (($enable < 2) && ($new_enable == 2))
+ {
+ # truncate tracMERG to 0
+ system( "cp /dev/null tracMERG" );
+ ::write64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET, $new_enable);
+ if ($dbgMsg)
+ {
+ $new_enable = ::read64($symAddr+CONT_TRACE_ENABLE_FLAG_OFFSET);
+ ::userDisplay("new Cont Trace Enable Flag = $new_enable\n");
+ }
+ return;
+ }
+ elsif (($enable == 2) && ($new_enable == 0))
+ {
+ $on2off = 1;
+ $last = 0;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ my $trigger = "simGETFAC B0.C0.S0.P0.E8.TPC.FSI.FSI_MAILBOX.FSXCOMP." .
+ "FSXLOG.LBUS_MAILBOX.Q_GMB2E0.NLC.L2 32";
+ $trigger = `$trigger`;
+ $trigger =~ s/.*\n0xr(.*)\n.*/$1/g;
+ $trigger =~ s/\n//g;
+ if ($dbgMsg)
+ {
+ ::userDisplay("$trigger...\n");
+ my $cycles = `simgetcurrentcycle`;
+ $cycles =~ s/\n//g;
+ $cycles =~ s/.*is ([0-9]*).*/$1/g;
+ ::userDisplay("$cycles\n");
+ $cycles = `date`;
+ ::userDisplay("$cycles");
+ }
+ if (($trigger !~ /[1-9a-fA-F]+/) && ($last == 0))
+ {
+ if ($on2off)
+ {
+ ::write64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET, 0);
+ if ($dbgMsg)
+ {
+ $on2off = ::read64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET);
+ ::userDisplay("new Cont Trace Enable Flag = $on2off\n");
+ }
+ }
+ if ($dbgMsg)
+ {
+ my $cycles = `date`;
+ ::userDisplay("$cycles");
+ }
+ return;
+ }
+
+ ($symAddr, $symSize) =
::findSymbolAddress("TRACE::g_cont_trace_trigger_info");
if (not defined $symAddr) { ::userDisplay "Cannot find symbol.\n"; die; }
- my ($fh,$fname) = tempfile();
- binmode($fh);
+ my @fh;
+ my @fname;
+ ($fh[0],$fname[0]) = tempfile();
+ binmode($fh[0]);
+ ($fh[1],$fname[1]) = tempfile();
+ binmode($fh[1]);
# read the g_cont_trace_trigger_info structure
my $result = ::readData($symAddr, $symSize);
my $addrOff = 0;
my $lenOff = $addrOff + DDWORD_SIZE;
+ my $seqOff = $lenOff + WORD_SIZE;
my $foundBuffer = 0;
+ my @seqNum;
for (my $i = 0; $i < MAX_NUM_CONT_TRACE_BUFFERS; $i++)
{
# get the pointer to the continuous trace buffer
my $buffAddr = substr $result, $addrOff, DDWORD_SIZE;
$buffAddr= hex (unpack('H*',$buffAddr));
- my $buffLen = substr $result, $lenOff, DDWORD_SIZE;
+ my $buffLen = substr $result, $lenOff, WORD_SIZE;
$buffLen= hex (unpack('H*',$buffLen));
- #::userDisplay("Trigger [".$i."] = $buffAddr\n");
- #::userDisplay("Length [".$i."] = $buffLen\n");
+ $seqNum[$i] = substr $result, $seqOff, WORD_SIZE;
+ $seqNum[$i]= hex (unpack('H*',$seqNum[$i]));
+ if ($dbgMsg)
+ {
+ ::userDisplay("Trigger [".$i."] = $buffAddr\n");
+ ::userDisplay("Length [".$i."] = $buffLen\n");
+ ::userDisplay("SeqNum [".$i."] = $seqNum[$i]\n");
+ }
+ my $fhandle = $fh[$i];
# If trigger bit is set, or last call and buffer has trace data
if ((0 != ($buffAddr & TRIG_BIT)) || (($last == 1) && ($buffLen > 1)))
{
- $foundBuffer = 1;
+ $foundBuffer |= (1 << $i);
$buffAddr &= ~TRIG_BIT;
- print $fh (::readData($buffAddr, $buffLen));
+ print $fhandle (::readData($buffAddr, $buffLen));
# reset trigger bit
::write64($symAddr + $addrOff, $buffAddr);
# reset count to 1
- ::write64($symAddr + $lenOff, 1);
+ ::write32($symAddr + $lenOff, 1);
}
# increment to next element in g_cont_trace_trigger_info.triggers[]
$addrOff += (2 * DDWORD_SIZE);
$lenOff = $addrOff + DDWORD_SIZE;
+ $seqOff = $lenOff + WORD_SIZE;
}
- if ($foundBuffer)
+ if ($dbgMsg)
{
- open TRACE, ($args->{"fsp-trace"}." -s ".
- ::getImgPath()."hbotStringFile $fsptrace_options $fname |");
- while (my $line = <TRACE>)
+ my $cycles = `simgetcurrentcycle`;
+ $cycles =~ s/\n//g;
+ $cycles =~ s/.*is ([0-9]*).*/$1/g;
+ ::userDisplay("$cycles\n");
+ }
+
+ if ($on2off)
+ {
+ ::write64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET, 0);
+ if ($dbgMsg)
{
- ::userDisplay $line;
+ $on2off = ::read64($symAddr + CONT_TRACE_ENABLE_FLAG_OFFSET);
+ ::userDisplay("new Cont Trace Enable Flag = $on2off\n");
}
}
+ if (($foundBuffer == 3) && ($seqNum[1] < $seqNum[0]))
+ {
+ my $tmp = $fname[0];
+ $fname[0] =$fname[1];
+ $fname[1] = $tmp;
+ }
+
+ for (my $i = 0; $i < MAX_NUM_CONT_TRACE_BUFFERS; $i++)
+ {
+ if (($foundBuffer & (1 << $i)))
+ {
+ #my $cmd = "cp " . $fname[$i] . " tracMERG." . $seqNum[$i];
+ #system ( $cmd );
+ open TRACE, ($args->{"fsp-trace"}." -s ".
+ ::getImgPath()."hbotStringFile $fsptrace_options $fname[$i] |");
+ while (my $line = <TRACE>)
+ {
+ ::userDisplay $line;
+ }
+ }
+ }
+
+ if ($dbgMsg)
+ {
+ my $cycles = `date`;
+ ::userDisplay("$cycles");
+ }
}
sub helpInfo
@@ -123,6 +258,8 @@ sub helpInfo
"with-file-names" => ["Trace statements will include file name of place the",
"trace was defined."],
"last" => ["Shutdown call to offload remaining traces."],
- },
+ "enable-cont-trace=<1|0>" => ["Turn on|off continuous trace"],
+ "debug" => ["Turn on debug messages"],
+ }
);
}
OpenPOWER on IntegriCloud