summaryrefslogtreecommitdiffstats
path: root/src/usr/sbeio
diff options
context:
space:
mode:
authorRoland Veloz <rveloz@us.ibm.com>2018-02-14 13:25:43 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-05-02 16:35:48 -0400
commit056c2090db691cb4db149009cb9c04409b93d116 (patch)
tree14009987ebc14f935e52f8a5a032ba7042042c32 /src/usr/sbeio
parent1c9ff51e0ac0c712a5c724acb2fe41a2d861a5fe (diff)
downloadtalos-hostboot-056c2090db691cb4db149009cb9c04409b93d116.tar.gz
talos-hostboot-056c2090db691cb4db149009cb9c04409b93d116.zip
Fixed the SBE FFDC parsing issue of mssing traces and attributes
Not exactly sure why the code was not printing out the wanted traces and attribute data, but apparently the files that contains the code for the SBEIO FFDC parser, file sbeIoErrlUd.H and file sbeIoFfdcType.H, are a copy of what is in the FSP repo, files sbeUserDataParser.C and sbeFFDCType.H. The HB files were out of sync with FSP files. Once I updated the HB files, literally just copied the contents of the FSP files into the HB files, the traces and attribute data appeared. Turns out it was just a syncing issue. Change-Id: I84e55d0cd0ed81034bbf774af049f5b486278f5f CQ:SW415480 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/54057 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: ILYA SMIRNOV <ismirno@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/58001 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/usr/sbeio')
-rw-r--r--src/usr/sbeio/plugins/sbeIoErrlUd.H147
-rw-r--r--src/usr/sbeio/plugins/sbeIoFfdcType.H52
2 files changed, 114 insertions, 85 deletions
diff --git a/src/usr/sbeio/plugins/sbeIoErrlUd.H b/src/usr/sbeio/plugins/sbeIoErrlUd.H
index 2ff677890..99abc22be 100644
--- a/src/usr/sbeio/plugins/sbeIoErrlUd.H
+++ b/src/usr/sbeio/plugins/sbeIoErrlUd.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2014,2017 */
+/* Contributors Listed Below - COPYRIGHT 2014,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -25,16 +25,17 @@
#ifndef SBEIO_ERRL_UDP_H
#define SBEIO_ERRL_UDP_H
-/**
+/*
* @file sbeIoErrlUd.H
*
+ * @NOTE: This file is literally a verbatim copy of the file in the FSP repo,
+ * $SANDBOXBASE/obj/ppc/sbei/sbfw/parserplugins/sbeUserDataParser.C.
+ * These files must be kept in sync. Any modification to this file
+ * must be reflected in the file sbeUserDataParser.C and vice versa.
+ *
* Defines the ErrlUserDetailsParser classes that parse SBEIO FFDC
*/
-#include <utilmem.H>
-#include "sbeIoFfdcType.H"
-#include "errluserdetails.H"
-
#include <sys/stat.h>
#include <errno.h>
@@ -45,6 +46,8 @@
#include <utilfile.H>
#include <utilmem.H>
+#include "sbeIoFfdcType.H"
+
#define SBE_TEMP_DUMP_FILE "/tmp/trace_dump.bin"
#define SBE_TRACE_BIN "/tmp/sbe_trace.bin"
#define PPE2FSP_TOOL "ppe2fsp"
@@ -54,7 +57,8 @@
#define SBE_ATTR_DUMP_HEADLINE "SBE Attributes Dump"
#define P9_XIP_ATTR_CMD "-ifs attrdump"
#define SBE_STRING_FILE "sbeStringFile"
-#define SBE_SEEPROM_BIN "sbe_seeprom.bin"
+
+#define SBE_PARSER_MAX_LOCAL_BUFFER 8192
#define SBE_PARSER_PRINT_DELIMITER {std::cout << \
"*****************************************************************************"\
@@ -64,12 +68,11 @@ std::cout << \
" "x<< std::endl;\
SBE_PARSER_PRINT_DELIMITER }
-
-#define SBEIO_PARSER_MAX_LOCAL_BUFFER 8192
-
namespace SBEIO
{
+std::string SBE_SEEPROM_BIN = "sbe_seeprom_DD1.bin";
+
/**
* @class SbeIoFfdcErrlParser
*
@@ -103,8 +106,8 @@ public:
{
int l_rc = 0;
uint32_t fapiRc = 0;
- sbeIoFfdcDataHeader_t l_pData = {0};
- char l_buffer[SBEIO_PARSER_MAX_LOCAL_BUFFER] = {0};
+ sbeFFDCDataHeader_t l_pData = {0};
+ char l_buffer[SBE_PARSER_MAX_LOCAL_BUFFER] = {0};
char *l_pBuffer = (char*)i_pBuffer;
uint32_t l_buflen = i_buflen;
@@ -118,8 +121,8 @@ public:
//seek l_mem to the binary blob of FFDC package
UtilMem l_mem(const_cast<void*>(i_pBuffer),i_buflen);
- // The data is a buffer of SBEIO FFDC data
- i_parser.PrintHeading("SBEIO FFDC Parser");
+ // The data is a buffer of SBE FFDC data
+ i_parser.PrintHeading("SBE FFDC Parser");
if(l_buflen < sizeof(fapiRc))
{
@@ -129,8 +132,7 @@ public:
l_buflen -= sizeof(fapiRc);
l_pBuffer += sizeof(fapiRc);
l_mem >> fapiRc;
-
- i_parser.PrintNumber("FAPI RC ", "0x%08X", fapiRc);
+ i_parser.PrintNumber("FAPI RC ", "0x%08X", ntohl(fapiRc));
if(l_buflen < sizeof(l_pData))
{
@@ -142,13 +144,18 @@ public:
l_mem >> l_pData;
i_parser.PrintNumber("Primary Status ", "0x%04X",
- (uint16_t)l_pData.primaryStatus);
+ (uint16_t)ntohs(l_pData.primaryStatus));
i_parser.PrintNumber("Secondary Status ", "0x%04X",
- (uint16_t)l_pData.secondaryStatus);
+ (uint16_t)ntohs(l_pData.secondaryStatus));
i_parser.PrintNumber("FW Commit ID ", "0x%08X",
- (uint32_t)l_pData.fwCommitID);
-
+ (uint32_t)ntohl(l_pData.fwCommitID));
+ if(ntohl(l_pData.ddLevel) == SBE_FFDC_DD2)
+ {
+ SBE_SEEPROM_BIN = "sbe_seeprom_DD2.bin";
+ }
//loop through the number of fields configured
+ uint32_t *data = (uint32_t *)&l_pData.dumpFields;
+ *data = ntohl(*data);
uint32_t l_dumpFields = l_pData.dumpFields.get();
while(l_dumpFields && !l_rc)
{
@@ -160,23 +167,28 @@ public:
//as possible but break from next loop
l_rc = -1;
}
- sbeIoFfdcUserDataIdentifier_t l_ffdcUserDataId = {0};
+ sbeFFDCUserDataIdentifier_t l_ffdcUserDataId = {0};
l_buflen -= sizeof(uint32_t); //l_ffdcUserDataId
l_pBuffer += sizeof(uint32_t); //l_ffdcUserDataId
l_mem >> l_ffdcUserDataId;
- if((l_buflen < l_ffdcUserDataId.fieldLen) &&
- (l_ffdcUserDataId.fieldId != SBEIO_FFDC_TRACE_DUMP))
+ // TODO via RTC:158462 continue even for attribute dump
+ // Need to extend p9_xip_tool for partial attr dump handling
+ uint16_t fieldLen = ntohs(l_ffdcUserDataId.fieldLen);
+ uint16_t fieldId = ntohs(l_ffdcUserDataId.fieldId);
+
+ if((l_buflen < fieldLen) &&
+ (fieldId != SBE_FFDC_TRACE_DUMP))
{
i_parser.PrintHexDump(l_pBuffer, l_buflen);
break;
}
- l_buflen -= l_ffdcUserDataId.fieldLen;
- l_pBuffer += l_ffdcUserDataId.fieldLen;
+ l_buflen -= fieldLen;
+ l_pBuffer += fieldLen;
- l_mem.read(l_buffer, l_ffdcUserDataId.fieldLen);
+ l_mem.read(l_buffer, fieldLen);
std::ostringstream l_strFile;
//Generate temp dump file name
l_strFile << SBE_TEMP_DUMP_FILE;
@@ -187,21 +199,20 @@ public:
if ( l_errlHndl )
{
std::cerr << "Error opening "
- << l_strFile.str() << std::endl;
+ << l_strFile.str() << std::endl;
l_errlHndl->commit(HWSV_COMP_ID, ERRL_ACTION_REPORT);
delete l_errlHndl;
l_errlHndl = NULL;
- i_parser.PrintHexDump(l_buffer, l_ffdcUserDataId.fieldLen);
- return;
+ i_parser.PrintHexDump(l_buffer, fieldLen);
+ break;
}
else
{
- l_fileObj.write( l_buffer, l_ffdcUserDataId.fieldLen);
+ l_fileObj.write( l_buffer, fieldLen);
l_fileObj.Close();
}
-
//Specific handling
- if(l_ffdcUserDataId.fieldId == SBEIO_FFDC_ATTR_DUMP)
+ if(fieldId == SBE_FFDC_ATTR_DUMP)
{
SBE_PARSER_PRINT_HEADING(SBE_ATTR_DUMP_HEADLINE)
//command
@@ -209,40 +220,40 @@ public:
// p9_xip_tool <sbe seeprom bin file>
// -ifs attrdump <attr dump file> 2>&1
l_strCmd1 << findSbeFile(P9_XIP_TOOL)
- << " "
- << findSbeFile(SBE_SEEPROM_BIN)
- << " "
- << P9_XIP_ATTR_CMD
- << " "
- << l_strFile.str().c_str()
- << " "
- << "2>&1";
+ << " "
+ << findSbeFile(SBE_SEEPROM_BIN.c_str())
+ << " "
+ << P9_XIP_ATTR_CMD
+ << " "
+ << l_strFile.str().c_str()
+ << " "
+ << "2>&1";
//Call out the command
sbeParserSysCall( l_strCmd1.str().c_str() );
}
- else if(l_ffdcUserDataId.fieldId == SBEIO_FFDC_TRACE_DUMP)
+ else if(fieldId == SBE_FFDC_TRACE_DUMP)
{
SBE_PARSER_PRINT_HEADING(SBE_TRACE_HEADLINE)
//command
std::ostringstream l_strCmd1, l_strCmd2;
// ppe2fsp <trace dump file> <trace bin file> 2>&1
l_strCmd1 << findSbeFile(PPE2FSP_TOOL)
- << " "
- << l_strFile.str().c_str()
- << " "
- << SBE_TRACE_BIN
- << " "
- << "2>&1";
+ << " "
+ << l_strFile.str().c_str()
+ << " "
+ << SBE_TRACE_BIN
+ << " "
+ << "2>&1";
// fsp-trace -s <sbe string file> <trace bin file> 2>&1
l_strCmd2 << SBE_TRACE_CMD
- << " "
- << findSbeFile(SBE_STRING_FILE)
- << " "
- << SBE_TRACE_BIN
- << " "
- << "2>&1";
+ << " "
+ << findSbeFile(SBE_STRING_FILE)
+ << " "
+ << SBE_TRACE_BIN
+ << " "
+ << "2>&1";
//Call out the commands
sbeParserSysCall( l_strCmd1.str().c_str() );
@@ -259,7 +270,6 @@ public:
}
}
} while(false);
-
}
private:
@@ -269,23 +279,20 @@ private:
std::string findSbeFile(const char *name) const
{
- #ifdef CONTEXT_x86_nfp
- std::string tmp = getenv("bb");
- tmp += "obj/x86.nfp/sbei/sbfw/img/";
- std::string file = tmp + name;
-
- struct stat l_stat;
- if(stat(file.c_str(), &l_stat) < 0)
+ std::string tmp = getenv("PATH");
+#ifdef CONTEXT_x86_nfp
+ char *bb = getenv("bb");
+ if(bb != NULL)
{
- //Can't find the file
+ std::string bbstr(bb);
+ tmp += ":" + bbstr + "/src/sbei/sbfw/img" +
+ ":" + bbstr + "/obj/x86.nfp/sbei/sbfw/simics" +
+ ":" + bbstr + "/obj/ppc/hwsv/server/buildhwpfimport/hwpf2/tools/x86_binaries";
}
-
- return file;
- #endif
- #ifdef CONTEXT_ppc
- std::string tmp = getenv("PATH");
+#endif
+#ifdef CONTEXT_ppc
tmp += ":/nfs:/maint";
-
+#endif
char *path = strdup(tmp.c_str());
char *dir = NULL;
@@ -313,7 +320,6 @@ private:
path = NULL; //sm05c
return file;
- #endif
}
void sbeParserSysCall(const char *cmd) const
@@ -328,7 +334,7 @@ private:
{
if(fgets(buffer, 256, stream) != NULL)
{
- std::cout << buffer;
+ std::cout << buffer;
}
}
}
@@ -338,7 +344,6 @@ private:
std::cout << "errno [" << errno << "]" << std::endl;
}
}
-
};
} // end namespace
diff --git a/src/usr/sbeio/plugins/sbeIoFfdcType.H b/src/usr/sbeio/plugins/sbeIoFfdcType.H
index 149420d30..f734370df 100644
--- a/src/usr/sbeio/plugins/sbeIoFfdcType.H
+++ b/src/usr/sbeio/plugins/sbeIoFfdcType.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -25,10 +25,27 @@
#ifndef __SBEIO_FFDC_TYPE_H
#define __SBEIO_FFDC_TYPE_H
+#include <endian.h>
+
+/*
+ * @NOTE: This file is literally a verbatim copy of the file in the FSP repo,
+ * $SANDBOXBASE/obj/ppc/sbei/sbfw/parserplugins/sbeFFDCType.H.
+ * These files must be kept in sync. Any modification to this file
+ * must be reflected in the file sbeFFDCType.H and vice versa.
+ *
+ */
+
+
//Bit mapped identifiers
-#define SBEIO_FFDC_ATTR_DUMP 0x0001
-#define SBEIO_FFDC_TRACE_DUMP 0x0002
-#define SBEIO_FFDC_ALL_DUMP 0xFFFF
+#define SBE_FFDC_ATTR_DUMP 0x0001
+#define SBE_FFDC_TRACE_DUMP 0x0002
+#define SBE_FFDC_ALL_DUMP 0xFFFF
+
+enum SBE_FFDC_DD_LEVEL
+{
+ SBE_FFDC_DD1 = 0,
+ SBE_FFDC_DD2 = 1
+};
/* Structure indicating the contents of FFDC package
* value 'true' - field present;value 'false' - field not present
@@ -38,20 +55,26 @@
*/
typedef struct
{
+#if __BYTE_ORDER == __BIG_ENDIAN
uint32_t attrField:1;
uint32_t traceField:1;
uint32_t reserved:30;
+#else
+ uint32_t reserved:30;
+ uint32_t traceField:1;
+ uint32_t attrField:1;
+#endif
/* @breif - set dump fields
*
* @param[in] - uint32_t value to be updated
*/
void set(uint32_t val)
{
- if(val & SBEIO_FFDC_ATTR_DUMP)
+ if(val & SBE_FFDC_ATTR_DUMP)
{
attrField = true;
}
- if(val & SBEIO_FFDC_TRACE_DUMP)
+ if(val & SBE_FFDC_TRACE_DUMP)
{
traceField = true;
}
@@ -65,15 +88,15 @@ typedef struct
uint32_t l_val = 0;
if(attrField)
{
- l_val |= SBEIO_FFDC_ATTR_DUMP;
+ l_val |= SBE_FFDC_ATTR_DUMP;
}
if(traceField)
{
- l_val |= SBEIO_FFDC_TRACE_DUMP;
+ l_val |= SBE_FFDC_TRACE_DUMP;
}
return l_val;
}
-} sbeIoFfdcDumpFields_t;
+} sbeFFDCDumpFields_t;
//Sturcture indicating the type of ffdc user data blob
//and its length in bytes
@@ -81,14 +104,14 @@ typedef struct
{
uint32_t fieldId:16;
uint32_t fieldLen:16;
-} sbeIoFfdcUserDataIdentifier_t;
+} sbeFFDCUserDataIdentifier_t;
//Structure of ffdc user data blob
typedef struct
{
- sbeIoFfdcUserDataIdentifier_t userDataId;
+ sbeFFDCUserDataIdentifier_t userDataId;
const void *userDataPtr;
-} sbeIoFfdcUserData_t;
+} sbeFFDCUserData_t;
//keep it packed to 4byte boundary to avoid packing bytes
typedef struct
@@ -96,7 +119,8 @@ typedef struct
uint32_t primaryStatus:16;//Chip Op Primary status
uint32_t secondaryStatus:16;//Chip Op Secondary status
uint32_t fwCommitID;// FW commit ID
- sbeIoFfdcDumpFields_t dumpFields;//bitmapped dumpFields
-} sbeIoFfdcDataHeader_t;
+ uint32_t ddLevel;// DD level of the SBE
+ sbeFFDCDumpFields_t dumpFields;//bitmapped dumpFields
+} sbeFFDCDataHeader_t;
#endif //__SBEIO_FFDC_TYPE_H
OpenPOWER on IntegriCloud