diff options
author | Shakeeb <shakeebbk@in.ibm.com> | 2016-08-17 01:58:47 -0500 |
---|---|---|
committer | AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com> | 2016-09-02 07:58:32 -0400 |
commit | ba7f9cc584351b770de629d4493712840a18ba9d (patch) | |
tree | 34c4b0a12efb423837cb0135ac777c8831784dbc /src | |
parent | 185dabde31e9d83443da2222babbd0f547fb227e (diff) | |
download | talos-sbe-ba7f9cc584351b770de629d4493712840a18ba9d.tar.gz talos-sbe-ba7f9cc584351b770de629d4493712840a18ba9d.zip |
SBE HWP FFDC support
Change-Id: I2a578bbd0661c64f4ef1d3703b162327c9c9a036
RTC:129076
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28448
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Reviewed-by: AMIT J. TENDOLKAR <amit.tendolkar@in.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/sbefw/sbeFifoMsgUtils.C | 26 | ||||
-rw-r--r-- | src/sbefw/sbeFifoMsgUtils.H | 6 | ||||
-rw-r--r-- | src/test/testcases/testCntlInstruction.py | 60 | ||||
-rw-r--r-- | src/test/testcases/testUtil.py | 26 |
4 files changed, 99 insertions, 19 deletions
diff --git a/src/sbefw/sbeFifoMsgUtils.C b/src/sbefw/sbeFifoMsgUtils.C index 99cf2709..07463336 100644 --- a/src/sbefw/sbeFifoMsgUtils.C +++ b/src/sbefw/sbeFifoMsgUtils.C @@ -35,6 +35,7 @@ #include "sbeerrorcodes.H" #include "assert.h" #include "sbeFFDC.H" +#include "hwp_error_info.H" // If we can not perform FIFO operation ( FIFO FULL while writing // or EMPTY while reading ) we will sleep for FIFO_WAIT_SLEEP_TIME @@ -45,6 +46,7 @@ static const uint32_t FIFO_WAIT_SLEEP_TIME = 1; // in higher word to trigger EOT. static const uint64_t DOWNSTREAM_EOT_DATA = 0x100000000ull; +using namespace fapi2; ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// uint32_t sbeUpFifoDeq_mult (uint32_t &io_len, @@ -318,7 +320,7 @@ uint32_t sbeDownFifoSignalEot (void) uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, - const sbeResponseFfdc_t &i_ffdc ) + sbeResponseFfdc_t &io_ffdc ) { uint32_t rc = SBE_SEC_OPERATION_SUCCESSFUL; do @@ -334,15 +336,30 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, distance += len; // If no ffdc , exit; - if( i_ffdc.getRc() ) + if( io_ffdc.getRc() ) { - len = sizeof(i_ffdc)/sizeof(uint32_t); - rc = sbeDownFifoEnq_mult ( len, ( uint32_t *) &i_ffdc); + // making sure ffdc length is multiples of uint32_t + assert((g_FfdcData.ffdcLength % sizeof(uint32_t)) == 0); + uint32_t ffdcDataLenInWords = g_FfdcData.ffdcLength + / sizeof(uint32_t); + // Add HWP specific ffdc data length + io_ffdc.lenInWords += ffdcDataLenInWords; + len = sizeof(io_ffdc)/sizeof(uint32_t); + rc = sbeDownFifoEnq_mult ( len, ( uint32_t *) &io_ffdc); if (rc) { break; } distance += len; + + // Send HWP ffdc data + rc = sbeDownFifoEnq_mult ( ffdcDataLenInWords, + ( uint32_t *) &g_FfdcData.ffdcData); + if (rc) + { + break; + } + distance += ffdcDataLenInWords; } // If there is a SBE internal failure @@ -369,6 +386,7 @@ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, { break; } + SBE_INFO("sizeof(sbeFfdc_t) [%x]", sizeof(sbeFfdc_t)); }while(0); return rc; diff --git a/src/sbefw/sbeFifoMsgUtils.H b/src/sbefw/sbeFifoMsgUtils.H index 60492964..c3a5c856 100644 --- a/src/sbefw/sbeFifoMsgUtils.H +++ b/src/sbefw/sbeFifoMsgUtils.H @@ -182,11 +182,11 @@ uint32_t sbeDownFifoSignalEot (void); * @brief sbeDsSendRespHdr : Send response header to DS FIFO * - This also sends the FFDC if exist. * - * @param[in] i_hdr Response Header - * @param[in] i_ffdc FFDC object + * @param[in] i_hdr Response Header + * @param[in] io_ffdc FFDC object * * @return Rc from the underlying scom utility */ uint32_t sbeDsSendRespHdr(const sbeRespGenHdr_t &i_hdr, - const sbeResponseFfdc_t &i_ffdc ); + sbeResponseFfdc_t &io_ffdc ); #endif // __SBEFW_SBEFIFOMSGUTILS_H diff --git a/src/test/testcases/testCntlInstruction.py b/src/test/testcases/testCntlInstruction.py index f3143e70..b30ff49c 100644 --- a/src/test/testcases/testCntlInstruction.py +++ b/src/test/testcases/testCntlInstruction.py @@ -254,22 +254,13 @@ INST_EXPDATA_ERR = [0xc0,0xde,0xa7,0x01, 0x00,0x00,0x00,0x03] STOP_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01, - 0x00,0xFE,0x00,0x0A, - 0xFF,0xDC,0x00,0x02, - 0x00,0xCE,0xBC,0xB2, - 0x00,0x00,0x00,0x05] + 0x00,0xFE,0x00,0x0A] START_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01, - 0x00,0xFE,0x00,0x0A, - 0xFF,0xDC,0x00,0x02, - 0x00,0x25,0x64,0xDB, - 0x00,0x00,0x00,0x05] + 0x00,0xFE,0x00,0x0A] STEP_INST_EXPDATA_ERR_WTH_FFDC = [0xc0,0xde,0xa7,0x01, - 0x00,0xFE,0x00,0x0A, - 0xFF,0xDC,0x00,0x02, - 0x00,0x0D,0x06,0x8E, - 0x00,0x00,0x00,0x05] + 0x00,0xFE,0x00,0x0A] # MAIN Test Run Starts Here... #------------------------------------------------- @@ -301,18 +292,30 @@ def main( ): testUtil.writeUsFifo( INST_STOP_0_0_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STOP_0_1_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STOP_0_2_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STOP_0_3_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) #stop all thread in core0 @@ -323,6 +326,9 @@ def main( ): testUtil.writeUsFifo( INST_STOP0_ALL_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STOP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) # Control Instruction Message - Start @@ -346,18 +352,30 @@ def main( ): testUtil.writeUsFifo( INST_START_0_0_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_START_0_1_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_START_0_2_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_START_0_3_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) #start all thread in core0 @@ -368,6 +386,9 @@ def main( ): testUtil.writeUsFifo( INST_START0_ALL_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( START_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) # Control Instruction Message - Step @@ -390,18 +411,30 @@ def main( ): testUtil.writeUsFifo( INST_STEP_0_0_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STEP_0_1_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STEP_0_2_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) testUtil.writeUsFifo( INST_STEP_0_3_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) #step all thread in core0 @@ -412,6 +445,9 @@ def main( ): testUtil.writeUsFifo( INST_STEP0_ALL_TESTDATA_WITHOUT_WARN_FLG ) testUtil.writeEot( ) testUtil.readDsFifo( STEP_INST_EXPDATA_ERR_WTH_FFDC ) + testUtil.extractHWPFFDC( ) + #flush out distance + testUtil.readDsEntryReturnVal() testUtil.readEot( ) # Control Instruction Message - Sreset diff --git a/src/test/testcases/testUtil.py b/src/test/testcases/testUtil.py index 2312d2b7..b92fda60 100644 --- a/src/test/testcases/testUtil.py +++ b/src/test/testcases/testUtil.py @@ -147,6 +147,32 @@ def readEntry(obj, address, size): return value +def extractHWPFFDC(dumpToFile = False): + '''Header extraction''' + data = readDsEntryReturnVal() + magicBytes = ((data[0] << 8) | data[1]) + if (magicBytes == 0xFFDC) : + print ("\nMagic Bytes Match") + else : + raise Exception('data mistmach') + packLen = ((data[2] << 8) | data[3]) + print ("\nFFDC package length = " + str(packLen)) + + data = readDsEntryReturnVal() + fapiRc = ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]) + print ("\nFAPI rc = " + str(hex(fapiRc))) + + if(dumpToFile): + myBin = open('trace.bin', 'wb') + print ("\nwriting "+'trace.bin') + for i in range(0, packLen-2): + data = readDsEntryReturnVal() + if(dumpToFile): + myBin.write(bytearray(data)) + if(dumpToFile): + print("write to a file Done") + myBin.close() + def read(obj, address, size): """ Read from memory space """ iface = SIM_get_interface(obj, "memory_space") |