summaryrefslogtreecommitdiffstats
path: root/src/include/usr/errl/errludbacktrace.H
diff options
context:
space:
mode:
authorMike Jones <mjjones@us.ibm.com>2012-03-12 10:12:01 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-03-16 09:13:39 -0500
commit8a1168142bd3f273dbd4edf841c53a3ae394cd5e (patch)
tree94029d881fa5b89d186073859c7de2fd6dcdfcb8 /src/include/usr/errl/errludbacktrace.H
parentff8472f5e338d17194b5a1300b9553dd1ac3a241 (diff)
downloadtalos-hostboot-8a1168142bd3f273dbd4edf841c53a3ae394cd5e.tar.gz
talos-hostboot-8a1168142bd3f273dbd4edf841c53a3ae394cd5e.zip
ERRL: Ensure all Hostboot code uses ErrlUserDetails framework.
RTC: 36920 Change-Id: I82667c8e63e8a99b9cc7eb1dfbbbdbe1c3b2bb2a Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/730 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/include/usr/errl/errludbacktrace.H')
-rw-r--r--src/include/usr/errl/errludbacktrace.H184
1 files changed, 184 insertions, 0 deletions
diff --git a/src/include/usr/errl/errludbacktrace.H b/src/include/usr/errl/errludbacktrace.H
new file mode 100644
index 000000000..193064e36
--- /dev/null
+++ b/src/include/usr/errl/errludbacktrace.H
@@ -0,0 +1,184 @@
+// IBM_PROLOG_BEGIN_TAG
+// This is an automatically generated prolog.
+//
+// $Source: src/include/usr/errl/errludbacktrace.H $
+//
+// IBM CONFIDENTIAL
+//
+// COPYRIGHT International Business Machines Corp. 2012
+//
+// p1
+//
+// Object Code Only (OCO) source materials
+// Licensed Internal Code Source Materials
+// IBM HostBoot Licensed Internal Code
+//
+// The source code for this program is not published or other-
+// wise divested of its trade secrets, irrespective of what has
+// been deposited with the U.S. Copyright Office.
+//
+// Origin: 30
+//
+// IBM_PROLOG_END
+#ifndef ERRL_UDBACKTRACE_H
+#define ERRL_UDBACKTRACE_H
+
+/**
+ * @file errludbacktrace.H
+ *
+ * Defines the following classes:
+ *
+ * ErrlUserDetailsBackTrace: Adds backtrace FFDC to an error log as user detail
+ * data
+ * ErrlUserDetailsParserBackTrace: Parses backtrace FFDC user detail in an
+ * error log
+ */
+
+#include <errl/errluserdetails.H>
+
+namespace ERRORLOG
+{
+
+#ifndef PARSER
+
+/**
+ * @class ErrlUserDetailsBackTrace
+ *
+ * Adds backtrace FFDC to an error log as user detail data
+*/
+class ErrlUserDetailsBackTrace : public ErrlUserDetails
+{
+public:
+ /**
+ * @brief Constructor
+ *
+ * Captures the backtrace internally
+ */
+ ErrlUserDetailsBackTrace();
+
+ /**
+ * @brief Destructor
+ */
+ virtual ~ErrlUserDetailsBackTrace();
+
+private:
+ // Disabled
+ ErrlUserDetailsBackTrace(const ErrlUserDetailsBackTrace &);
+ ErrlUserDetailsBackTrace & operator=(const ErrlUserDetailsBackTrace &);
+};
+
+#else // (if PARSER defined)
+
+/**
+ * @class ErrlUserDetailsParserBackTrace
+ *
+ * Parses backtrace user detail in an error log
+*/
+class ErrlUserDetailsParserBackTrace : public ErrlUserDetailsParser
+{
+public:
+ /**
+ * @brief Constructor
+ */
+ ErrlUserDetailsParserBackTrace() {}
+
+ /**
+ * @brief Destructor
+ */
+ virtual ~ErrlUserDetailsParserBackTrace() {}
+
+ /**
+ * @brief Parses backtrace user detail data from an error log
+ *
+ * @param i_version Version of the data
+ * @param i_parse ErrlUsrParser object for outputting information
+ * @param i_pBuffer Pointer to buffer containing detail data
+ * @param i_buflen Length of the buffer
+ */
+ virtual void parse(errlver_t i_version,
+ ErrlUsrParser & i_parser,
+ void * i_pBuffer,
+ const uint32_t i_buflen) const
+ {
+ // This buffer contains a number of 64-bit frame pointers.
+
+ // A character vector for storing a backtrace entry and the space
+ // required for the header (frame number and address (with some padding
+ // for safety)) and the symbol name. This vector is resized if a longer
+ // symbol name is encountered.
+ const uint8_t BACKTRACE_ENTRY_HEADER_SIZE = 32;
+ const uint8_t BACKTRACE_ENTRY_SYMBOL_SIZE = 64;
+ std::vector<char> l_traceEntry(BACKTRACE_ENTRY_HEADER_SIZE +
+ BACKTRACE_ENTRY_SYMBOL_SIZE);
+
+ // Initialize l_the symbol table.
+ const char * l_pSymFile = "hbicore.syms";
+ hbSymbolTable symTab;
+ int readRC = symTab.readSymbols( l_pSymFile );
+ if( readRC )
+ {
+ i_parser.PrintString( "Symbols not found", l_pSymFile );
+ // symTab.nearestSymbol() will return NULL because of this.
+ // Carry on.
+ }
+
+ const char * l_pErrlEntry = "ErrlEntry::ErrlEntry";
+ const char * l_pLabel = "Backtrace";
+
+ // loop thru the buffer which is an array of 64-bit addresses
+ uint64_t * p64 = static_cast<uint64_t *>(i_pBuffer);
+ int l_count = i_buflen / sizeof( uint64_t );
+ for( int i = 0; i < l_count; i++ )
+ {
+ // endian convert the stack address
+ uint64_t l_addr = ntohll(*p64);
+
+ // get nearest symbol
+ const char * l_pSymbol = symTab.nearestSymbol( l_addr );
+
+ if( l_pSymbol )
+ {
+ if( strstr( l_pSymbol, l_pErrlEntry ))
+ {
+ // hackish, makes for better looking output
+ // it's in every backtrace (jan2012)
+ l_pSymbol = l_pErrlEntry;
+ }
+
+ uint16_t l_traceSize =
+ (BACKTRACE_ENTRY_HEADER_SIZE + strlen(l_pSymbol) + 1);
+
+ if (l_traceEntry.size() < l_traceSize)
+ {
+ l_traceEntry.resize(l_traceSize);
+ }
+ sprintf(&(l_traceEntry[0]),
+ "#%2d %016llX %s", i, l_addr, l_pSymbol);
+ }
+ else
+ {
+ sprintf(&(l_traceEntry[0]),"#%2d %016llX", i, l_addr);
+ }
+ i_parser.PrintString( l_pLabel, &(l_traceEntry[0]) );
+
+ // next stack address in the buffer
+ p64++;
+
+ // don't print the label for subsequent backtraces
+ l_pLabel = "";
+ }
+ }
+
+private:
+ // Disabled
+ ErrlUserDetailsParserBackTrace(const ErrlUserDetailsParserBackTrace &);
+ ErrlUserDetailsParserBackTrace & operator=(
+ const ErrlUserDetailsParserBackTrace &);
+};
+
+#endif
+
+}
+
+#endif
+
OpenPOWER on IntegriCloud