summaryrefslogtreecommitdiffstats
path: root/src/include/usr/errl
diff options
context:
space:
mode:
authorBrian Horton <brianh@linux.ibm.com>2012-04-25 15:48:55 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-05-08 17:20:50 -0500
commitcd9263254cacd7948aad8ba1bd3a98af469b02af (patch)
tree26e6c8a9856ac9d5b782173b1f2df9b35fe53e18 /src/include/usr/errl
parent8c8f1b51f8f7d366e60ce8ae899b77cd122f86f4 (diff)
downloadtalos-hostboot-cd9263254cacd7948aad8ba1bd3a98af469b02af.tar.gz
talos-hostboot-cd9263254cacd7948aad8ba1bd3a98af469b02af.zip
Errlog User Details: Log Arbitrary Attributes
Add code so that a hostboot or procedure developer can save attributes into an error log and have them display in a human-readable way in order to aid debug and FA. All data is stored in errlog in binary format and decoded into strings and enum 'constants' with the parse function. Methods to dump and parse the attributes are auto-generated by the xmltohb.pl script. In addition, cleanup up Target User Details so that blanks lines aren't output and so that the attribute name isn't put into the error log and is instead added by the parse function (smaller errlog usage), and change to same coding style as other UserDetail functions (data put into buffer in ctor and not in addToLog function). following will be added in future story/task work: - parsing for complex attributes. - combining multiple attribute user details together instead of generating a separate log entry for each. Change-Id: I6baafa36ef095aafabb5bf86d6054bcb3db47019 RTC: 35275 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/944 Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com> Tested-by: Jenkins Server
Diffstat (limited to 'src/include/usr/errl')
-rw-r--r--src/include/usr/errl/errlreasoncodes.H1
-rw-r--r--src/include/usr/errl/errludparserfactoryerrl.H2
-rw-r--r--src/include/usr/errl/errludtarget.H187
-rw-r--r--src/include/usr/errl/hberrltypes.H1
4 files changed, 175 insertions, 16 deletions
diff --git a/src/include/usr/errl/errlreasoncodes.H b/src/include/usr/errl/errlreasoncodes.H
index 89d31e1d4..6bff54568 100644
--- a/src/include/usr/errl/errlreasoncodes.H
+++ b/src/include/usr/errl/errlreasoncodes.H
@@ -48,6 +48,7 @@ enum errlReasonCode
HBERRL_FIRST_ERR = HBERRL_COMP_ID | 0x01,
HBERRL_TEST_STRING_UD = HBERRL_COMP_ID | 0x02,
HBERRL_TEST_REASON_CODE = HBERRL_COMP_ID | 0x03,
+ HBERRL_TEST_ATTRIBUTE_UD = HBERRL_COMP_ID | 0x04,
//........
HBERRL_LAST_ERR = HBERRL_COMP_ID | 0xFF
};
diff --git a/src/include/usr/errl/errludparserfactoryerrl.H b/src/include/usr/errl/errludparserfactoryerrl.H
index 510265e89..f535b562d 100644
--- a/src/include/usr/errl/errludparserfactoryerrl.H
+++ b/src/include/usr/errl/errludparserfactoryerrl.H
@@ -33,6 +33,7 @@
#include <errl/errludstring.H>
#include <errl/errludtarget.H>
#include <errl/errludbacktrace.H>
+#include <errludattribute.H>
#include <errl/errludparserfactory.H>
namespace ERRORLOG
@@ -56,6 +57,7 @@ public:
registerParser<ErrlUserDetailsParserString>(HBERRL_UDT_STRING);
registerParser<ErrlUserDetailsParserTarget>(HBERRL_UDT_TARGET);
registerParser<ErrlUserDetailsParserBackTrace>(HBERRL_UDT_BACKTRACE);
+ registerParser<ErrlUserDetailsParserAttribute>(HBERRL_UDT_ATTRIBUTE);
}
private:
diff --git a/src/include/usr/errl/errludtarget.H b/src/include/usr/errl/errludtarget.H
index b76c58f13..83c9b8991 100644
--- a/src/include/usr/errl/errludtarget.H
+++ b/src/include/usr/errl/errludtarget.H
@@ -67,17 +67,7 @@ public:
*/
virtual ~ErrlUserDetailsTarget();
- /**
- * @brief Adds the Target as user detail data to an error log
- *
- * @param i_errl Error log to add detail data to.
- */
- virtual void addToLog(errlHndl_t i_errl);
-
private:
- // Target pointer
- const TARGETING::Target * iv_pTarget;
-
// Disabled
ErrlUserDetailsTarget(const ErrlUserDetailsTarget &);
ErrlUserDetailsTarget & operator=(const ErrlUserDetailsTarget &);
@@ -124,14 +114,179 @@ public:
const uint32_t i_buflen) const
{
i_parser.PrintString("Target data", NULL);
- char * l_ptr = static_cast<char *>(i_pBuffer);
- for (uint32_t i = 0; i < i_buflen; )
+ const char *attrData;
+ uint32_t i = 0;
+
+ // errlog data
+ uint8_t *l_ptr = static_cast<char *>(i_pBuffer);
+
+ if (*l_ptr == 1) // special - master
+ {
+ //const char *pTargetString = "MASTER_PROCESSOR_CHIP_TARGET_SENTINEL";
+ i_parser.PrintString(NULL, "MASTER_PROCESSOR_CHIP_TARGET_SENTINEL");
+ }
+ else
{
- i_parser.PrintString(NULL, l_ptr);
- i += strlen(l_ptr) + 1;
- l_ptr += strlen(l_ptr) + 1;
+ l_ptr += sizeof(uint8_t); // past the marker
+
+ // first 4 are always the same
+ if (i_buflen >= sizeof(uint32_t) + 3 * sizeof(uint8_t))
+ {
+ char sHuid[12];
+ sprintf(sHuid, "0x%x",*((uint32_t *)l_ptr));
+ i_parser.PrintString("ATTR_HUID", sHuid);
+ i += sizeof(uint32_t);
+ l_ptr += sizeof(uint32_t);
+
+ // CLASS
+ switch (*l_ptr) {
+ case 0x00: { attrData = "CLASS_NA"; break; }
+ case 0x01: { attrData = "CLASS_CARD"; break; }
+ case 0x02: { attrData = "CLASS_ENC"; break; }
+ case 0x03: { attrData = "CLASS_CHIP"; break; }
+ case 0x04: { attrData = "CLASS_UNIT"; break; }
+ case 0x05: { attrData = "CLASS_DEV"; break; }
+ case 0x06: { attrData = "CLASS_SYS"; break; }
+ case 0x07: { attrData = "CLASS_LOGICAL_CARD"; break; }
+ case 0x08: { attrData = "CLASS_MAX"; break; }
+ default: { attrData = "UNKNOWN CLASS"; break; }
+ } // switch
+ i_parser.PrintString("ATTR_CLASS", attrData);
+ i ++;
+ l_ptr ++;
+
+ // TYPE
+ switch (*l_ptr) {
+ case 0x00: { attrData = "TYPE_NA"; break; }
+ case 0x01: { attrData = "TYPE_SYS"; break; }
+ case 0x02: { attrData = "TYPE_NODE"; break; }
+ case 0x03: { attrData = "TYPE_DIMM"; break; }
+ case 0x04: { attrData = "TYPE_SCM"; break; }
+ case 0x05: { attrData = "TYPE_DCM"; break; }
+ case 0x06: { attrData = "TYPE_MEMBUF"; break; }
+ case 0x07: { attrData = "TYPE_PROC"; break; }
+ case 0x08: { attrData = "TYPE_MEMVRM"; break; }
+ case 0x09: { attrData = "TYPE_PROCVRM"; break; }
+ case 0x0A: { attrData = "TYPE_EX"; break; }
+ case 0x0B: { attrData = "TYPE_CORE"; break; }
+ case 0x0C: { attrData = "TYPE_L2"; break; }
+ case 0x0D: { attrData = "TYPE_L3"; break; }
+ case 0x0E: { attrData = "TYPE_L4"; break; }
+ case 0x0F: { attrData = "TYPE_MCS"; break; }
+ case 0x10: { attrData = "TYPE_MBS"; break; }
+ case 0x11: { attrData = "TYPE_MBA"; break; }
+ case 0x12: { attrData = "TYPE_MEM_PORT"; break; }
+ case 0x13: { attrData = "TYPE_PERVASIVE"; break; }
+ case 0x14: { attrData = "TYPE_POWERBUS"; break; }
+ case 0x15: { attrData = "TYPE_XBUS"; break; }
+ case 0x16: { attrData = "TYPE_ABUS"; break; }
+ case 0x17: { attrData = "TYPE_PCI"; break; }
+ case 0x18: { attrData = "TYPE_TP"; break; }
+ case 0x19: { attrData = "TYPE_DMI"; break; }
+ case 0x1A: { attrData = "TYPE_DPSS"; break; }
+ case 0x1B: { attrData = "TYPE_APSS"; break; }
+ case 0x1C: { attrData = "TYPE_OCC"; break; }
+ case 0x1D: { attrData = "TYPE_LAST_IN_RANGE"; break; }
+ default: { attrData = "UNKNOWN TYPE"; break; }
+ } // switch
+ i_parser.PrintString("ATTR_TYPE", attrData);
+ i++;
+ l_ptr++;
+
+ // MODEL
+ switch (*l_ptr) {
+ case 0x00: { attrData = "MODEL_NA"; break; }
+ case 0x10: { attrData = "MODEL_SALERNO"; break; }
+ case 0x11: { attrData = "MODEL_VENICE"; break; }
+ case 0x12: { attrData = "MODEL_MURANO"; break; }
+ case 0x30: { attrData = "MODEL_CENTAUR"; break; }
+ case 0x50: { attrData = "MODEL_JEDEC"; break; }
+ case 0x51: { attrData = "MODEL_CDIMM"; break; }
+ case 0x70: { attrData = "MODEL_POWER8"; break; }
+ default: { attrData = "UNKNOWN MODEL"; break; }
+ } // switch
+ i_parser.PrintString("ATTR_MODEL", attrData);
+ i++;
+ l_ptr++;
+ }
+
+ for (; i < i_buflen; )
+ {
+
+ if ((*l_ptr == 0x15) || // ATTR_PHYS_PATH
+ (*l_ptr == 0x16)) // ATTR_AFFINITY_PATH
+ {
+ l_ptr++;
+ const char *pathString;
+ char outString[128];
+ // from targeting/common/entitypath.[CH]
+ // entityPath is PATH_TYPE:4, NumberOfElements:4,
+ // [Element, Instance#]
+ // PATH_TYPE
+ const uint8_t pathTypeLength = *((uint8_t *)l_ptr);
+ l_ptr++;
+ const uint8_t pathType = (pathTypeLength & 0xF0) >> 4;
+ switch (pathType) {
+ case 0x01: pathString = "Logical:"; break;
+ case 0x02: pathString = "Physical:"; break;
+ case 0x03: pathString = "Device:"; break;
+ case 0x04: pathString = "Power:"; break;
+ default: pathString = "Unknown:"; break;
+ }
+ uint32_t dataSize = sprintf(outString, "%s",pathString);
+ const uint8_t pathSize = (pathTypeLength & 0x0F);
+ uint8_t *lElementInstance = ((uint8_t *)l_ptr);
+ l_ptr += pathSize * sizeof(uint8_t);
+ for (uint32_t i=0;i<pathSize;i += 2) {
+ switch (lElementInstance[i]) {
+ case 0x01: pathString = "/Sys"; break;
+ case 0x02: pathString = "/Node"; break;
+ case 0x03: pathString = "/DIMM"; break;
+ case 0x04: pathString = "/SCM"; break;
+ case 0x05: pathString = "/DCM"; break;
+ case 0x06: pathString = "/Membuf"; break;
+ case 0x07: pathString = "/Proc"; break;
+ case 0x08: pathString = "/MemVRM"; break;
+ case 0x09: pathString = "/ProcVRM"; break;
+ case 0x0A: pathString = "/EX"; break;
+ case 0x0B: pathString = "/Core"; break;
+ case 0x0C: pathString = "/L2"; break;
+ case 0x0D: pathString = "/L3"; break;
+ case 0x0E: pathString = "/L4"; break;
+ case 0x0F: pathString = "/MCS"; break;
+ case 0x10: pathString = "/MBS"; break;
+ case 0x11: pathString = "/MBA"; break;
+ case 0x12: pathString = "/MemPort"; break;
+ case 0x13: pathString = "/Pervasive"; break;
+ case 0x14: pathString = "/Powerbus"; break;
+ case 0x15: pathString = "/XBUS"; break;
+ case 0x16: pathString = "/ABUS"; break;
+ case 0x17: pathString = "/PCI"; break;
+ case 0x18: pathString = "/TP"; break;
+ case 0x19: pathString = "/DMI"; break;
+ case 0x1A: pathString = "/DPSS"; break;
+ case 0x1B: pathString = "/APSS"; break;
+ case 0x1C: pathString = "/OCC"; break;
+ //case TYPE_FSI_LINK: pathString = "/FSI-link"; break;
+ //case TYPE_CFAM: pathString = "/CFAM"; break;
+ //case TYPE_ENGINE: pathString = "/Engine"; break;
+ default: pathString = "/Unknown"; break;
+ } // switch
+ // copy next part in, overwritting previous terminator
+ dataSize += sprintf(outString + dataSize, "%s%d",pathString,lElementInstance[i+1]);
+ } // for
+ if (*l_ptr == 0x15) // ATTR_PHYS_PATH
+ {
+ i_parser.PrintString("ATTR_PHYS_PATH", outString);
+ }
+ else
+ {
+ i_parser.PrintString("ATTR_AFFINITY_PATH", outString);
+ }
+ }
+ } // for
}
- }
+ } // parse()
private:
// Disabled
diff --git a/src/include/usr/errl/hberrltypes.H b/src/include/usr/errl/hberrltypes.H
index 35b7a0417..2328bd6e3 100644
--- a/src/include/usr/errl/hberrltypes.H
+++ b/src/include/usr/errl/hberrltypes.H
@@ -50,6 +50,7 @@ enum errlUserDataType_t
HBERRL_UDT_STRING = 1,
HBERRL_UDT_TARGET = 2,
HBERRL_UDT_BACKTRACE = 3,
+ HBERRL_UDT_ATTRIBUTE = 4,
};
OpenPOWER on IntegriCloud