diff options
author | Mike Jones <mjjones@us.ibm.com> | 2012-03-12 10:12:01 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-03-16 09:13:39 -0500 |
commit | 8a1168142bd3f273dbd4edf841c53a3ae394cd5e (patch) | |
tree | 94029d881fa5b89d186073859c7de2fd6dcdfcb8 /src/include/usr/errl/errludbacktrace.H | |
parent | ff8472f5e338d17194b5a1300b9553dd1ac3a241 (diff) | |
download | talos-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.H | 184 |
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 + |