diff options
Diffstat (limited to 'library/include')
-rw-r--r-- | library/include/mipi_syst.h.in | 783 | ||||
-rw-r--r-- | library/include/mipi_syst/api.h | 2989 | ||||
-rw-r--r-- | library/include/mipi_syst/compiler.h | 193 | ||||
-rw-r--r-- | library/include/mipi_syst/crc32.h | 138 | ||||
-rw-r--r-- | library/include/mipi_syst/inline.h | 245 | ||||
-rw-r--r-- | library/include/mipi_syst/message.h | 159 |
6 files changed, 4507 insertions, 0 deletions
diff --git a/library/include/mipi_syst.h.in b/library/include/mipi_syst.h.in new file mode 100644 index 0000000..e0856d5 --- /dev/null +++ b/library/include/mipi_syst.h.in @@ -0,0 +1,783 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_H_INCLUDED +#define MIPI_SYST_H_INCLUDED + +/* SyS-T API version information + */ +#define MIPI_SYST_VERSION_MAJOR @SYST_CFG_VERSION_MAJOR@ /**< Major version, incremented if API changes */ +#define MIPI_SYST_VERSION_MINOR @SYST_CFG_VERSION_MINOR@ /**< Minor version, incremented on compatible extensions */ +#define MIPI_SYST_VERSION_PATCH @SYST_CFG_VERSION_PATCH@ /**< Patch for existing major, minor, usually 0 */ + +/** Define SyS-T API conformance level + * + * 10 = minimal (only short events) + * 20 = low overhead (exluding varag functions and CRC32) + * 30 = full implementation + */ +#define MIPI_SYST_CONFORMANCE_LEVEL @SYST_CFG_CONFORMANCE_LEVEL@ + +/** Compute SYS-T version value + * + * Used to compare SYS-T Major.Minor.patch versions numerically at runtime. + * + * @param ma major version number + * @param mi minor version number + * @param p patch version number + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #if MIPI_SYST_VERSION_CODE >= MIPI_SYST_MAKE_VERSION_CODE(1,5,0) + * // do what only >= 1.5.x supports + * #endif + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_MAKE_VERSION_CODE(ma, mi, p) (((ma) << 16) | ((mi)<<8) | (p)) + +/** Numeric SYS-T version code */ +#define MIPI_SYST_VERSION_CODE MIPI_SYST_MAKE_VERSION_CODE(\ + MIPI_SYST_VERSION_MAJOR,\ + MIPI_SYST_VERSION_MINOR,\ + MIPI_SYST_VERSION_PATCH) + +/* Macros to trick numeric values like __LINE__ into a string + */ +#define _MIPI_SYST_STRINGIFY(x) #x +#define _MIPI_SYST_CPP_TOSTR(x) _MIPI_SYST_STRINGIFY(x) + +#define _MIPI_SYST_VERSION_STRING(a, b, c)\ + _MIPI_SYST_CPP_TOSTR(a)"."_MIPI_SYST_CPP_TOSTR(b)"."_MIPI_SYST_CPP_TOSTR(c) + +/** Textual version string */ +#define MIPI_SYST_VERSION_STRING \ + _MIPI_SYST_VERSION_STRING(\ + MIPI_SYST_VERSION_MAJOR,\ + MIPI_SYST_VERSION_MINOR,\ + MIPI_SYST_VERSION_PATCH) + +#ifndef MIPI_SYST_COMPILER_INCLUDED +#include "mipi_syst/compiler.h" +#endif + +/* String hash macros for compile time computation of catalog ID's. + * Notes: + * These macros will only be used with optimized builds, otherwise + * a lot of runtime code will be generated. + * + * Only the last 64 bytes of the string are considered for hashing + */ +#define _MIPI_SYST_HASH1(s,i,x,l) (x*65599u+(mipi_syst_u8)s[(i)<(l)?((l)-1-(i)):(l)]) +#define _MIPI_SYST_HASH4(s,i,x,l) _MIPI_SYST_HASH1(s,i,_MIPI_SYST_HASH1(s,i+1,_MIPI_SYST_HASH1(s,i+2,_MIPI_SYST_HASH1(s,i+3,x,l),l),l),l) +#define _MIPI_SYST_HASH16(s,i,x,l) _MIPI_SYST_HASH4(s,i,_MIPI_SYST_HASH4(s,i+4,_MIPI_SYST_HASH4(s,i+8,_MIPI_SYST_HASH4(s,i+12,x,l),l),l),l) +#define _MIPI_SYST_HASH64(s,i,x,l) _MIPI_SYST_HASH16(s,i,_MIPI_SYST_HASH16(s,i+16,_MIPI_SYST_HASH16(s,i+32,_MIPI_SYST_HASH16(s,i+48,x,l),l),l),l) + +#define _MIPI_SYST_HASH_x65599(s,l) ((mipi_syst_u32)_MIPI_SYST_HASH64(s,0,0,l)) + +#define _MIPI_SYST_HASH_AT_CPP_TIME(str, offset) (_MIPI_SYST_HASH_x65599(str, sizeof(str)-1) + (offset)) +#define _MIPI_SYST_HASH_AT_RUN_TIME(str, offset) (mipi_syst_hash_x65599(str, sizeof(str)-1) + (offset)) + +#if defined(_MIPI_SYST_OPTIMIZER_ON) +#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_CPP_TIME((a), (b)) +#else +#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_RUN_TIME((a),(b)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/** Major Message Types + */ +enum mipi_syst_msgtype { + MIPI_SYST_TYPE_BUILD = 0, /**< client build id message */ + MIPI_SYST_TYPE_SHORT32 = 1, /**< value only message */ + MIPI_SYST_TYPE_STRING = 2, /**< text message output */ + MIPI_SYST_TYPE_CATALOG = 3, /**< catalog message output */ + MIPI_SYST_TYPE_RAW = 6, /**< raw binary data */ + MIPI_SYST_TYPE_SHORT64 = 7, /**< value only message */ + MIPI_SYST_TYPE_CLOCK = 8, /**< clock sync message */ + + MIPI_SYST_TYPE_MAX +}; + +/** MIPI_SYST_TYPE_DEBUG_STRING Sub-Types + */ +enum mipi_syst_subtype_string { + MIPI_SYST_STRING_GENERIC = 1, /**< string generic debug */ + MIPI_SYST_STRING_FUNCTIONENTER = 2, /**< string is function name */ + MIPI_SYST_STRING_FUNCTIONEXIT = 3, /**< string is function name */ + MIPI_SYST_STRING_INVALIDPARAM = 5, /**< invalid SyS-T APIcall */ + MIPI_SYST_STRING_ASSERT = 7, /**< Software Assert: failure */ + MIPI_SYST_STRING_PRINTF_32 = 11, /**< printf with 32-bit packing */ + MIPI_SYST_STRING_PRINTF_64 = 12, /**< printf with 64-bit packing */ + + MIPI_SYST_STRING_MAX +}; + +/** MIPI_SYST_TYPE_CATALOG Sub-Types + */ +enum mipi_syst_subtype_catalog { + MIPI_SYST_CATALOG_ID32_P32 = 1, /**< 32-bit catalog ID, 32-bit packing */ + MIPI_SYST_CATALOG_ID64_P32 = 2, /**< 64-bit catalog ID, 32-bit packing */ + MIPI_SYST_CATALOG_ID32_P64 = 5, /**< 32-bit catalog ID, 64-bit packing */ + MIPI_SYST_CATALOG_ID64_P64 = 6, /**< 64-bit catalog ID, 64-bit packing */ + + MIPI_SYST_CATALOG_MAX +}; + +/** MIPI_SYST_TYPE_CLOCK Sub-Types + */ +enum mipi_syst_subtype_clock{ + MIPI_SYST_CLOCK_TRANSPORT_SYNC = 1, /**< SyS-T clock & frequency sync */ + MIPI_SYST_CLOCK_MAX +}; + +enum mipi_syst_subtype_build { + MIPI_SYST_BUILD_ID_COMPACT32 = 0, /**< compact32 build id */ + MIPI_SYST_BUILD_ID_COMPACT64 = 1, /**< compact64 build id */ + MIPI_SYST_BUILD_ID_LONG = 2, /**< normal build message */ + MIPI_SYST_BUILD_MAX +}; + +struct mipi_syst_header; +struct mipi_syst_handle; +struct mipi_syst_scatter_prog; + +/** 128-bit GUID style message origin ID */ +struct mipi_syst_guid { + union { + mipi_syst_u8 b[16]; + mipi_syst_u64 ll[2]; + } u; +}; + +/** GUID initializer code + * + * This macro simplifies converting a GUID from its string representation + * into the mipi_syst_guid data structure. The following example shows + * how the values from a GUID string are used with the macro. Each numeric + * component from the GUID string gets converted into a hex value parameter + * when invoking the macro. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // Guid: f614b99d-99a1-4c04-8c30-90999ab5fe05 + * + * struct mipi_syst_guid guid = + * MIPI_SYST_GEN_GUID(0xf614b99d, 0x99a1, 0x4c04, 0x8c30, 0x90999ab5fe05); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) \ + {{\ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 24), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 16), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 8), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w1) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w1) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w2) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w2) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w3) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w3) >> 0), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 40), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 32), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 24), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 16), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 8), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 0) \ + }} + + /** SyS-T client origin data + * + * This structure holds the GUID or header origin and unit data + * used by SyS-T handles. The structure gets passed into the handle + * creation functions to initialize the values that identify clients. + * @see MIPI_SYST_SET_HANDLE_GUID_UNIT + * @see MIPI_SYST_SET_HANDLE_MODULE_UNIT + * @see MIPI_SYST_SET_HANDLE_ORIGIN + */ +struct mipi_syst_origin { + struct mipi_syst_guid guid; /**< origin GUID or module value */ + mipi_syst_u16 unit; /**< unit value */ +}; + +/** Origin structure initializer code using GUID +* +* This macro simplifies initializing a mipi_syst_origin structure. The +* first 5 parameters are GUID values as used by the MIPI_SYST_GEN_GUID +* macro. The last parameter is the unit value (11-Bits). +* @see MIPI_SYST_GEN_GUID +* +* +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} + +* +* struct mipi_syst_origin = origin +* MIPI_SYST_GEN_ORIGIN_GUID( +* 0x494E5443, 0xB659, 0x45AF, 0xB786, 0x9DB0786248AE, +* 0x1); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_GEN_ORIGIN_GUID(l1, w1, w2, w3, l2 , u) \ + {\ + MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) ,\ + u\ + } + +/** Origin structure initializer code using header module value +* +* This macro simplifies initializing a mipi_syst_origin structure. The +* first parameter is the header origin value (7-Bits). The second parameter +* is the unit value (4-bits) +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} + +* #define MODULE_X 0x10 +* struct mipi_syst_origin = +* MIPI_SYST_GEN_ORIGIN_MODULE(MODULE_X, 0x1); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_GEN_ORIGIN_MODULE(m , u) \ + {\ + MIPI_SYST_GEN_GUID(0,0,0, ((mipi_syst_u16)(m & 0x7F)) << 8, 0 ),\ + u\ + } +/** + * Global state initialization hook definition + * + * This function gets called in the context of the mipi_syst_init() API + * function after the generic state members of the global state + * structure syst_hdr have been setup. It's purpose is to initialize the + * platform dependent portion of the state and other necessary + * platform specific initialization steps. + * + * @param systh Pointer to global state structure + * @param p user defined value or pointer to data + * @see mipi_syst_header + */ +typedef void (MIPI_SYST_CALLCONV *mipi_syst_inithook_t)(struct mipi_syst_header *systh, + const void *p); + +/** + * Global state destroy hook definition + * + * This function gets called in the context of the mipi_syst_destroy() API + * function before the generic state members of the global state + * structure syst_hdr have been destroyed. Its purpose is to free resources + * used by the platform dependent portion of the global state. + * + * @param systh Pointer to global state structure + */ +typedef void (MIPI_SYST_CALLCONV *mipi_syst_destroyhook_t)(struct mipi_syst_header *systh); + +/** + * SyS-T handle state initialization hook definition + * + * This function gets called in the context of IO handle generation. + * Its purpose is to initialize the platform dependent portion of +* the handle and other necessary platform specific initialization steps. + * + * @param systh Pointer to new SyS-T handle + * @see syst_handle_t + */ +typedef void (*mipi_syst_inithandle_hook_t)(struct mipi_syst_handle *systh); + +/** + * SyS-T handle state release hook definition + * + * This function gets called when a handle is about to be destroyed.. + * Its purpose is to free any resources allocated during the handle + * generation. + * + * @param systh Pointer to handle that is destroyed + * @see syst_handle_t + */ +typedef void (*mipi_syst_releasehandle_hook_t)(struct mipi_syst_handle *systh); + +/** + * Low level message write routine definition + * + * This function is called at the end of an instrumentation API to output + * the raw message data. + * + * @param systh pointer to a SyS-T handle structure used in the API call, + * @param scatterprog pointer to a list of scatter write instructions that + * encodes how to convert the descriptor pointer by + * pdesc into raw binary data. This list doesn't include + * the mandatory first 32 tag byte value pointed by pdesc. + * @param pdesc pointer to a message descriptor, which containing at least + * the 32-bit message tag data + */ +typedef void (*mipi_syst_msg_write_t)( + struct mipi_syst_handle *systh, + struct mipi_syst_scatter_prog *scatterprog, + const void *pdesc); + +#ifdef __cplusplus +} /* extern C */ +#endif +#ifndef MIPI_SYST_PLATFORM_INCLUDED + +/** + * @defgroup PCFG_Config Platform Feature Configuration Defines + * + * Defines to customize the SyS-T feature set to match the platform needs. + * + * Each optional library feature can be disabled by not defining the related + * MIPI_SYST_PCFG_ENABLE define. Removing unused features in this way reduces + * both memory footprint and runtime overhead of SyS-T. + */ + +/** + * @defgroup PCFG_Global Platform Wide Configuration + * @ingroup PCFG_Config + * + * These defines enable global features in the SyS-T library. + * @{ + */ + + + /** + * Extend Platform global SyS-T data state + * + * This define extends the global SyS-T state data structure + * mipi_syst_header with platform private content. A platform typically + * stores data for SyS-T handle creation processing in this structure. + * + * Note: This data is not touched by the library code itself, but typically + * is used by platform hook functions for handle creation and destruction. + * **These hook function calls are not lock protected and may happen + * concurrently!** The hook functions need to implement locking if they + * modify the platform state data. + * + * The platform example uses #mipi_syst_platform_state as data state extension. + */ +#define MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA + +/** + * Extend SyS-T handle data state + * + * This define extends the SyS-T handle state data structure + * mipi_syst_handle with platform private content. A platform typically + * stores data for fast trace hardware access in the handle data, for + * example a volatile pointer to an MMIO space. + * + * The platform example uses #mipi_syst_platform_handle as handle state + * extension. + */ +#define MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA + +/** + * Enable HEAP usage for handle generation + * + * This macro tells the SyS-T library to enable the heap allocation handle + * creation API #MIPI_SYST_ALLOC_HANDLE. + * The platform must provide the macros #MIPI_SYST_HEAP_MALLOC and + * #MIPI_SYST_HEAP_FREE to point SyS-T to the platform malloc and free + * functions. + * + * Note: In OS kernel space environments, you must use unpaged memory + * allocation functions. + */ +#define MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY + +/* MSVC and GNU compiler 64-bit mode */ + +/** + * Enable 64-bit instruction addresses + * + * Set this define if running in 64-bit code address space. + */ +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define MIPI_SYST_PCFG_ENABLE_64BIT_ADDR +#endif +/** + * Enable atomic 64-bit write operations + * + * Set this define if your platform supports an atomic 64-bit data write + * operation. This results in fewer MMIO accesses.The SyS-T library + * defaults to 2 consecutive 32-Bit writes otherwise. + */ +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define MIPI_SYST_PCFG_ENABLE_64BIT_IO +#endif + +/** + * Enable helper function code inlining + * + * Set this define if speed is more important than code size on your platform. + * It causes several helper function to get inlined, producing faster, but + * also larger, code. + */ +#define MIPI_SYST_PCFG_ENABLE_INLINE + +/** @} */ + +/** + * @defgroup PCFG_ApiSet Supported API sets + * @ingroup PCFG_Config + * + * These defines enable API sets in the SyS-T library. They are set by default + * depending on the SyS-T API conformance level. The level is specified using + * the define #MIPI_SYST_CONFORMANCE_LEVEL. + * @{ + */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 + /** + * Use SyS-T scatter write output function + * + * The library comes with an output routine that is intended to write data out + * to an MMIO space. It simplifies a SyS-T platform integration as + * only low-level access macros must be provided for outputting data. These + * macros follow MIPI System Trace Protocol (STP) naming convention, also + * non STP generators can use this interface. + * + * These low level output macros are: + * + * #MIPI_SYST_OUTPUT_D32MTS, #MIPI_SYST_OUTPUT_D64MTS, + * #MIPI_SYST_OUTPUT_D32TS, #MIPI_SYST_OUTPUT_D64, + * #MIPI_SYST_OUTPUT_D32, #MIPI_SYST_OUTPUT_D16, #MIPI_SYST_OUTPUT_D8 and + * #MIPI_SYST_OUTPUT_FLAG + * + * Note: This version of the write function always starts messages + * using a 32-bit timestamped record also other sized timestamped + * packets are allowed by the SyS-T specification. + */ +#define MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE + +/** + * Enable the Catalog API for 32-Bit Catalog IDs. + */ +#define MIPI_SYST_PCFG_ENABLE_CATID32_API + +/** + * Enable the Catalog API for 64-Bit Catalog IDs. + */ +#define MIPI_SYST_PCFG_ENABLE_CATID64_API + +/** + * Enable plain UTF-8 string output APIs. + */ +#define MIPI_SYST_PCFG_ENABLE_STRING_API + +/** + * Enable raw data output APIs + */ +#define MIPI_SYST_PCFG_ENABLE_WRITE_API + +/** + * Enable Build API + */ +#define MIPI_SYST_PCFG_ENABLE_BUILD_API +#endif /* MIPI_SYST_CONFORMANCE_LEVEL > 10 */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 20 + /** + * Enable printf API support + * + * Note: + * Enabling printf requires compiler var_arg support as defined by the + * header files stdarg.h stddef.h. + */ + +#define MIPI_SYST_PCFG_ENABLE_PRINTF_API + +/** + * Maximum size of printf payload in bytes. + * Adjust this value if larger strings shall be supported by the library. + * The buffer space is located in stack memory when calling one of the printf + * style APIs. + */ +#define MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE 1024 + +#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL > 20 */ + +/* @} */ + +/** + * @defgroup PCFG_Message Optional Message Attributes + * @ingroup PCFG_Config + * + * These defines enable optional message components. They are set by default + * depending on the SyS-T API conformance level. The level is specified using + * the define #MIPI_SYST_CONFORMANCE_LEVEL. + * @{ + */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 +/** + * Enable 128-bit origin GUID support. + */ +#define MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID + +/** + * Enable the API variants that send file:line ID pair location records. + */ +#define MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +/** + * Enable the API variants that send the address of the instrumentation location. + * + * This API requires #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD to be set as well. + * It uses its own define as it additionally requires the function + * @ref mipi_syst_return_addr() to be implemented for your platform. + */ +#define MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +/** + * Enable protocol timestamp. + * + * This option adds a timestamp into the SyS-T protocol. This + * option is used if the SyS-T protocol is not embedded into a hardware + * timestamped trace protocol like MIPI STP or if the HW timestamp cannot + * be used for other reasons. Setting this option creates the need to define + * the macros #MIPI_SYST_PLATFORM_CLOCK and #MIPI_SYST_PLATFORM_FREQ to + * return a 64-bit clock tick value and its frequency. + */ +#define MIPI_SYST_PCFG_ENABLE_TIMESTAMP + +#if defined(_DOXYGEN_) /* only for doxygen, remove the #if to enable */ + /** + * Enable generation of length field + * + * Set this define if the message data shall include the optional length + * field that indicates how many payload bytes follow. + */ +#define MIPI_SYST_PCFG_LENGTH_FIELD +#endif + +#endif + +#if MIPI_SYST_CONFORMANCE_LEVEL > 20 +/** + * Enable message data CRC32 generation. + */ +#define MIPI_SYST_PCFG_ENABLE_CHECKSUM + +#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL */ + +/** @} */ + +#include "mipi_syst/platform.h" +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#define MIPI_SYST_INLINE static MIPI_SYST_CC_INLINE +#else +#define MIPI_SYST_INLINE MIPI_SYST_EXPORT +#endif + +/** SyS-T global state structure. + * This structure is holding the global SyS-T library state + */ +struct mipi_syst_header { + mipi_syst_u32 systh_version; /**< SyS-T version ID */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + mipi_syst_inithandle_hook_t systh_inith; /**< handle init hook function*/ + mipi_syst_releasehandle_hook_t systh_releaseh; /**< handle release hook */ +#endif + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 + mipi_syst_msg_write_t systh_writer; /**< message output routine */ +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) + struct mipi_syst_platform_state systh_platform; + /**< platform specific state */ +#endif +}; + +/** + * Message data header tag definition + * + * Each SyS-T message starts with a 32-bit message tag. The tag defines the + * message originator and decoding information for the data following + * the tag. + */ + +struct mipi_syst_msg_tag { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ + mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ + mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ + mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ + mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ + mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ + mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ + mipi_syst_u32 et_length : 1; /**< indicate length field */ + mipi_syst_u32 et_location : 1; /**< indicate location information */ + mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ + mipi_syst_u32 et_severity : 3; /**< severity level of message */ + mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ +#else + mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ + mipi_syst_u32 et_severity : 3; /**< severity level of message */ + mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ + mipi_syst_u32 et_location : 1; /**< indicate location information */ + mipi_syst_u32 et_length : 1; /**< indicate length field */ + mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ + mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ + mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ + mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ + mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ + mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ + mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ +#endif +}; +#define _MIPI_SYST_MK_MODUNIT_ORIGIN(m,u) (((u) & 0xF)|(m<<4)) + +/** + * Message severity level enumeration + */ +enum mipi_syst_severity { + MIPI_SYST_SEVERITY_MAX = 0, /**< no assigned severity */ + MIPI_SYST_SEVERITY_FATAL = 1, /**< critical error level */ + MIPI_SYST_SEVERITY_ERROR = 2, /**< error message level */ + MIPI_SYST_SEVERITY_WARNING = 3,/**< warning message level */ + MIPI_SYST_SEVERITY_INFO = 4, /**< information message level */ + MIPI_SYST_SEVERITY_USER1 = 5, /**< user defined level 5 */ + MIPI_SYST_SEVERITY_USER2 = 6, /**< user defined level 6 */ + MIPI_SYST_SEVERITY_DEBUG = 7 /**< debug information level */ +}; + +/** + * Location information inside a message (64-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation32 { + struct { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u16 etls_lineNo; /**< line number in file */ + mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ +#else + mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u16 etls_lineNo; /**< line number in file */ +#endif + } etls_source_location; + + mipi_syst_u32 etls_code_location:32; /**< instruction pointer value */ +}; + +/** + * Location information inside a message (32-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation64 { + struct { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u32 etls_lineNo; /**< line number in file */ + mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ +#else + mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u32 etls_lineNo; /**< line number in file */ +#endif + } etls_source_location; + mipi_syst_u64 etls_code_location; /**< instruction pointer value */ +}; + +/** + * Location information record descriptor + */ +struct mipi_syst_msglocation { + /** Message format + * 0 = 16-Bit file and 16-Bit line (total: 32-bit) + * 1 = 32-Bit file and 32-Bit line (total: 64-bit) + * 2 = 32-bit code address + * 3 = 64-bit code address + */ + mipi_syst_u8 el_format; + union { + union mipi_syst_msglocation32 loc32; /**< data for 32-bit variant */ + union mipi_syst_msglocation64 loc64; /**< data for 64-bit variant */ + } el_u; +}; + +/** internal handle state flags + */ +struct mipi_syst_handle_flags { + mipi_syst_u32 shf_alloc:1; /**< set to 1 if heap allocated handle */ +}; + +/** SyS-T connection handle state structure + * + * This structure connects the instrumentation API with the underlying SyS-T + * infrastructure. It plays a similar role to a FILE * in traditional + * C file IO. + */ + struct mipi_syst_handle { + struct mipi_syst_header* systh_header; /**< global state */ + struct mipi_syst_handle_flags systh_flags; /**< handle state */ + struct mipi_syst_msg_tag systh_tag; /**< tag flags */ + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + struct mipi_syst_guid systh_guid; /**< module GUID */ +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + struct mipi_syst_msglocation systh_location; /**< location record */ +#endif + + mipi_syst_u32 systh_param_count; /**< number of parameters */ + mipi_syst_u32 systh_param[6]; /**< catalog msg parameters */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + struct mipi_syst_platform_handle systh_platform; + /**< platform specific state */ +#endif +}; + + +#ifdef __cplusplus +} /* extern C */ +#endif +#ifndef MIPI_SYST_API_INCLUDED +#include "mipi_syst/api.h" +#endif + +#endif diff --git a/library/include/mipi_syst/api.h b/library/include/mipi_syst/api.h new file mode 100644 index 0000000..e07dd8b --- /dev/null +++ b/library/include/mipi_syst/api.h @@ -0,0 +1,2989 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* SyS-T Instrumentation API defintions + */ + +#ifndef MIPI_SYST_API_INCLUDED +#define MIPI_SYST_API_INCLUDED + +#ifndef MIPI_SYST_H_INCLUDED +#include "mipi_syst.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Define away all instrumentation calls if one if the following global + * disable switches is set + */ +#if !defined(MIPI_SYST_DISABLE_ALL) + +/** + * @defgroup ApiSets API Sets + * + * SyS-T provided Instrumentation API sets + * + * SyS-T provides different API sets. Most sets can be individually enabled + * or disabled using the @ref PCFG_ApiSet platform feature defines. + */ + +/** + * @defgroup API_global State and Lifetime handling macros + * @ingroup ApiSets + * + * State and handle lifetime related macros + * @{ + */ + +/** + * SyS-T platform initialization with user provided state structure + * + * This function must be called during system startup to initialize the SyS-T + * execution environment. This function expects a user provided SyS-T state + * structure pointer. This call supports environments with different + * library states at the same time. To initialize SyS-T for using a global + * shared state, call #MIPI_SYST_INIT(f,p) instead. + * + * @param s Pointer to SyS-T state header variable + * @param f Pointer to platform initialization hook function + * @param p Pointer value that gets passed to the initialization hook function + */ +#define MIPI_SYST_INIT_STATE(s, f, p) \ + mipi_syst_init((s), (f), (p)) + +/** + * SyS-T platform shutdown with user provided state structure + * + * This function expects a user provided SyS-T state + * structure pointer. This call supports environments with different + * library states at the same time. To shutdown SyS-T using a global + * shared state, call #MIPI_SYST_SHUTDOWN(f) instead. + * + * @param s Pointer to SyS-T state header variable + * @param f pointer to platform resource destruction hook function + */ +#define MIPI_SYST_SHUTDOWN_STATE(s, f) \ + mipi_syst_destroy((s), (f)) + +/** + * SyS-T global platform initialization + * + * This function must be called during system startup to initialize the SyS-T + * execution environment. + * + * @param f pointer to platform initialization hook function + * @param p pointer value that gets passed to the initialization hook function + */ +#define MIPI_SYST_INIT(f, p) \ + MIPI_SYST_INIT_STATE((struct mipi_syst_header*)0, (f), (p)) + +/** + * SyS-T global platform shutdown + * + * @param f pointer to platform resource destruction hook function + */ +#define MIPI_SYST_SHUTDOWN(f) \ + MIPI_SYST_SHUTDOWN_STATE((struct mipi_syst_header*)0, (f)) + +/** + * Initialize non-heap SyS-T handle with custom global state + * + * This function is used in platforms that don't support heap allocations. + * The caller has to provide a pointer to a memory location that can hold + * a mipi_syst_handle data structure. This function expect a user provided + * SyS-T state structure pointer as its first parameter. To create a + * handle for the shared global state, call #MIPI_SYST_INIT_HANDLE(h,p) instead. + * + * @param s Pointer to SyS-T state header variable + * @param h Pointer to handle data structure on the stack or data segment. + * @param p Pointer to data that get passed to the platform handle init hook + * function. + * + * Example + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * extern struct mipi_syst_header systh_header; + * static struct mipi_syst_handle systh_data; + * + * void foo() + * { + * struct mipi_syst_handle* svh; + * + * svh = MIPI_SYST_INIT_HANDLE_STATE(&systh_header, &systh_data, NULL); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_INIT_HANDLE_STATE(s, h, p) \ + mipi_syst_init_handle((s), (h), (p), 0) + +/** + * Initialize non-heap SyS-T handle + * + * This function is used in platforms that don't support heap allocations. + * The caller has to provide a pointer to a memory location that can hold + * a mipi_syst_handle data structure. + * + * @param h Pointer to handle data structure on the stack or data segment. + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * static struct mipi_syst_handle systh_data; + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_INIT_HANDLE(&systh_data, NULL); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_INIT_HANDLE(h, p) \ + MIPI_SYST_INIT_HANDLE_STATE((struct mipi_syst_header*)0, (h), (p)) + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +/** + * Heap allocate and initialize a new SyS-T handle for a custom global state + * + * This function is only supported if the platform supports the + * feature #MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY. Use + * #MIPI_SYST_INIT_HANDLE if no heap support is enabled. + * + * @param s Pointer to SyS-T state header variable + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * extern struct mipi_syst_header systh_header; + * + * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * void foo() + * { + * struct mipi_syst_handle* svh; + * + * svh = MIPI_SYST_ALLOC_HANDLE_STATE(&systh_header, &origin); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ALLOC_HANDLE_STATE(s, p) \ + mipi_syst_init_handle(\ + (s),\ + (struct mipi_syst_handle*)MIPI_SYST_HEAP_MALLOC(sizeof(struct mipi_syst_handle)),\ + (p), 1) + +/** + * Heap allocate and initialize a new SyS-T handle + * This function is only supported if the platform supports the + * feature #MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY. Use + * #MIPI_SYST_INIT_HANDLE if no heap support is enabled. + * + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(&origin); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ALLOC_HANDLE(p) \ + MIPI_SYST_ALLOC_HANDLE_STATE((struct mipi_syst_header*)0, (p)) + +#else +#define MIPI_SYST_ALLOC_HANDLE(p) \ +CFG_ERROR_ALLOC_HANDLE_CALLED_WITHOUT_PCFG_ENABLE_HEAP_MEMORY +#define MIPI_SYST_ALLOC_HANDLE_STATE(s, p) \ +CFG_ERROR_SYST_ALLOC_HANDLE_STATE_CALLED_WITHOUT_PCFG_ENABLE_HEAP_MEMORY +#endif + + +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) || defined (_DOXYGEN_) + /** + * Enable or disable length generation over the given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable length field, otherwise enable length + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // enable checksums + * // + * MIPI_SYST_ENABLE_HANDLE_LENGTH(svh, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h, v) \ + ((h) && ((h)->systh_tag.et_length = (v) ? 1 : 0)) +#else +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h, v) +#endif + + /** + * Get length field generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_LENGTH(svh)) { + * // length field enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_LENGTH(h) \ + (((h) &&(h)->systh_tag.et_length) ? 1 : 0) + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) +/** + * Enable or disable checksum generation over the given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable checksum, otherwise enable checksum + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // enable checksums + * // + * MIPI_SYST_ENABLE_HANDLE_CHECKSUM(svh, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h, v) \ + ((h) && ((h)->systh_tag.et_chksum = (v) ? 1 : 0)) + + /** + * Get checksum generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_CHECKSUM(svh)) { + * // checksums enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_CHECKSUM(h) \ + (((h) && (h)->systh_tag.et_chksum) ? 1 : 0) +#endif + +/** + * Change module and unit ID of the given SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param module module id (0..0x7F) + * @param unit unit id (0x0..0xF) + * + * @see #MIPI_SYST_SET_HANDLE_GUID_UNIT mipi_syst_msg_tag + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with 5:1 as module:unit id pair + * // + * MIPI_SYST_SET_MODULE_UNIT(svh, 5, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(h, module, unit) \ +do { \ + if (h) { \ + (h)->systh_tag.et_guid = 0; \ + (h)->systh_tag.et_modunit = \ + _MIPI_SYST_MK_MODUNIT_ORIGIN((module), (unit)); \ + } \ +} while (0) + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + +/** + * Change GUID and unit ID of the given SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param guid mipi_syst_guid data structure + * @param unit unit id (0x0..0xF) + * + * @see mipi_syst_msg_tag + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * // + * static const struct mipi_syst_guid guid = + * MIPI_SYST_GEN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35); + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with GUID and 1 as unit id + * // + * MIPI_SYST_SET_HANDLE_GUID_UNIT(svh, guid, 1); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(h, guid, unit) \ +do { \ + if (h) { \ + (h)->systh_guid.u.ll[0] = MIPI_SYST_HTOLE64((guid).u.ll[0]); \ + (h)->systh_guid.u.ll[1] = MIPI_SYST_HTOLE64((guid).u.ll[1]); \ + (h)->systh_tag.et_modunit = (unit); \ + (h)->systh_tag.et_guid = 1;\ + } \ +} while (0) + + /** + * Change message origin using mipi_sys_t_origin structure + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param o origin structure + * + * @see #MIPI_SYST_SET_HANDLE_GUID_UNIT mipi_syst_origin + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * // Define origin used by this example as the message client ID + * // + * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with GUID and 1 as unit id + * // + * MIPI_SYST_SET_HANDLE_ORIGIN(svh, origin); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_ORIGIN(h, o) \ +do { \ + /* Guid byte 8 bit 7 indicates if full GUID or \ + * short module header is used. This bit is never \ + * 0 for RFC4122 compliant guids. \ + */ \ + if (0 != ((o).guid.u.b[8] & 0x80)) { \ + MIPI_SYST_SET_HANDLE_GUID_UNIT( \ + (h), \ + (o).guid, \ + (o).unit); \ + } else { \ + MIPI_SYST_SET_HANDLE_MODULE_UNIT( \ + (h), \ + (o).guid.u.b[8], \ + (o).unit); \ + } \ +} while(0) + +#else +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, g, u) \ +CFG_ERROR_SET_HANDLE_GUID_UNIT_WITHOUT_MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/** + * Enable protocol specific time stamp support on this SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable, 1 enable + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + + * MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(svh, 1); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h, v) \ + ((h) && ((h)->systh_tag.et_timestamp = (v) ? 1 : 0)) + +/** + * Get timestamp generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_TIMESTAMP(svh)) { + * // timestamp enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_TIMESTAMP(h) \ + (((h) && (h)->systh_tag.et_timestamp) ? 1 : 0) + +#else +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h,v ) \ +CFG_ERROR_MIPI_SYST_ENABLE_HANDLE_TIMESTAMP_WITHOUT_MIPI_SYST_PCFG_ENABLE_TIMESTAMP +#endif + + + +/** + * Delete a SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // ... + * + * MIPI_SYST_DELETE_HANDLE(svh); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DELETE_HANDLE(h) \ + mipi_syst_delete_handle(h) + +/** @} */ + +/** + * Pass null to instrumentation API to skip location information generation. + */ +#define MIPI_SYST_NOLOCATION (struct mipi_syst_msglocation *)0 + +/** + * @defgroup WriteAPI Raw Data Writing Macros + * @ingroup ApiSets + * + * Raw data writing macros: + * @{ + */ + +/** + * Send short data message with 28-bit payload.<BR> + * + * This API is indented for space and speed restricted environments that + * cannot support the more complex message types. + * @param h mipi_syst_handle* SyS-T handle + * @param v 28-bit output value. The upper 4 bits of the parameter value + * are discarded + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define INIT_START 1 + * #define INIT_DONE 2 + * + * foo() + * { + * MIPI_SYST_SHORT32(svh, INIT_START); + * // processing .. + * // + * + * MIPI_SYST_SHORT32(svh, INIT_DONE); + * // .. + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SHORT32(h, v) \ + MIPI_SYST_OUTPUT_D32MTS(h,\ + (((v)<<4) | (mipi_syst_u32)MIPI_SYST_TYPE_SHORT32)) + +/** + * Send short data message with 60-bit payload.<BR> + * + * This API is indented for space and speed restricted environments that + * cannot support the more complex message types. + * @param h mipi_syst_handle* SyS-T handle + * @param v 60-bit output value. The upper 4 bits of the parameter value + * are discarded. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define INIT_START 1 + * #define INIT_DONE 2 + * + * foo() + * { + * MIPI_SYST_SHORT64(svh, INIT_START); + * // processing .. + * // + * + * MIPI_SYST_SHORT64(svh, INIT_DONE); + * // .. + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SHORT64(h, v) \ + MIPI_SYST_OUTPUT_D64MTS(h,\ + (((v)<<4) | (mipi_syst_u64)MIPI_SYST_TYPE_SHORT64)) + + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + +/** + * Send a timesync Message that helps the decode Software to synchronize the + * transport protocol clock value (e.g., the MIPI STP timestamp) with trace + * hardware generated clocks. This API depends on the platform define + * #MIPI_SYST_PCFG_ENABLE_TIMESTAMP. + * @param h mipi_syst_handle* SyS-T handle + * @param c 64-bit clock value from message timestamp clock + * @param f 64-bit message timestamp clock frequency value in Herz + */ +#define MIPI_SYST_CLOCK_SYNC(h, c, f)\ + mipi_syst_write_clock((h),\ + MIPI_SYST_NOLOCATION,\ + MIPI_SYST_CLOCK_TRANSPORT_SYNC,\ + (c),\ + (f)) + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_clock(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_clock fmt, + mipi_syst_u64 clock, + mipi_syst_u64 freq); +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) + +/** + * Send raw data message with user defined payload.<BR> + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id 8-bit message protocol ID. This ID is used to identify + * the data protocol in the payload of this message for pretty + * printing in trace decoders. The protocol ID must uniquely + * identify the contents within the SyS-T handle's + * #mipi_syst_msg_tag.et_modunit id or + * #mipi_syst_handle.systh_guid value. The protocol decoder + * uses this value to route data from `MIPI_SYST_WRITE()` calls + * to other cascaded decoders to actually + * process the contents. + * @param p pointer to raw data to send + * @param len 16-bit length of data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // emit raw data under user defined decode ID 5 + * // + * unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; + * + * MIPI_SYST_WRITE(systh, MIPI_SYST_SEVERITY_INFO, 5, data, sizeof(data)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_WRITE(h, sev, id, p, len) \ + mipi_syst_write_raw_message((h), \ + MIPI_SYST_NOLOCATION, (sev), (id), (p), (len)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +/** @copydoc MIPI_SYST_WRITE(h, sev, id, p, len) */ +#define MIPI_SYST_WRITE_LOCADDR(h, sev, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_address_location((h), mipi_syst_return_addr()),\ + (sev), (id), (p), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +/** +* Send raw data message with user defined payload.<BR> +* +* @param h mipi_syst_handle* SyS-T handle +* @param sev mipi_syst_severity severity level (0..7) +* @param file file ID as 16-bit value +* @param id 8-bit message protocol ID. This ID is used to identify +* the data protocol in the payload of this message for pretty +* printing in trace decoders. The protocol ID must uniquely +* identify the contents within the SyS-T handle's +* #mipi_syst_msg_tag.et_modunit id or +* #mipi_syst_handle.systh_guid value. The protocol decoder +* uses this value to route data from `MIPI_SYST_WRITE()` calls +* to other cascaded decoders to actually +* process the contents. +* @param p pointer to raw data to send +* @param len 16-bit length of data to send +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* #define THIS_FILE 100 +* +* // emit raw data under user defined decode ID 5 +* // +* unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; +* +* MIPI_SYST_WRITE_LOC16(systh, MIPI_SYST_SEVERITY_INFO, + THIS_FILE, 5, data, sizeof(data)); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_WRITE_LOC16(h, sev, file, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id), (p), (len)) + +/** +* Send raw data message with user defined payload.<BR> +* +* @param h mipi_syst_handle* SyS-T handle +* @param sev mipi_syst_severity severity level (0..7) +* @param file file ID as 32-bit value +* @param id 8-bit message protocol ID. This ID is used to identify +* the data protocol in the payload of this message for pretty +* printing in trace decoders. The protocol ID must uniquely +* identify the contents within the SyS-T handle's +* #mipi_syst_msg_tag.et_modunit id or +* #mipi_syst_handle.systh_guid value. The protocol decoder +* uses this value to route data from `MIPI_SYST_WRITE()` calls +* to other cascaded decoders to actually +* process the contents. +* @param p pointer to raw data to send +* @param len 16-bit length of data to send +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* #define THIS_FILE 100 +* +* // emit raw data under user defined decode ID 5 +* // +* unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; +* +* MIPI_SYST_WRITE_LOC16(systh, MIPI_SYST_SEVERITY_INFO, +THIS_FILE, 5, data, sizeof(data)); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_WRITE_LOC32(h, sev, file, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id), (p), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_raw_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u8 subtype, + const void *data, mipi_syst_u16 length); + +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) */ + +/** +* @defgroup BuildAPI Build Number Message Macros +* @ingroup ApiSets +* +* Build Number writing macros: +* @{ +*/ +/** + +* Send compact client build number message with 22-bit payload.<BR> +* +* This API is indented for space and speed restricted environments that +* cannot support the more complex message types. +* @param h mipi_syst_handle* SyS-T handle +* @param n 22-bit output value. The upper 10 bits of the parameter value +* are discarded. +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* #define MY_BUILDID 0x3FFFFF +* +* foo() +* { +* MIPI_SYST_BUILD_COMPACT32(svh, MY_BUILDID); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_BUILD_COMPACT32(h, n) \ + if (h) { MIPI_SYST_OUTPUT_D32MTS(h, (\ + (((n) & 0x000FFFFF) << 4) | \ + ((n) & 0xFFF00000) << 10));} + +/** +* Send compact client build number message with 54-bit payload.<BR> +* +* This API is indented for space and speed restricted environments that +* cannot support the more complex message types. +* @param h mipi_syst_handle* SyS-T handle +* @param n 54-bit output value. The upper 10 bits of the parameter value +* are discarded. +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* #define MY_BUILDID 0x3FFFFFFFFFFFFFull +* +* foo() +* { +* MIPI_SYST_BUILD_COMPACT64(svh, MY_BUILDID); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_BUILD_COMPACT64(h, n) \ + if (h) { MIPI_SYST_OUTPUT_D64MTS(h, (\ + (0x00000000001000000ull | \ + ((n) & 0x00000000000FFFFFull) << 4) | \ + ((n) & 0xFFFFFFFFFFF00000ull) << 10));} + + +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + +/** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD(systh, MIPI_SYST_SEVERITY_INFO, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD(h, sev, bld, txt, len) \ + mipi_syst_write_build_message((h), \ + MIPI_SYST_NOLOCATION, (sev), (bld), (txt), (len)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOCADDR(h, sev, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_address_location((h), mipi_syst_return_addr()),\ + (sev), (bld), (txt), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param bld 64-bit build ID. + * @param txt pointer to textual textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOC16(h, sev, file, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (bld), (txt), (len)) + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOC32(h, sev, file, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (bld), (txt), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_build_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + const char *text, mipi_syst_u16 length); +#endif /* defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) */ + +/* public API prototypes */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_init(struct mipi_syst_header* header, mipi_syst_inithook_t pfinit, + const void * init_data); +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_destroy(struct mipi_syst_header* + header, + mipi_syst_destroyhook_t + pfdestroy); +MIPI_SYST_EXPORT struct mipi_syst_handle* MIPI_SYST_CALLCONV +mipi_syst_init_handle(struct mipi_syst_header* header, struct mipi_syst_handle* svh, + const struct mipi_syst_origin *origin, + mipi_syst_u32 heap); +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_delete_handle(struct mipi_syst_handle* + svh); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +MIPI_SYST_EXPORT void *MIPI_SYST_CALLCONV mipi_syst_return_addr(void); +#endif + +/* Inline helper functions + * These functions are only attempted to be inlined if the define + * MIPI_SYST_PCFG_ENABLE_INLINE is defined. + * Undefining it causes true functions calls to be used instead. + * This is useful if saving code space matters more then speed. + */ +#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#include "./inline.h" +#else +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location32(struct mipi_syst_handle* h, mipi_syst_u16 f, + mipi_syst_u16 l); +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location64(struct mipi_syst_handle* h, mipi_syst_u32 f, + mipi_syst_u32 l); +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_address_location(struct mipi_syst_handle* h, void *p); + +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param0(struct mipi_syst_handle* h); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV +mipi_syst_make_param1(struct mipi_syst_handle* h, mipi_syst_u32 p1); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV +mipi_syst_make_param2(struct mipi_syst_handle* h, mipi_syst_u32 p1, + mipi_syst_u32 p2); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param3(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param4(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param5(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param6(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5, + mipi_syst_u32 p6); +#endif + + +#if defined(MIPI_SYST_PCFG_ENABLE_STRING_API) + +#define _MIPI_SYST_ASSERT_DEBUG_STRING(cond) \ + MIPI_SYST_FILE ":" _MIPI_SYST_CPP_TOSTR(MIPI_SYST_LINE) " " #cond + +/** + * @defgroup StringAPI String Generating Macros + * @ingroup ApiSets + * + * String generating macros: + * @{ + */ + +/** + * Send UTF-8 character string with given severity and length.<BR> + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0xabdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG(systh, MIPI_SYST_SEVERITY_INFO, str, strlen(str)); + * MIPI_SYST_DEBUG_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG(h, severity, str, len) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + +/** + * Send function enter string message. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER(systh, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT(systh, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_ENTER(h, severity) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** + * Send function exit string message. + * The payload is the UTF-8 function name of the surrounding function + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER(systh, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT(systh, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_EXIT(h, severity) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** + * Send assertion notice string message if the passed condition is false. + * The notice includes the failing expression string as its payload. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param cond boolean condition to verify + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo(void * p) + * { + * MIPI_SYST_ASSERT(systh, MIPI_SYST_SEVERITY_ERROR, p != NULL); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ASSERT(h, severity, cond) \ + {\ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + MIPI_SYST_NOLOCATION,\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send UTF-8 character string with given severity and length.<BR> + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0xabdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG_LOC16(systh, MIPI_SYST_SEVERITY_INFO, FILE_ID, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG_LOC16(h, severity, file, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + /** + * Send UTF-8 character string with given severity and length.<BR> + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 32-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0x0000abdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG_LOC32(systh, MIPI_SYST_SEVERITY_INFO, FILE_ID, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG_LOC32(h, severity, file, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + + /** + * Send function enter string message. + * The payload is the UTF-8 function name of the surrounding function. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_ENTER_LOC16(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + + /** + * Send function exit string message. + * The payload is the UTF-8 function name of the surrounding function. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_EXIT_LOC16(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** +* Send assertion notice string message if the passed condition is false. +* The notice includes the failing expression string as its payload. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 16-bit user defined file ID +* @param cond boolean condition to verify +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo(void * p) +* { +* MIPI_SYST_ASSERT(systh, 1, MIPI_SYST_SEVERITY_ERROR, p != NULL); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_ASSERT_LOC16(h, severity, file, cond) \ + {\ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } +/** +* Send function enter string message. +* The payload is the UTF-8 function name of the surrounding function. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_ENTER_LOC32(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) +/** +* Send function exit string message. +* The payload is the UTF-8 function name of the surrounding function. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_EXIT_LOC32(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) +/** +* Send assertion notice string message if the passed condition is false. +* The notice includes the failing expression string as its payload. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* @param cond boolean condition to verify +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo(void * p) +* { +* MIPI_SYST_ASSERT(systh, 1, MIPI_SYST_SEVERITY_ERROR, p != NULL); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_ASSERT_LOC32(h, severity, file, cond) \ + { \ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +/** @copydoc MIPI_SYST_DEBUG */ +#define MIPI_SYST_DEBUG_LOCADDR(h, severity, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + +/** +* Send function enter string message. +* The payload is the UTF-8 function name of the surrounding function. + +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_ENTER_LOCADDR(h, severity) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** +* Send function exit string message. The payload is the UTF-8 function name +* of the surrounding function +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_EXIT_LOCADDR(h, severity) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** @copydoc MIPI_SYST_ASSERT(svh, severity) */ +#define MIPI_SYST_ASSERT_LOCADDR(h, severity, cond) \ + { \ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_debug_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_string type, + enum mipi_syst_severity severity, + mipi_syst_u16 len, const char *str); + +#endif /* defined (MIPI_SYST_PCFG_ENABLE_STRING_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +/** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF(h, severity, str, ...) \ + mipi_syst_write_printf_string((h), MIPI_SYST_NOLOCATION, \ + (severity),\ + (str),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOC16(h, severity, file, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (str),\ + ##__VA_ARGS__) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 32-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOC32(h, severity, file, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (str),\ + ##__VA_ARGS__) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOCADDR(h, severity, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (str),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + const char *fmt, + ...); +#endif /* MIPI_SYST_PCFG_ENABLE_PRINTF_API */ + +/** @} */ + +/** Parameter encoding values for vararg style catalog APIs + */ +enum mipi_syst_catalog_parameter_types { + _MIPI_SYST_CATARG_END = 0, /**< end of parameter list */ + _MIPI_SYST_CATARG_D = 1, /**< int like %d */ + _MIPI_SYST_CATARG_LD = 2, /**< long like %ld */ + _MIPI_SYST_CATARG_LLD = 3, /**< long long like %lld */ + _MIPI_SYST_CATARG_ZD = 4, /**< size_t like %z */ + _MIPI_SYST_CATARG_TD = 5, /**< ptrdiff_t like %t */ + _MIPI_SYST_CATARG_F = 6, /**< double like %f */ + _MIPI_SYST_CATARG_LF = 7, /**< long double like %lf */ + _MIPI_SYST_CATARG_C = 8, /**< char like %c */ + _MIPI_SYST_CATARG_HHD = 9, /**< short like %hhd */ + _MIPI_SYST_CATARG_LC = 10, /**< long char like %lc */ + _MIPI_SYST_CATARG_P = 11, /**< void * like %p or %n */ + _MIPI_SYST_CATARG_CSTR = 12 /**< char * like %s */ +}; +#define _MIPI_SYST_MK_PARAM_LIST(tag, p) _MIPI_SYST_CATARG_##tag, p + +#define MIPI_SYST_PARAM_INT(p) _MIPI_SYST_MK_PARAM_LIST(D, (p)) /**< int like %d */ +#define MIPI_SYST_PARAM_LONG(p) _MIPI_SYST_MK_PARAM_LIST(LD, (p)) /**< long like %ld */ +#define MIPI_SYST_PARAM_LONGLONG(p) _MIPI_SYST_MK_PARAM_LIST(LLD, (p)) /**< long long like %lld */ +#define MIPI_SYST_PARAM_SIZE_T(p) _MIPI_SYST_MK_PARAM_LIST(ZD, (p)) /**< size_t like %z */ +#define MIPI_SYST_PARAM_PTRDIFF_T(p) _MIPI_SYST_MK_PARAM_LIST(TD, (p)) /**< ptrdiff_t like %t */ +#define MIPI_SYST_PARAM_FLOAT(p) _MIPI_SYST_MK_PARAM_LIST(F, (p)) /**< float like %f */ +#define MIPI_SYST_PARAM_DOUBLE(p) _MIPI_SYST_MK_PARAM_LIST(F, (p)) /**< double like %f */ +#define MIPI_SYST_PARAM_LONGDOUBLE(p) _MIPI_SYST_MK_PARAM_LIST(LF, (p)) /**< long double like %lf */ +#define MIPI_SYST_PARAM_CHAR(p) _MIPI_SYST_MK_PARAM_LIST(C, (p)) /**< char like %c */ +#define MIPI_SYST_PARAM_SHORT(p) _MIPI_SYST_MK_PARAM_LIST(HHD, (p)) /**< short like %hhd */ +#define MIPI_SYST_PARAM_WCHAR(p) _MIPI_SYST_MK_PARAM_LIST(LC, (p)) /**< long char like %lc */ +#define MIPI_SYST_PARAM_PTR(p) _MIPI_SYST_MK_PARAM_LIST(P, (p)) /**< void * like %p or %n */ +#define MIPI_SYST_PARAM_CSTR(p) _MIPI_SYST_MK_PARAM_LIST(CSTR, (p)) /**< char * like %s */ + +/** + * @defgroup CatAPI64 64-Bit Catalog Message Macros + * @ingroup ApiSets + * + * Catalog message instrumentation API + * + * Note: This API set is enabled or disabled by the + * #MIPI_SYST_PCFG_ENABLE_CATID64_API and/or #MIPI_SYST_PCFG_ENABLE_CATID32_API + * platform feature defines. + * @{ + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +/** + * Send catalog message with 0-6 parameters.<BR> + * This family of Macros is used to send 32 or 64-bit wide catalog + * message IDs with up to six 32-bit wide parameters into the trace stream. + * The macro names are encoded in the following way: + * MIPI_SYST_CATALOG{ID-WIDTH}_{PARAMETER-COUNT} + * + * Example: A 32-bit ID using catalog function with 3 parameters whould be + * called MIPI_SYST_CATALOG32_3. + * + * @param svh mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id catalog ID + * + * Up to 6 32-Bit numeric parameter follow the catalog ID. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // emit plain catalog id (no parameter) + * // + * MIPI_SYST_CATALOG32_0(svh, MIPI_SYST_SEVERITY_ERROR, MSGID_INIT_FAIL); + * + * // catalog id with one parameter + * // + * MIPI_SYST_CATALOG32_1(svh, MIPI_SYST_SEVERITY_INFO, MSGID_SETLEVEL, 0x3); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_0(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_1(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +#define MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#define MIPI_SYST_CATALOG64_0_LOC16(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOC16(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOC16(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOC16(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOC16(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) + +#define MIPI_SYST_CATALOG64_0_LOC32(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOC32(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOC32(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOC32(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOC32(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +/** + * Send vararg catalog message + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64(svh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64(svh, severity, id, ...) \ + mipi_syst_write_printf_catalog64((svh), MIPI_SYST_NOLOCATION, \ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END) + + #if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send vararg catalog message + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOC16(svh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOC16(svh, severity, file, id, ...) \ + mipi_syst_write_printf_catalog64((svh), \ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOC32(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog64((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOCADDR(h, severity, id, ...) \ + mipi_syst_write_printf_catalog64((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + + +/** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64(svh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64(svh, severity, id, fmt, ...) \ + MIPI_SYST_CATALOG64((svh),\ + (severity),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10 + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOC16(h, severity, file, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOC16((h),\ + (severity),\ + (file),\ + (id),\ + ##__VA_ARGS__) + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOC32(h, severity, file, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOC32((h),\ + (severity),\ + (file),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOCADDR(h, severity, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOCADDR((h),\ + (severity),\ + (id),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_catalog64(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + ...); +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) */ + +/** @} */ + +/* API function prototypes */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog64_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 catid); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) +/** + * @defgroup CatAPI32 32-Bit Catalog Message Macros + * @ingroup ApiSets + * + * Catalog message instrumentation API + * @{ + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) +/** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32(h, severity, id, ...) \ + mipi_syst_write_printf_catalog32((h), MIPI_SYST_NOLOCATION, \ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END) + + #if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOC16(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOC32(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOCADDR(h, severity, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32(h, sev, id, fmt, ...) \ + MIPI_SYST_CATALOG32((h),\ + (sev),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOC16(h, sev, file, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOC16((h),\ + (sev),\ + (file),\ + (id),\ + ##__VA_ARGS__) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOC32(h, sev, file, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOC32((h),\ + (sev),\ + (id),\ + (file),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOCADDR(h, sev, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOCADDR((h),\ + (sev),\ + (id),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_catalog32(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 id, + ...); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) */ + +/** @copydoc MIPI_SYST_CATALOG64_0 */ +#define MIPI_SYST_CATALOG32_0(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_1(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +#define MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#define MIPI_SYST_CATALOG32_0_LOC16(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOC16(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOC16(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOC16(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOC16(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) + +#define MIPI_SYST_CATALOG32_0_LOC32(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOC32(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOC32(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOC32(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOC32(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog32_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 catid); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) */ + + + +#endif /* !MIPI_SYST_DISABLE_ALL */ + +/* Define undefined API's to nothing. This ensures source compatibility + * independent of the SyS-T feature configuration. + */ +#ifndef MIPI_SYST_INIT +#define MIPI_SYST_INIT(f, p) +#endif + +#ifndef MIPI_SYST_SHUTDOWN +#define MIPI_SYST_SHUTDOWN(x) +#endif + +#ifndef MIPI_SYST_INIT_HANDLE +#define MIPI_SYST_INIT_HANDLE(h, p) (struct mipi_syst_handle*)0 +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_CHECKSUM +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_CHECKSUM +#define MIPI_SYST_GET_HANDLE_CHECKSUM(h) 0 +#endif +#ifndef MIPI_SYST_ENABLE_HANDLE_COUNTER +#define MIPI_SYST_ENABLE_HANDLE_COUNTER(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_COUNTER +#define MIPI_SYST_GET_HANDLE_COUNTER(h) 0 +#endif +#ifndef MIPI_SYST_SET_HANDLE_MODULE_UNIT +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(p, m, u) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_GUID_UNIT +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, g, u) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_TIMESTAMP +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_TIMESTAMP +#define MIPI_SYST_GET_HANDLE_TIMESTAMP(h) 0 +#endif + +#ifndef MIPI_SYST_INIT +#define MIPI_SYST_INIT(f, p) +#endif + +#ifndef MIPI_SYST_SHUTDOWN +#define MIPI_SYST_SHUTDOWN() +#endif + +#ifndef MIPI_SYST_INIT_HANDLE +#define MIPI_SYST_INIT_HANDLE(h, p) +#endif + +#ifndef MIPI_SYST_ALLOC_HANDLE +#define MIPI_SYST_ALLOC_HANDLE(p) (struct mipi_syst_handle*)0 +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_CHECKSUM +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h,v) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_COUNTER +#define MIPI_SYST_ENABLE_HANDLE_COUNTER(h,v) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_LENGTH +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h,v) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_MODULE_UNIT +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(p, m, u) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_GUID_UNIT +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, o, u) +#endif + +#ifndef MIPI_SYST_SHORT32 +#define MIPI_SYST_SHORT32(h, v) +#endif + +#ifndef MIPI_SYST_WRITE +#define MIPI_SYST_WRITE(h, sev, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOCADDR +#define MIPI_SYST_WRITE_LOCADDR(h, sev, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOC16 +#define MIPI_SYST_WRITE_LOC16(h, sev, f, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOC32 +#define MIPI_SYST_WRITE_LOC32(h, sev, f, id, p, len) +#endif + +#ifndef MIPI_SYST_DELETE_HANDLE +#define MIPI_SYST_DELETE_HANDLE(h) +#endif + +#ifndef MIPI_SYST_DEBUG +#define MIPI_SYST_DEBUG(svh, sev, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOCADDR +#define MIPI_SYST_DEBUG_LOCADDR(svh, sev, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOC16 +#define MIPI_SYST_DEBUG_LOC16(svh, sev, file, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOC32 +#define MIPI_SYST_DEBUG_LOC32(svh, sev, file, str, len) +#endif +#ifndef MIPI_SYST_FUNC_ENTER +#define MIPI_SYST_FUNC_ENTER(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOCADDR +#define MIPI_SYST_FUNC_ENTER_LOCADDR(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOC16 +#define MIPI_SYST_FUNC_ENTER_LOC16(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOC32 +#define MIPI_SYST_FUNC_ENTER_LOC32(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_EXIT +#define MIPI_SYST_FUNC_EXIT(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOCADDR +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOCADDR +#define MIPI_SYST_FUNC_EXIT_LOCADDR(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOC16 +#define MIPI_SYST_FUNC_EXIT_LOC16(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOC32 +#define MIPI_SYST_FUNC_EXIT_LOC32(svh, sev, file) +#endif +#ifndef MIPI_SYST_ASSERT +#define MIPI_SYST_ASSERT(svh, sev, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOC16 +#define MIPI_SYST_ASSERT_LOC16(svh, sev, file, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOC32 +#define MIPI_SYST_ASSERT_LOC32(svh, sev, file, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOCADDR +#define MIPI_SYST_ASSERT_LOCADDR(svh, sev, cond) +#endif + +#ifndef MIPI_SYST_CATALOG32_0 +#define MIPI_SYST_CATALOG32_0(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1 +#define MIPI_SYST_CATALOG32_1(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2 +#define MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3 +#define MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4 +#define MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5 +#define MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6 +#define MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOCADDR +#define MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOCADDR +#define MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOCADDR +#define MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOCADDR +#define MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOCADDR +#define MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOCADDR +#define MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOCADDR +#define MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOC16 +#define MIPI_SYST_CATALOG32_0_LOC16(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOC16 +#define MIPI_SYST_CATALOG32_1_LOC16(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOC16 +#define MIPI_SYST_CATALOG32_2_LOC16(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOC16 +#define MIPI_SYST_CATALOG32_3_LOC16(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOC16 +#define MIPI_SYST_CATALOG32_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOC16 +#define MIPI_SYST_CATALOG32_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOC16 +#define MIPI_SYST_CATALOG32_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOC32 +#define MIPI_SYST_CATALOG32_0_LOC32(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOC32 +#define MIPI_SYST_CATALOG32_1_LOC32(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOC32 +#define MIPI_SYST_CATALOG32_2_LOC32(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOC32 +#define MIPI_SYST_CATALOG32_3_LOC32(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOC32 +#define MIPI_SYST_CATALOG32_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOC32 +#define MIPI_SYST_CATALOG32_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOC32 +#define MIPI_SYST_CATALOG32_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0 +#define MIPI_SYST_CATALOG64_0(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1 +#define MIPI_SYST_CATALOG64_1(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2 +#define MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3 +#define MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4 +#define MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5 +#define MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6 +#define MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOCADDR +#define MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOCADDR +#define MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOCADDR +#define MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOCADDR +#define MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOCADDR +#define MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOCADDR +#define MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOCADDR +#define MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOC16 +#define MIPI_SYST_CATALOG64_0_LOC16(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOC16 +#define MIPI_SYST_CATALOG64_1_LOC16(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOC16 +#define MIPI_SYST_CATALOG64_2_LOC16(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOC16 +#define MIPI_SYST_CATALOG64_3_LOC16(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOC16 +#define MIPI_SYST_CATALOG64_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOC16 +#define MIPI_SYST_CATALOG64_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOC16 +#define MIPI_SYST_CATALOG64_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOC32 +#define MIPI_SYST_CATALOG64_0_LOC32(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOC32 +#define MIPI_SYST_CATALOG64_1_LOC32(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOC32 +#define MIPI_SYST_CATALOG64_2_LOC32(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOC32 +#define MIPI_SYST_CATALOG64_3_LOC32(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOC32 +#define MIPI_SYST_CATALOG64_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOC32 +#define MIPI_SYST_CATALOG64_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOC32 +#define MIPI_SYST_CATALOG64_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CLOCK_SYNC +#define MIPI_SYST_CLOCK_SYNC(h,c,f) +#endif + +#ifndef MIPI_SYST_PRINTF +#define MIPI_SYST_PRINTF(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOC16 +#define MIPI_SYST_PRINTF_LOC16(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOC32 +#define MIPI_SYST_PRINTF_LOC32(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOCADDR +#define MIPI_SYST_PRINTF_LOCADDR(...) +#endif + +#ifndef MIPI_SYST_CATPRINTF64 +#define MIPI_SYST_CATPRINTF64(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOC16 +#define MIPI_SYST_CATPRINTF64_LOC16(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOC32 +#define MMIPI_SYST_CATPRINTF64_LOC32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOCADDR +#define MIPI_SYST_CATPRINTF64_LOCADDR(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32 +#define MIPI_SYST_CATPRINTF32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOC16 +#define MIPI_SYST_CATPRINTF32_LOC16(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOC32 +#define MMIPI_SYST_CATPRINTF32_LOC32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOCADDR +#define MIPI_SYST_CATPRINTF32_LOCADDR(...) +#endif + +/* Map CATPRINTF calls to their corresponding catalog APIs + * by dropping the format string parameter. + */ + /** + * @defgroup PrintfApi Printf style catalog Message Macros + * @ingroup ApiSets + * + * Printf style catalog message instrumentation API wrappers. + * The `MIPI_SYST_CATPRINTF{ID-WIDTH}_{PARAMETER-COUNT}` + * macros call their corresponding catalog API macro by dropping + * the format parameter. The API is intended to have + * printf style instrumentation inside the sources, but drop the format + * string during compilation and replace it with a catalog API call + * instead. Source scanning tools are used to extract the format strings + * from sources into catalog dictionary files. The dictionary files can + * then be used to reconstruct the printf formatting during trace decode + * time. This saves both space and execution time in the resulting + * application, and bandwidth over a trace link. + * + * This API set is enabled or disabled by the + * #MIPI_SYST_PCFG_ENABLE_CATID64_API and/or #MIPI_SYST_PCFG_ENABLE_CATID32_API + * platform feature defines. + * @{ + */ +#define MIPI_SYST_CATPRINTF32_0(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG32_0(svh, sev, id) +#define MIPI_SYST_CATPRINTF32_1(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF32_2(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOCADDR(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id) +#define MIPI_SYST_CATPRINTF32_1_LOCADDR(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOCADDR(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOCADDR(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOC16(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOC16(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF32_1_LOC16(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOC16(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOC16(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOC16(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOC16(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOC16(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOC32(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOC32(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF32_1_LOC32(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOC32(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOC32(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOC32(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOC32(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOC32(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG64_0(svh, sev, id) +#define MIPI_SYST_CATPRINTF64_1(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF64_2(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOCADDR(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id) +#define MIPI_SYST_CATPRINTF64_1_LOCADDR(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOCADDR(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOCADDR(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOC16(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOC16(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF64_1_LOC16(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOC16(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOC16(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOC16(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOC16(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOC16(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOC32(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOC32(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF64_1_LOC32(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOC32(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOC32(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOC32(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOC32(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOC32(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +/** @} */ + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif diff --git a/library/include/mipi_syst/compiler.h b/library/include/mipi_syst/compiler.h new file mode 100644 index 0000000..822642e --- /dev/null +++ b/library/include/mipi_syst/compiler.h @@ -0,0 +1,193 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Compiler specific defines */ + +#ifndef MIPI_SYST_COMPILER_INCLUDED +#define MIPI_SYST_COMPILER_INCLUDED + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(_WIN32) /* MSVC Compiler section */ + +/* basic integer types + */ +typedef __int8 mipi_syst_s8; +typedef __int16 mipi_syst_s16; +typedef __int32 mipi_syst_s32; +typedef __int64 mipi_syst_s64; + +typedef unsigned __int8 mipi_syst_u8; +typedef unsigned __int16 mipi_syst_u16; +typedef unsigned __int32 mipi_syst_u32; +typedef unsigned __int64 mipi_syst_u64; + +/* shared library import/export + */ +#if defined(MIPI_SYST_STATIC) +#define MIPI_SYST_EXPORT +#define MIPI_SYST_EXPORT +#else +#if defined(MIPI_SYST_EXPORTS) +#define MIPI_SYST_EXPORT __declspec(dllexport) +#else +#define MIPI_SYST_EXPORT __declspec(dllimport) +#endif +#endif + +#define MIPI_SYST_CALLCONV __stdcall + +/* Caution: Windows doesn't support attribute based shared library + * life time functions. Add these calls into a dllmain routine + * instead. + */ +#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR +#define MIPI_SYST_SHAREDLIB_DESTRUCTOR + +#define MIPI_SYST_FUNCTION_NAME __FUNCTION__ +#define MIPI_SYST_LINE __LINE__ +#define MIPI_SYST_FILE __FILE__ + +#if defined(NDEBUG) +#define _MIPI_SYST_OPTIMIZER_ON +#endif + +#define MIPI_SYST_CC_INLINE __inline + +/* Macros for byte swapping to little endian + * + * Assume this compiler is always little endian + */ +#define MIPI_SYST_HTOLE16(v) (v) +#define MIPI_SYST_HTOLE32(v) (v) +#define MIPI_SYST_HTOLE64(v) (v) + +/* HW CRC32C support ? */ +#if defined(MIPI_SYST_CRC_INTRINSIC_ON) +#define MIPI_SYST_CRC_INTRINSIC + +#include <intrin.h> +#define _MIPI_SYST_CPU_CRC8(crc, v) _mm_crc32_u8((crc), (v)) +#define _MIPI_SYST_CPU_CRC16(crc, v) _mm_crc32_u16((crc), (v)) +#define _MIPI_SYST_CPU_CRC32(crc, v) _mm_crc32_u32((crc), (v)) +#if defined(_WIN64) +#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)_mm_crc32_u64((crc), (v)) +#else +#define _MIPI_SYST_CPU_CRC64(crc, v) \ + _mm_crc32_u32(\ + _mm_crc32_u32((crc), (mipi_syst_u32)(v)), \ + ((mipi_syst_u32)((v)>> 32))\ + ) +#endif +#endif + +#elif defined(__GNUC__) /* GNU-C Compiler section */ + +/* basic integer types + */ +typedef char mipi_syst_s8; +typedef short mipi_syst_s16; +typedef int mipi_syst_s32; +typedef long long mipi_syst_s64; + +typedef unsigned char mipi_syst_u8; +typedef unsigned short mipi_syst_u16; +typedef unsigned int mipi_syst_u32; +typedef unsigned long long mipi_syst_u64; + +/* shared library related settings + */ +#define MIPI_SYST_EXPORT +#define MIPI_SYST_CALLCONV + +#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR __attribute__((constructor)) +#define MIPI_SYST_SHAREDLIB_DESTRUCTOR __attribute__((destructor)) + +#define MIPI_SYST_FUNCTION_NAME __PRETTY_FUNCTION__ +#define MIPI_SYST_LINE __LINE__ +#define MIPI_SYST_FILE __FILE__ +#define MIPI_SYST_CC_INLINE inline + +/* Macros for byte swapping to little endian + */ +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define MIPI_SYST_BIG_ENDIAN + +#define MIPI_SYST_HTOLE16(v) \ + ((((mipi_syst_u16)(v))>>8)|((((mipi_syst_u16)(v))&0xFF)<<8)) +#define MIPI_SYST_HTOLE32(v) \ + ((mipi_syst_u32)__builtin_bswap32((mipi_syst_u32)(v))) +#define MIPI_SYST_HTOLE64(v) \ + ((mipi_syst_u64)__builtin_bswap64((mipi_syst_u64)(v))) +#else +#define MIPI_SYST_HTOLE16(v) (v) +#define MIPI_SYST_HTOLE32(v) (v) +#define MIPI_SYST_HTOLE64(v) (v) +#endif + +#if defined(__OPTIMIZE__) +#define _MIPI_SYST_OPTIMIZER_ON +#endif + +/* HW CRC32C support ? */ +#if defined(MIPI_SYST_CRC_INTRINSIC_ON) +#define MIPI_SYST_CRC_INTRINSIC + +#define _MIPI_SYST_CPU_CRC8(crc, v) __builtin_ia32_crc32qi((crc), (v)) +#define _MIPI_SYST_CPU_CRC16(crc, v) __builtin_ia32_crc32hi((crc), (v)) +#define _MIPI_SYST_CPU_CRC32(crc, v) __builtin_ia32_crc32si((crc), (v)) +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)__builtin_ia32_crc32di((crc), (v)) +#else +#define _MIPI_SYST_CPU_CRC64(crc, v) \ + __builtin_ia32_crc32si (\ + __builtin_ia32_crc32si((crc), (mipi_syst_u32)(v)), \ + ((mipi_syst_u32)((v)>> 32))\ + ) +#endif +#endif +#else +#error unknown compiler, copy and adapt one of the sections above +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif diff --git a/library/include/mipi_syst/crc32.h b/library/include/mipi_syst/crc32.h new file mode 100644 index 0000000..108de54 --- /dev/null +++ b/library/include/mipi_syst/crc32.h @@ -0,0 +1,138 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Defines for CRC32C computation */ + +#ifndef MIPI_SYST_CRC32_INCLUDED +#define MIPI_SYST_CRC32_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + + +#if !defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + +#define MIPI_SYST_CRC32_INIT(v) +#define MIPI_SYST_CRC32_GET(v) + +#define MIPI_SYST_CRC32_U8(crc, v) +#define MIPI_SYST_CRC32_U16(crc, v) +#define MIPI_SYST_CRC32_U32(crc, v) +#define MIPI_SYST_CRC32_U64(crc, v) + +#else + +extern const mipi_syst_u32 mipi_syst_crc_table[256]; + +#define MIPI_SYST_CRC32_INIT(v) ((v) ^ 0xFFFFFFFF) +#define MIPI_SYST_CRC32_GET(v) ((v) ^ 0xFFFFFFFF) + +#define MIPI_SYST_CRC32_U8(crc, v) { crc = mipi_syst_crc32_8((crc), (v)); } +#define MIPI_SYST_CRC32_U16(crc, v) { crc = mipi_syst_crc32_16((crc), (v)); } +#define MIPI_SYST_CRC32_U32(crc, v) { crc = mipi_syst_crc32_32((crc), (v)); } +#define MIPI_SYST_CRC32_U64(crc, v) { crc = mipi_syst_crc32_64((crc), (v)); } + +#if !defined(MIPI_SYST_PCFG_ENABLE_INLINE) + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_8(mipi_syst_u32 crc, mipi_syst_u8 b); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_16(mipi_syst_u32 crc, mipi_syst_u16 hw); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_32(mipi_syst_u32 crc, mipi_syst_u32 hw); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_64(mipi_syst_u32 crc, mipi_syst_u64 hw); + +#else + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_8(mipi_syst_u32 crc, mipi_syst_u8 b) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC8(crc, b); +#else + return mipi_syst_crc_table[((int) crc ^ b) & 0xff] ^ (crc >> 8); +#endif +} + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_16(mipi_syst_u32 crc, mipi_syst_u16 s) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC16(crc, s); +#else + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) s); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (s >> 8)); + return crc; +#endif +} + + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_32(mipi_syst_u32 crc, mipi_syst_u32 w) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC32(crc, w); +#else + + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) w); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 8)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 16)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 24)); + return crc; +#endif +} + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_64(mipi_syst_u32 crc, mipi_syst_u64 l) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC64(crc, l); +#else + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) l); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 8)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 16)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 24)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 32)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 40)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 48)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 56)); + return crc; +#endif +} +#endif +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) */ + +#ifdef __cplusplus +} /* extern C */ +#endif + +#endif diff --git a/library/include/mipi_syst/inline.h b/library/include/mipi_syst/inline.h new file mode 100644 index 0000000..65996e7 --- /dev/null +++ b/library/include/mipi_syst/inline.h @@ -0,0 +1,245 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Instrumentation API inline code definitions */ + +#ifndef MIPI_SYST_INLINE_INCLUDED +#define MIPI_SYST_INLINE_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +/** + * Update File Location in syst handle + * @param h syst handle pointer + * @param f file id (16 bit) + * @param l line number in file (16 bit) + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location32(struct mipi_syst_handle* h, mipi_syst_u16 f, mipi_syst_u16 l) +{ + if (h) { + h->systh_location.el_format = 0; + h->systh_location.el_u.loc32.etls_source_location.etls_fileID = f; + h->systh_location.el_u.loc32.etls_source_location.etls_lineNo = l; + } + + return &h->systh_location; +} +/** + * Update File Location in syst handle + * @param h syst handle pointer + * @param f file id (32 bit) + * @param l line number in file (32 bit) + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location64(struct mipi_syst_handle* h, mipi_syst_u32 f, mipi_syst_u32 l) +{ + if (h) { + h->systh_location.el_format = 1; + h->systh_location.el_u.loc64.etls_source_location.etls_fileID = f; + h->systh_location.el_u.loc64.etls_source_location.etls_lineNo = l; + } + + return &h->systh_location; +} + +/** + * Update address Location in syst handle + * @param h syst handle pointer + * @param p address at instrumentation point + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_address_location(struct mipi_syst_handle* h, void *p) +{ + if (h) { +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + + h->systh_location.el_format = 3; + h->systh_location.el_u.loc64.etls_code_location = (mipi_syst_u64) p; +#else + h->systh_location.el_format = 2; + h->systh_location.el_u.loc32.etls_code_location = (mipi_syst_u32) p; +#endif + } + return &h->systh_location; +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** + * Setup handle for 0 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param0(struct mipi_syst_handle* h) +{ + if (h) + h->systh_param_count = 0; +} +/** + * Setup handle for 1 parameter passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param1(struct mipi_syst_handle* h, + mipi_syst_u32 p1) +{ + if (h) { + h->systh_param_count = 1; + h->systh_param[0] = p1; + } +} + +/** + * Setup handle for 2 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param2(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2) +{ + if (h) { + h->systh_param_count = 2; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + } +} + +/** + * Setup handle for 3 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param3(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3) +{ + if (h) { + h->systh_param_count = 3; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + } +} + +/** + * Setup handle for 4 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param4(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4) +{ + if (h) { + h->systh_param_count = 4; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + } +} + +/** + * Setup handle for 5 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param5(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5) +{ + if (h) { + h->systh_param_count = 5; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + h->systh_param[4] = p5; + } +} + +/** + * Setup handle for 6 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param6(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5, + mipi_syst_u32 p6) +{ + if (h) { + h->systh_param_count = 6; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + h->systh_param[4] = p5; + h->systh_param[5] = p6; + } +} + +/** + * Runtime computation of hash values for catalog message IDs. + * This function is used in debug builds to avoid a code explosion + * by the preprocessor method ( @see mipi_syst_hash_x65599 ). The + * preprocesssor methods does compute this value at compile time only + * if const expression optimisations are enabled. + */ +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_hash_x65599( + const char * p, mipi_syst_u32 length) +{ + mipi_syst_u32 hash; + mipi_syst_u8 c; + hash = 0; + + p += (length > 0x3F) ? (length-0x40): 0; + + while (0 != (c = *p++)) + { + hash = hash * 65599U + c; + } + + return hash; +} +#ifdef __cplusplus +} /* extern C */ +#endif + +#endif diff --git a/library/include/mipi_syst/message.h b/library/include/mipi_syst/message.h new file mode 100644 index 0000000..285512b --- /dev/null +++ b/library/include/mipi_syst/message.h @@ -0,0 +1,159 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Internal message storage buffering */ + +#ifndef MIPI_syst_msg_INCLUDED +#define MIPI_syst_msg_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Catalog ID container + */ +union mipi_syst_catid { + mipi_syst_u32 sci_32; + mipi_syst_u64 sci_64; +} ; + +/** + * SyS-T message descriptor + * + * This structure stores a SyS-T message in "logical" memory format. + * Logical means that all optional fields are present but not necessarily + * used. Variable length payloads are addressed through a pointer and + * are not copied into the structure. + */ + struct mipi_syst_msgdsc { + struct mipi_syst_msg_tag ed_tag; + /**< 32-bit message tag (mandatory) */ +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + struct mipi_syst_guid ed_guid; /**< origin GUID (optional) */ +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + struct mipi_syst_msglocation ed_loc; + /**< message source location (optional) */ +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + mipi_syst_u64 ed_ts; /**< protocol embedded time stamp */ +#endif + +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + mipi_syst_u16 ed_len; /**< variable payload length (optional) */ +#endif + + union { + struct { + mipi_syst_u64 id; + const void *text; + } data_version; + + struct { + union mipi_syst_catid id; + mipi_syst_u32 *param; + } data_catid; + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + mipi_syst_u64 data_clock[2]; +#endif + const void *data_var; /**< variable length payload */ + } ed_pld; + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + mipi_syst_u32 ed_chk; /**< message checksum (optional) */ +#endif +}; + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) +#define MIPI_SYST_EVDSC_MEMBER_OFF(m)\ + ((mipi_syst_u16)(mipi_syst_u64)&(((struct mipi_syst_msgdsc*)0)->m)) +#else +#define MIPI_SYST_EVDSC_MEMBER_OFF(m)\ + ((mipi_syst_u16)(mipi_syst_u32)&(((struct mipi_syst_msgdsc*)0)->m)) +#endif + +/** + * message scatter write operations + */ +enum u_syst_scatter_op { + MIPI_SYST_SCATTER_OP_SKIP = 0x00, + /**< skip sso_length bytes */ + + MIPI_SYST_SCATTER_OP_8BIT = 0x01, + /**< write sso_length times 8 bit */ + MIPI_SYST_SCATTER_OP_16BIT = 0x02, + /**< write sso_length times 16 bit */ + MIPI_SYST_SCATTER_OP_32BIT = 0x04, + /**< write sso_length times 32 bit */ + MIPI_SYST_SCATTER_OP_64BIT = 0x08, + /**< write sso_length times 64 bit */ + + MIPI_SYST_SCATTER_OP_BLOB = 0x10, + /**< write sso_length bytes that are + * accessed through a pointer */ + MIPI_SYST_SCATTER_OP_END = 0xFF + /**< end of scatter writer program */ +}; + +/** + * message scatter write instruction definition + */ +struct mipi_syst_scatter_prog { + mipi_syst_u8 sso_opcode; /**< scatter write operation + * @see u_syst_scatter_op */ + mipi_syst_u8 sso_offset; /**< data offset in message descriptor */ + mipi_syst_u16 sso_length; + /**< repeat count for sso_opcode */ +}; + +#define MIPI_SYST_SCATTER_PROG_LEN 10 /**< maximum needed scatter prog size */ + +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) +/* default scatter write routine */ +extern void mipi_syst_scatter_write(struct mipi_syst_handle* systh, + struct mipi_syst_scatter_prog* scatterprog, + const void *pdesc); +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif |