diff options
Diffstat (limited to 'src/include/usr/trace/trace.H')
-rw-r--r-- | src/include/usr/trace/trace.H | 370 |
1 files changed, 46 insertions, 324 deletions
diff --git a/src/include/usr/trace/trace.H b/src/include/usr/trace/trace.H index 18b0a75df..802efe525 100644 --- a/src/include/usr/trace/trace.H +++ b/src/include/usr/trace/trace.H @@ -1,26 +1,25 @@ -/* IBM_PROLOG_BEGIN_TAG - * This is an automatically generated prolog. - * - * $Source: src/include/usr/trace/trace.H $ - * - * IBM CONFIDENTIAL - * - * COPYRIGHT International Business Machines Corp. 2011-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_TAG - */ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/include/usr/trace/trace.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2011,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 otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ /** * @file trace.H * @@ -32,126 +31,29 @@ #ifndef __TRACE_TRACE_H #define __TRACE_TRACE_H -/******************************************************************************/ -// Includes -/******************************************************************************/ #include <stdint.h> #include <trace/interface.H> -#include <util/singleton.H> -#include <sys/sync.h> -#include <stdarg.h> -#include <list> - - -/******************************************************************************/ -// Globals/Constants -/******************************************************************************/ - -const uint32_t TRACE_BUF_VERSION = 0x01; // Trace buffer version -const uint32_t TRACE_COMP_TRACE = 0x434F; // Component Field Trace - "CO" -const uint32_t TRACE_FIELDTRACE = 0x4654; // Field Trace - "FT" -const uint32_t TRACE_FIELDBIN = 0x4644; // Binary Field Trace - "FD" - -const uint32_t TRACE_DEBUG_ON = 1; //Set to this when debug trace on -const uint32_t TRACE_DEBUG_OFF = 0; //Set to this when debug trace off - -const uint32_t TRAC_COMP_SIZE = 16; // Max component name size -const uint32_t TRAC_MAX_ARGS = 9; // Max number of arguments in trace - -/******************************************************************************/ -// Typedef/Enumerations -/******************************************************************************/ - -typedef uint32_t trace_hash_val; // Hash values are 32 bytes - -/* - * @brief Structure is put at beginning of all trace buffers - */ -typedef struct trace_buf_head { - unsigned char ver; /*!< version of this struct (1) */ - unsigned char hdr_len; /*!< size of this struct in bytes */ - unsigned char time_flg; /*!< meaning of timestamp entry field */ - unsigned char endian_flg; /*!< flag for big ('B') or little ('L') endian*/ - char comp[TRAC_COMP_SIZE]; /*!< the buffer name as specified in init call*/ - uint32_t size; /*!< size of buffer, including this struct */ - uint32_t times_wrap; /*!< how often the buffer wrapped */ - uint32_t next_free; /*!< offset of the byte behind the latest entry*/ - uint32_t te_count; /*!< Updated each time a trace is done */ - uint32_t extracted; /*!< Not currently used */ -}trace_buf_head_t; - -/*! - * @brief Timestamp and thread id for each trace entry. - */ -typedef struct trace_entry_stamp { - uint32_t tbh; /*!< timestamp upper part */ - uint32_t tbl; /*!< timestamp lower part */ - uint32_t tid; /*!< process/thread id */ -}trace_entry_stamp_t; - -/* - * @brief Structure is used by adal app. layer to fill in trace info. - */ -typedef struct trace_entry_head { - uint16_t length; /*!< size of trace entry */ - uint16_t tag; /*!< type of entry: xTRACE xDUMP, (un)packed */ - uint32_t hash; /*!< a value for the (format) string */ - uint32_t line; /*!< source file line number of trace call */ -}trace_entry_head_t; -/* - * @brief Parameter traces can be all contained in one write. - */ -typedef struct trace_entire_entry { - trace_entry_stamp_t stamp; - trace_entry_head_t head; - uint64_t args[TRAC_MAX_ARGS + 1]; /*!< Add 1 for the required buffer size */ -} trace_entire_entry_t; +const uint32_t TRACE_DEBUG_ON = 1; //< Set to this when debug trace on +const uint32_t TRACE_DEBUG_OFF = 0; //< Set to this when debug trace off +const uint32_t TRAC_COMP_SIZE = 16; //< Max component name size +const uint32_t TRAC_MAX_ARGS = 9; //< Max number of arguments in trace -/* - * @brief Binary first writes header and time stamp. - */ -typedef struct trace_bin_entry { - trace_entry_stamp_t stamp; - trace_entry_head_t head; -} trace_bin_entry_t; +typedef uint32_t trace_hash_val; //< Hash values are 32 bits. -/** - * @brief New version name of this typedef - */ -typedef trace_buf_head_t trace_desc_t; - - -/******************************************************************************/ -// Trace Class -/******************************************************************************/ namespace TRACE { - -// Singleton definition -class Trace; -typedef Singleton<Trace> theTrace; - -// Forward declaration. -class TraceDaemon; - -/** - * @brief Trace Singleton Class - * - * This class managers the internals of the host boot trace implementation. -*/ -class Trace -{ - /* ErrlEntry will call getBuffer() */ - friend class ErrlEntry; + class ComponentDesc; // Forward declaration. -public: - /** - * @brief Get singleton instance of this class. - */ - static Trace& getTheInstance(); + /** @brief Buffer type that a component is directed to. */ + enum BUFFER_TYPES + { + BUFFER_SLOW, //< Traces are part of an infinite non-blocking buffer. + BUFFER_FAST, //< Traces are part of a smaller blocking buffer. + BUFFER_COUNT //< Number of trace buffers supported. + }; /** * @brief Initialize a trace buffer. @@ -164,14 +66,14 @@ public: * @param [out] o_td Trace descriptor to initialize * @param [in] i_comp Component name for trace buffer * @param [in] i_size Size to allocate for trace buffer + * @param [in] i_bufferType Type of buffer. * * @return void */ - void initBuffer(trace_desc_t **o_td, + void initBuffer(ComponentDesc **o_td, const char* i_comp, - size_t i_size ); - - + size_t i_size, + uint8_t i_bufferType = BUFFER_FAST); /** * @brief Write component trace out to input buffer @@ -187,13 +89,12 @@ public: * * @return void */ - static void trace_adal_write_all(trace_desc_t *io_td, + void trace_adal_write_all(ComponentDesc *io_td, const trace_hash_val i_hash, const char * i_fmt, const uint32_t i_line, const int32_t i_type, ...); - /** * @brief Write binary data out to trace buffer * @@ -209,14 +110,13 @@ public: * * @return void */ - static void trace_adal_write_bin(trace_desc_t * io_td, + void trace_adal_write_bin(ComponentDesc * io_td, const trace_hash_val i_hash, const uint32_t i_line, const void *i_ptr, const uint32_t i_size, const int32_t i_type); - /** * @brief Retrieve the trace buffer named by i_pName * @@ -242,194 +142,16 @@ public: * component name/trace buffer name is not found, or perhaps * the size of the provided buffer is unreasonable. */ - uint64_t getBuffer( const char * i_pName, - void * o_data, - uint64_t i_bufferSize ); + size_t getBuffer( const char * i_pName, + void * o_data, + size_t i_bufferSize ); /** * @brief flush Continuous trace buffers - * - */ - void flushContBuffers(); - -#if !defined(__HIDDEN_TRACEIF_CLEARBUFFER) -private: -#endif - - - - /** - * @brief Clear all component trace buffers. This has - * no effect on the merged buffer, aka tracBINARY. - * - * @return void - */ - void clearAllBuffers( ); - - - -protected: - - /** - * @brief Constructor for the trace object. - */ - Trace(); - - /** - * @brief Destructor for the trace object. - */ - ~Trace(); - - - - - -private: - - /** - * @brief Initialize a new trace buffer - * - * Internal function responsible setting up the defaults in a newly created - * trace buffer. - * - * @param [out] o_buf Trace descriptor of component buffer to initialize. - * @param [in] i_comp Component name - * @param [in] i_size Size of buffer - * - * @return void - * - */ - void initValuesBuffer(trace_desc_t *o_buf, - const char *i_comp, - size_t i_size); - - - /** - * @brief Write the trace data into the buffer - * - * Internal function responsible for copying the trace data into the appropriate - * buffer. - * - * @param [in,out] io_td Trace descriptor of component buffer to write to. - * @param [in] i_ptr Pointer to data to copy into the trace buffer. - * @param [in] i_size Size of the i_ptr data to copy into the buffer. - * - * @return void - * - */ - void writeData(trace_desc_t * io_td, - const void *i_ptr, - const uint32_t i_size); - - - - /** - * @brief Retrieve trace descriptor for input component name. - * If an exact match for the name is not found, then return nul. - * Internally, Trace keeps buffer names in upper case, and i_pName - * will be converted internally to upper case for the search. - * - * @param [in] i_pName Buffer name to search. - * - * @return trace descriptor for the name, or nul if not found. - */ - trace_desc_t * findTdByName( const char *i_pName ); - - - - - - /** - * @brief Reset all trace buffers - * - * TODO - Not Supported, may have no need in Hostboot for it. - * - * @return Non-zero return code on error - */ - // int32_t resetBuf(void); - - /** - * @brief Convert timestamp - * - * @param [out] o_entry Trace entry stamp to fill in the time info for. - * - * @return Void - */ - void convertTime(trace_entry_stamp_t *o_entry); - - // Disabled copy constructor and assignment operator - Trace(const Trace & right); - Trace & operator=(const Trace & right); - - /** - * @brief Write component trace out to input buffer - * - * @param [in,out] io_td Trace descriptor of buffer to write to. - * @param [in] i_hash Descriptive string hash value - * @param [in] i_fmt Formatting string - * @param [in] i_line Line number trace was done at - * @param [in] i_type Type of trace (TRACE_DEBUG, TRACE_FIELD) - * @param [in] i_args Variable argument list - * - * @return void */ - void _trace_adal_write_all(trace_desc_t *io_td, - const trace_hash_val i_hash, - const char * i_fmt, - const uint32_t i_line, - const int32_t i_type, va_list i_args); - - /** - * @brief Write binary data out to trace buffer - * - * @param [in,out] io_td Trace descriptor of buffer to write to. - * @param [in] i_hash Descriptive string hash value - * @param [in] i_line Line number trace was done at - * @param [in] i_ptr Pointer to binary data - * @param [in] i_size Size of binary data - * @param [in] i_type Type of trace (TRACE_DEBUG, TRACE_FIELD) - * - * @return void - */ - void _trace_adal_write_bin(trace_desc_t * io_td, - const trace_hash_val i_hash, - const uint32_t i_line, - const void *i_ptr, - const uint32_t i_size, - const int32_t i_type); - - /** - * @brief Private function to flush continuous trace buffers - */ - void _flushContBuffers(); - - /** - * @brief This function manages the usage of the two ping-pong buffers - * for handling the continuous trace support under VPO/VBU. - * - * @param [in] i_cbRequired number of bytes needed for the trace entry - * to be added to the active continuous trace buffer - * - * @return void - */ - void ManageContTraceBuffers(uint64_t i_cbRequired); - - // Mutex protecting/serializing writes to trace buffers. - mutex_t iv_trac_mutex; - - // Controls writing to tracBinary - bool iv_ContinuousTrace; - - // VPO/VBU continuous trace active buffer index - uint8_t iv_CurBuf; - - // sequence number - uint32_t iv_seqNum; - - // Trace Daemon for messages. - TraceDaemon* iv_daemon; + void flushBuffers(); }; -} // namespace TRACE +typedef TRACE::ComponentDesc trace_desc_t; #endif |