From e7bc187c7d48108c96391122975e2be3c20d7d3f Mon Sep 17 00:00:00 2001 From: Raja Das Date: Mon, 5 Jun 2017 08:09:25 -0500 Subject: [PATCH] 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 Reviewed-by: Sachin Gupta --- src/sbefw/sbeglobals.C | 9 ++++ src/sbefw/sbeglobals.H | 14 +++---- src/sbefw/sbemain.C | 8 ++-- src/tools/debug/sbe-debug.py | 51 +++++++++++++++++++++-- src/tools/debug/simics-debug-framework.py | 8 ++-- 5 files changed, 71 insertions(+), 19 deletions(-) diff --git a/src/sbefw/sbeglobals.C b/src/sbefw/sbeglobals.C index 742576354..1a4f43d7a 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 8a958acae..37bfa2a91 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: @@ -74,14 +80,6 @@ class SBEGlobalsSingleton // ffdc address 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 ////////////////////////////////////////////////////////////////// diff --git a/src/sbefw/sbemain.C b/src/sbefw/sbemain.C index 663705b87..63707b906 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 d59311a79..709439d57 100755 --- a/src/tools/debug/sbe-debug.py +++ b/src/tools/debug/sbe-debug.py @@ -30,6 +30,7 @@ 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 @@ def usage(): \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 dee9984c3..35485dd00 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: