summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRaja Das <rajadas2@in.ibm.com>2017-06-05 08:09:25 -0500
committerSachin Gupta <sgupta2m@in.ibm.com>2017-06-06 05:43:32 -0400
commite7bc187c7d48108c96391122975e2be3c20d7d3f (patch)
treeee234aa5daa402041ca0bc180f5592f9eaf7e6b6 /src
parent38e02e49a11ff8a82b4e2b13687409d0ffd98f80 (diff)
downloadtalos-sbe-e7bc187c7d48108c96391122975e2be3c20d7d3f.tar.gz
talos-sbe-e7bc187c7d48108c96391122975e2be3c20d7d3f.zip
Supported Stack Usage feature on HW via cronus
Change-Id: I7b5eaa1ee484e4fbd31f12146d3d47dd24344255 RTC: 175229 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41360 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/sbefw/sbeglobals.C9
-rw-r--r--src/sbefw/sbeglobals.H14
-rw-r--r--src/sbefw/sbemain.C8
-rwxr-xr-xsrc/tools/debug/sbe-debug.py51
-rwxr-xr-xsrc/tools/debug/simics-debug-framework.py8
5 files changed, 71 insertions, 19 deletions
diff --git a/src/sbefw/sbeglobals.C b/src/sbefw/sbeglobals.C
index 74257635..1a4f43d7 100644
--- a/src/sbefw/sbeglobals.C
+++ b/src/sbefw/sbeglobals.C
@@ -25,6 +25,15 @@
#include "sbetrace.H"
#include "sbeglobals.H"
+////////////////////////////////////////////////////////////////
+//// @brief Stacks for Non-critical Interrupts and Threads
+//////////////////////////////////////////////////////////////////
+// Moved it out-side the scope of Global Class for symbol generation in syms
+uint8_t sbe_Kernel_NCInt_stack[SBE_NONCRITICAL_STACK_SIZE];
+uint8_t sbeCommandReceiver_stack[SBE_THREAD_CMD_RECV_STACK_SIZE];
+uint8_t sbeSyncCommandProcessor_stack[SBE_THREAD_SYNC_CMD_PROC_STACK_SIZE];
+uint8_t sbeAsyncCommandProcessor_stack[SBE_THREAD_ASYNC_CMD_PROC_STACK_SIZE];
+
SBEGlobalsSingleton* sbeGlobal = &SBEGlobalsSingleton::getInstance();
SBEGlobalsSingleton& SBEGlobalsSingleton::getInstance()
{
diff --git a/src/sbefw/sbeglobals.H b/src/sbefw/sbeglobals.H
index 8a958aca..37bfa2a9 100644
--- a/src/sbefw/sbeglobals.H
+++ b/src/sbefw/sbeglobals.H
@@ -33,6 +33,12 @@
#define SBE_GLOBAL sbeGlobal
+// Extern declartion, Defined in sbeglobal.C
+extern uint8_t sbe_Kernel_NCInt_stack[SBE_NONCRITICAL_STACK_SIZE];
+extern uint8_t sbeCommandReceiver_stack[SBE_THREAD_CMD_RECV_STACK_SIZE];
+extern uint8_t sbeSyncCommandProcessor_stack[SBE_THREAD_SYNC_CMD_PROC_STACK_SIZE];
+extern uint8_t sbeAsyncCommandProcessor_stack[SBE_THREAD_ASYNC_CMD_PROC_STACK_SIZE];
+
class SBEGlobalsSingleton
{
public:
@@ -75,14 +81,6 @@ class SBEGlobalsSingleton
sbeHostAddr_t hostFFDCAddr;
////////////////////////////////////////////////////////////////
- //// @brief Stacks for Non-critical Interrupts and Threads
- //////////////////////////////////////////////////////////////////
- uint8_t sbe_Kernel_NCInt_stack[SBE_NONCRITICAL_STACK_SIZE];
- uint8_t sbeCommandReceiver_stack[SBE_THREAD_CMD_RECV_STACK_SIZE];
- uint8_t sbeSyncCommandProcessor_stack[SBE_THREAD_SYNC_CMD_PROC_STACK_SIZE];
- uint8_t sbeAsyncCommandProcessor_stack[SBE_THREAD_ASYNC_CMD_PROC_STACK_SIZE];
-
- ////////////////////////////////////////////////////////////////
//// @brief PkThread structure for SBE Command Receiver thread
//////////////////////////////////////////////////////////////////
PkThread sbeCommandReceiver_thread;
diff --git a/src/sbefw/sbemain.C b/src/sbefw/sbemain.C
index 663705b8..63707b90 100644
--- a/src/sbefw/sbemain.C
+++ b/src/sbefw/sbemain.C
@@ -194,7 +194,7 @@ int sbeInitThreads(void)
l_rc = createAndResumeThreadHelper(&SBE_GLOBAL->sbeCommandReceiver_thread,
sbeCommandReceiver_routine,
(void *)0,
- (PkAddress)SBE_GLOBAL->sbeCommandReceiver_stack,
+ (PkAddress)sbeCommandReceiver_stack,
SBE_THREAD_CMD_RECV_STACK_SIZE,
THREAD_PRIORITY_5);
if (l_rc)
@@ -206,7 +206,7 @@ int sbeInitThreads(void)
l_rc = createAndResumeThreadHelper(&SBE_GLOBAL->sbeSyncCommandProcessor_thread,
sbeSyncCommandProcessor_routine,
(void *)0,
- (PkAddress)SBE_GLOBAL->sbeSyncCommandProcessor_stack,
+ (PkAddress)sbeSyncCommandProcessor_stack,
SBE_THREAD_SYNC_CMD_PROC_STACK_SIZE,
THREAD_PRIORITY_7);
if (l_rc)
@@ -218,7 +218,7 @@ int sbeInitThreads(void)
l_rc = createAndResumeThreadHelper(&SBE_GLOBAL->sbeAsyncCommandProcessor_thread,
sbeAsyncCommandProcessor_routine,
(void *)0,
- (PkAddress)SBE_GLOBAL->sbeAsyncCommandProcessor_stack,
+ (PkAddress)sbeAsyncCommandProcessor_stack,
SBE_THREAD_ASYNC_CMD_PROC_STACK_SIZE,
THREAD_PRIORITY_6);
if (l_rc)
@@ -253,7 +253,7 @@ uint32_t main(int argc, char **argv)
{
// initializes kernel data -
// stack, threads, timebase, timers, etc.
- l_rc = pk_initialize((PkAddress)SBE_GLOBAL->sbe_Kernel_NCInt_stack,
+ l_rc = pk_initialize((PkAddress)sbe_Kernel_NCInt_stack,
SBE_NONCRITICAL_STACK_SIZE,
0,
SBE_GLOBAL->sbefreq );
diff --git a/src/tools/debug/sbe-debug.py b/src/tools/debug/sbe-debug.py
index d59311a7..709439d5 100755
--- a/src/tools/debug/sbe-debug.py
+++ b/src/tools/debug/sbe-debug.py
@@ -30,6 +30,7 @@ import random
import getopt
import sys
import binascii
+import struct
err = False
baseAddr = 0xfffe8000
@@ -224,6 +225,47 @@ def collectAttr( sbeObjDir, target, node, proc, ddsuffix, file_path ):
print "ERROR running %s: %d " % ( cmd3, rc )
return 1
+def collectStackUsage (node, proc ):
+ threads = ('sbeSyncCommandProcessor_stack',
+ 'sbeCommandReceiver_stack',
+ 'sbe_Kernel_NCInt_stack',
+ 'sbeAsyncCommandProcessor_stack')
+ for thread in threads:
+ offset = getOffset( thread );
+ len = "0x" + syms[thread][1];
+ cmd1 = ("p9_pibmem_dump_wrap.exe -quiet -start_byte " + \
+ str(offset) +\
+ " -num_of_byte " + len + " "
+ " -n" + str(node) + " -p" + str(proc))
+ print "cmd1:", cmd1
+ rc = os.system( cmd1 )
+ if ( rc ):
+ print "ERROR running %s: %d " % ( cmd1, rc )
+ return 1
+
+ # Dump stack memory to binary file
+ cmd2 = "cat DumpPIBMEM >>"+thread
+ print "cmd2:", cmd2
+ rc = os.system( cmd2 )
+ if (rc):
+ print "ERROR running %s: %d " % ( cmd2, rc )
+ return 1
+
+ print "==================================Stack usage==================================="
+ print "Thread".ljust(40)+"Least Available[bytes]".ljust(30)+"Max usage[%]"
+ for thread in threads:
+ with open(thread, "rb") as f:
+ word = struct.unpack('I', f.read(4))[0]
+ leastAvailable = 0
+ while (1):
+ if (word == int("0xEFCDAB03", 16)):
+ leastAvailable += 4
+ word = struct.unpack('I', f.read(4))[0]
+ else:
+ break
+ print str("["+thread+"]").ljust(40) + str(leastAvailable).ljust(30) + str("%.2f" % (100 * (1 - (leastAvailable/float(int("0x"+syms[thread][1], 16))))))
+
+
def ppeState( target, node, proc, file_path ):
if(target == 'FILE'):
print "File path: ", file_path
@@ -357,7 +399,7 @@ SBE Dump Parser\n\
\n\
optional arguments:\n\
-h, --help show this help message and exitn\n\
- -l {trace,attr,ppestate,sbestate,sbestatus,sbelocalregister}, --level {trace,attr,ppestate,sbestate,sbestatus,sbelocalregister}\n\
+ -l {trace,attr,stack,ppestate,sbestate,sbestatus,sbelocalregister}, --level {trace,attr,stack,ppestate,sbestate,sbestatus,sbelocalregister}\n\
Parser level\n\
-t {AWAN,HW,FILE}, --target {AWAN,HW,FILE}\n\
Target type\n\
@@ -388,10 +430,10 @@ def main( argv ):
usage()
exit(1)
elif opt in ('-l', '--level'):
- if arg in ('trace', 'forced-trace','attr','ppestate','sbestate','sbestatus','sbelocalregister'):
+ if arg in ('trace', 'forced-trace','attr','stack','ppestate','sbestate','sbestatus','sbelocalregister'):
level = arg
else:
- print "level should be one of {trace,attr,ppestate,sbestate,sbestatus,sbelocalregister}"
+ print "level should be one of {trace,attr,stack,ppestate,sbestate,sbestatus,sbelocalregister}"
exit(1)
elif opt in ('-t', '--target'):
if arg in ('AWAN', 'HW', 'FILE'):
@@ -471,6 +513,9 @@ def main( argv ):
sbeStatus( target, node, proc )
elif ( level == 'sbelocalregister' ):
sbeLocalRegister( target, node, proc, file_path )
+ elif ( level == 'stack' ):
+ fillSymTable(getSbeObjPath(), target, ddsuffix)
+ collectStackUsage( node, proc )
if(target != 'FILE'):
# On cronus, set the FIFO mode to previous state
diff --git a/src/tools/debug/simics-debug-framework.py b/src/tools/debug/simics-debug-framework.py
index dee9984c..35485dd0 100755
--- a/src/tools/debug/simics-debug-framework.py
+++ b/src/tools/debug/simics-debug-framework.py
@@ -104,10 +104,10 @@ def fillSymTable():
# the first memory address where the pattern('0xEFCDAB03') is broken,
# will be the deepest stack usage point of tht thread during the run
def collectStackUsage ( procNr ):
- threads = ('g_sbeSyncCommandProcessor_stack',
- 'g_sbeCommandReceiver_stack',
- 'g_sbe_Kernel_NCInt_stack',
- 'g_sbeAsyncCommandProcessor_stack')
+ threads = ('sbeSyncCommandProcessor_stack',
+ 'sbeCommandReceiver_stack',
+ 'sbe_Kernel_NCInt_stack',
+ 'sbeAsyncCommandProcessor_stack')
print "==================================Stack usage==================================="
# Dump stack memory to binary files
for thread in threads:
OpenPOWER on IntegriCloud