1 /*---------------------------------------------------------------------------*
2   Project:     Cafe
3   File:        OSSystemLog.h
4   Description: Public interface header for logging facility
5 
6   Copyright (C) 2012 Nintendo.  All rights reserved.
7 
8   These coded instructions, statements, and computer programs contain
9   proprietary information of Nintendo of America Inc. and/or Nintendo
10   Company Ltd., and are protected by Federal copyright law.  They may
11   not be disclosed to third parties or copied or duplicated in any form,
12   in whole or in part, without the prior written consent of Nintendo.
13 
14   *---------------------------------------------------------------------------*/
15 #ifndef __OSSYSTEMLOG_H__
16 #define __OSSYSTEMLOG_H__
17 
18 #include <types.h>
19 
20 #define OS_ATOMIC_DONT_INLINE
21 #include <cafe/os/OSAtomic.h>
22 #undef OS_ATOMIC_DONT_INLINE
23 #include <cafe/os/OSTime.h>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /*---------------------------------------------------------------------------*
30  *
31  *    Constants defined for this file
32  *    -- #Defines --
33  *
34  *---------------------------------------------------------------------------*/
35 /*
36  * Categories
37  */
38 #define OS_LOG_MAX_CATEGORIES    256
39 #define OS_LOG_CATEGORY_ALL      OS_LOG_MAX_CATEGORIES /* wildcard */
40 
41 /* These are all the usermode categories */
42 #define OS_LOG_CATEGORY_FIRST    0
43 #define OS_LOG_CATEGORY_OS       OS_LOG_CATEGORY_FIRST
44 #define OS_LOG_CATEGORY_OSREPORT 1
45 #define OS_LOG_CATEGORY_LOADER   2
46 #define OS_LOG_CATEGORY_APP      3
47 #define OS_LOG_CATEGORY_GFX      4
48 #define OS_LOG_CATEGORY_DRC      5
49 #define OS_LOG_CATEGORY_SOUND    6
50 #define OS_LOG_CATEGORY_FS       7
51 #define OS_LOG_CATEGORY_CUSTOM_RANGE_START 128
52     /*
53      * add more usermode log categories here...
54      */
55 #define OS_LOG_CATEGORY_LAST    (OS_LOG_MAX_CATEGORIES-1)
56 
57 
58 /*
59  * Levels
60  */
61 #define OS_LOG_LEVEL_NOISE     0
62 #define OS_LOG_LEVEL_NOTICE    1
63 #define OS_LOG_LEVEL_WARNING   2
64 #define OS_LOG_LEVEL_ERROR     3
65 #define OS_LOG_MAX_LEVELS      4
66 #define OS_LOG_LEVEL_DEFAULT   OS_LOG_LEVEL_NOISE /* default usermode log level */
67 
68     /* used by pretty print routines */
69 #define OS_LOG_LEVEL_NAMES  {"NOISE","NOTICE","WARNING","ERROR","!!!Invalid!!!"}
70 
71 /*
72  * useCase in OS_LOG_HEADER
73  */
74 #define OS_LOG_HEADER_USE_CASE_DEFAULT        0
75 #define OS_LOG_HEADER_USE_CASE_FUNC_ENTRY     1
76 #define OS_LOG_HEADER_USE_CASE_FUNC_EXIT      2
77 
78 /*
79  * dataFormat in OS_LOG_HEADER
80  */
81 #define OS_LOG_HEADER_PRINT_DATA_FORMAT       1
82 #define OS_LOG_HEADER_FILEFUNC_DATA_FORMAT    2
83 #define OS_LOG_HEADER_RAW_DATA_FORMAT         3
84 
85 /*
86  * Data Options Bit Definitions
87  */
88 #define OS_LOG_DATA_OPT_ARGC_SHIFT            0
89 #define OS_LOG_DATA_OPT_ARGC_MASK             (0xf<<OS_LOG_DATA_OPT_ARGC_SHIFT)
90 #define OS_LOG_DATA_OPT_DATA_FORMAT_SHIFT     4
91 #define OS_LOG_DATA_OPT_DATA_FORMAT_MASK      (0xf<<OS_LOG_DATA_OPT_DATA_FORMAT_SHIFT)
92 #define OS_LOG_DATA_OPT_PRINT_FORMAT_MASK     (OS_LOG_HEADER_PRINT_DATA_FORMAT<<OS_LOG_DATA_OPT_DATA_FORMAT_SHIFT)
93 #define OS_LOG_DATA_OPT_FILEFUNC_FORMAT_MASK  (OS_LOG_HEADER_FILEFUNC_DATA_FORMAT<<OS_LOG_DATA_OPT_DATA_FORMAT_SHIFT)
94 #define OS_LOG_DATA_OPT_RAW_FORMAT_MASK       (OS_LOG_HEADER_RAW_DATA_FORMAT<<OS_LOG_DATA_OPT_DATA_FORMAT_SHIFT)
95 #define OS_LOG_DATA_OPT_PRIVATE_SHIFT         8
96 #define OS_LOG_DATA_OPT_PRIVATE_MASK          (1<<OS_LOG_DATA_OPT_PRIVATE_SHIFT)
97 #define OS_LOG_DATA_OPT_FUNC_ENTER_SHIFT      9
98 #define OS_LOG_DATA_OPT_FUNC_ENTER_MASK       (1<<OS_LOG_DATA_OPT_FUNC_ENTER_SHIFT)
99 #define OS_LOG_DATA_OPT_FUNC_EXIT_SHIFT       10
100 #define OS_LOG_DATA_OPT_FUNC_EXIT_MASK        (1<<OS_LOG_DATA_OPT_FUNC_EXIT_SHIFT)
101 #define OS_LOG_DATA_OPT_KEY_ARG_SHIFT         11
102 #define OS_LOG_DATA_OPT_KEY_ARG_MASK          (1<<OS_LOG_DATA_OPT_KEY_ARG_SHIFT)
103 #define OS_LOG_DATA_OPT_CTX_ARG_SHIFT         12
104 #define OS_LOG_DATA_OPT_CTX_ARG_MASK          (1<<OS_LOG_DATA_OPT_CTX_ARG_SHIFT)
105 #define OS_LOG_DATA_OPT_DEFAULT_MASK          0x00000000
106 
107 /*
108  * Log Retrieval Options Bit Definitions, relevant only
109  * for OSLogReport()
110  */
111 #define OS_LOG_RETRIEVAL_OPT_DEFAULT_MASK                0
112 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE0_SHIFT         0
113 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE0_MASK          (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE0_SHIFT)
114 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE1_SHIFT         1
115 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE1_MASK          (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE1_SHIFT)
116 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE2_SHIFT         2
117 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE2_MASK          (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_CORE2_SHIFT)
118 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOISE_SHIFT    3
119 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOISE_MASK     (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOISE_SHIFT)
120 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOTICE_SHIFT   4
121 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOTICE_MASK    (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOTICE_SHIFT)
122 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_WARNING_SHIFT  5
123 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_WARNING_MASK   (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_WARNING_SHIFT)
124 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_ERROR_SHIFT    6
125 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_ERROR_MASK     (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_ERROR_SHIFT)
126 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_MASK           (OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOISE_MASK  | \
127                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_NOTICE_MASK | \
128                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_WARNING_MASK | \
129                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_USER_ERROR_MASK)
130 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOISE_SHIFT  7
131 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOISE_MASK   (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOISE_SHIFT)
132 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOTICE_SHIFT 8
133 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOTICE_MASK  (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOTICE_SHIFT)
134 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_WARNING_SHIFT 9
135 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_WARNING_MASK  (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_WARNING_SHIFT)
136 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_ERROR_SHIFT  10
137 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_ERROR_MASK   (1<<OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_ERROR_SHIFT)
138 #define OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_MASK         (OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOISE_MASK  | \
139                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_NOTICE_MASK | \
140                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_WARNING_MASK | \
141                                                           OS_LOG_RETRIEVAL_OPT_EXCLUDE_KERNEL_ERROR_MASK)
142 #define OS_LOG_RETRIEVAL_OPT_IGNORE_FILTERS_SHIFT        11
143 #define OS_LOG_RETRIEVAL_OPT_IGNORE_FILTERS_MASK         (1<<OS_LOG_RETRIEVAL_OPT_IGNORE_FILTERS_SHIFT)
144 #define OS_LOG_RETRIEVAL_OPT_IGNORE_SESSION_MISMATCH_SHIFT 12
145 #define OS_LOG_RETRIEVAL_OPT_IGNORE_SESSION_MISMATCH       (1<<OS_LOG_RETRIEVAL_OPT_IGNORE_SESSION_MISMATCH_SHIFT)
146 
147 /*
148  * Limitations
149  */
150 #define OS_LOG_FUNC_NAME_SIZE_LIMIT   32
151 #define OS_LOG_DATA_SIZE_LIMIT        (1024*1024)
152 #define OS_LOG_PRINTF_SIZE_LIMIT      128
153 #define OS_LOG_ENTRY_MAX_ARGS         8
154 
155 /*
156  * Macros
157  */
158 #define KLOG_MIN(x,y) (((x) < (y)) ? (x) : (y))
159 #define KLOG_MAX(x,y) (((x) > (y)) ? (x) : (y))
160 
161 /*---------------------------------------------------------------------------*
162  *
163  *    Data types defined for this file
164  *    -- Structs, Typedefs, Enums --
165  *
166  *---------------------------------------------------------------------------*/
167 
168     PACKED_STRUCT_BEGIN
169 
170     /* This structure is used for reporting a single log entry back to the user. */
171     typedef struct {
172         u32     size;       /* Size of this header and any associated data beyond,
173                                must be at least sizeof(OS_LOG_HEADER) to be valid */
174         u64     timeStamp;
175         u32     tag;
176         //
177         u32     session         : 8;
178         u32     seqByte         : 8;
179         u32     argc            : 4;
180         u32     keyArg          : 1;
181         u32     ctxArg          : 1;
182         u32     dataFormat      : 3;
183         u32     useCase         : 3;
184         u32     unused1         : 4;
185         //
186         u32     intEnabled      : 1;
187         u32     intPending      : 1;
188         u32     coreId          : 2;
189         u32     userMode        : 1;
190         u32     procId          : 6;
191         u32     procCfg         : 2;
192         u32     level           : 8;
193         u32     category        : 8;
194         u32     unused2         : 3;
195     }PACKED_STRUCT_ATTRIBUTE OS_LOG_ENTRY_HEADER;
196 
197     typedef union {
198         struct {
199             u32  key;
200             u32  arg0; /* start of arguments */
201         }PACKED_STRUCT_ATTRIBUTE keyOnly;
202         struct {
203             u32  ctx;
204             u32  arg0; /* start of arguments */
205         }PACKED_STRUCT_ATTRIBUTE ctxOnly;
206         struct {
207             u32  key;
208             u32  ctx;
209             u32  arg0; /* start of arguments */
210         }PACKED_STRUCT_ATTRIBUTE keyAndCtx;
211     }PACKED_STRUCT_ATTRIBUTE OS_LOG_ENTRY_PAYLOAD;
212 
213     typedef struct {
214         u16  lineNumber;
215         char funcName[OS_LOG_FUNC_NAME_SIZE_LIMIT];
216     }PACKED_STRUCT_ATTRIBUTE OS_LOG_ENTRY_FILEFUNC_DATA;
217 
218     typedef struct {
219         u32 category;
220         u32 level;
221     }PACKED_STRUCT_ATTRIBUTE OS_LOG_ENTRY_FILTER_POLICY;
222 
223     typedef struct {
224         u32                  totalSize;
225         u32                  numberOfEntries;
226         u32                  currentSession;
227         OS_LOG_ENTRY_HEADER  firstEntry;  /* the first of numberOfEntries */
228     }PACKED_STRUCT_ATTRIBUTE OS_LOG_RETRIEVAL;
229 
230     /* OSLogFunc() can generate this much total data */
231 #define OS_LOG_MAX_FILEFUNC_DATA_SIZE \
232   ((OS_LOG_ENTRY_MAX_ARGS*sizeof(u32)) + sizeof(OS_LOG_ENTRY_FILEFUNC_DATA))
233 
234     PACKED_STRUCT_END
235 
236 /*---------------------------------------------------------------------------*
237  *
238  *    -- Interface Function Prototypes --
239  *
240  *---------------------------------------------------------------------------*/
241     /* OS Log Utility */
242     void OSLogBuffer(u32 category, u32 level, u32 options, void* pBuffer,
243                      size_t size);
244     void OSLogArgs(u32 category, u32 level, u32 options, u32 seqByte,
245                    u32 arg0, u32 arg1, u32 arg2, u32 arg3);
246     void OSLogFunc(u32 category, u32 level, u32 options, const char* funcName,
247                    u32 funcNameSize, u32 lineNumber, u32* argv, u32 argc);
248     void OSLogPrintf (u32 category, u32 level, u32 options,
249                       const char * fmt, ...);
250     BOOL OSLogReport(u32 retrievalOptions, void* pWorkspace, u32 workSpaceSize);
251     BOOL OSLogRetrieve(u32 retrievalOptions, OS_LOG_RETRIEVAL* pRetrieval,
252                        u32 maxRetrievedSize);
253     BOOL OSLogSaveCrashDump(void);
254     void OSLogSetFilterPolicy(u32 category, u32 minimumLevel);
255 
256 /* Useful macros */
257 
258 #if APP_TRACE_ENABLED
259 
260     /*
261      * APP_KEYTRACE_xARG
262      * Sequence byte, key word and up to three arbitrary word arguments,
263      * uses only one block per entry.
264      */
265     #define APP_KEYTRACE_3ARG(_seqByte_,_key_,_arg0_,_arg1_,_arg2_)          \
266       OSLogArgs(OS_LOG_CATEGORY_OS,OS_LOG_LEVEL_NOTICE,                      \
267                 OS_LOG_DATA_OPT_KEY_ARG_MASK|3,(u32)(_seqByte_),             \
268                 (u32)(_key_),(u32)(_arg0_),(u32)(_arg1_),(u32)(_arg2_))
269     #define APP_KEYTRACE_2ARG(_seqByte_,_key_,_arg0_,_arg1_)                 \
270       OSLogArgs(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,                     \
271                 OS_LOG_DATA_OPT_KEY_ARG_MASK|2,                              \
272                (u32)(_seqByte_),(u32)(_key_),(u32)(_arg0_),(u32)(_arg1_),0)
273     #define APP_KEYTRACE_1ARG(_seqByte_,_key_,_arg0_)                        \
274       OSLogArgs(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,                     \
275                 OS_LOG_DATA_OPT_KEY_ARG_MASK|1,                              \
276                 (u32)(_seqByte_),(u32)(_key_),(u32)(_arg0_),0,0)
277     #define APP_KEYTRACE_0ARG(_seqByte_,_key_)                               \
278       OSLogArgs(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,                     \
279                 OS_LOG_DATA_OPT_KEY_ARG_MASK|0,                              \
280                 (u32)(_seqByte_),(u32)(_key_),0,0,0)
281 
282     /*
283      * APP_TRACE_xARG_OPT
284      * Logs function name, source file line number and up to eight arbitrary
285      * word arguments. Category, level and option fields are exposed as general parameters.
286      */
287     #define APP_TRACE_8ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,                 \
288                                _arg4_,_arg5_,_arg6_,_arg7_) {                                   \
289       u32 _args_[8];                                                                            \
290       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;_args_[3]=(u32)_arg3_;  \
291       _args_[4]=(u32)_arg4_;_args_[5]=(u32)_arg5_;_args_[6]=(u32)_arg6_;_args_[7]=(u32)_arg7_;  \
292       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
293                 sizeof(__FUNCTION__),__LINE__,_args_,8);    }
294     #define APP_TRACE_7ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,                 \
295                               _arg4_,_arg5_,_arg6_) {                                           \
296       u32 _args_[7];                                                                            \
297       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;_args_[3]=(u32)_arg3_;  \
298       _args_[4]=(u32)_arg4_;_args_[5]=(u32)_arg5_;_args_[6]=(u32)_arg6_;                        \
299       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
300                 sizeof(__FUNCTION__),__LINE__,_args_,7);    }
301     #define APP_TRACE_6ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,                 \
302                                _arg4_,_arg5_) {                                                 \
303       u32 _args_[6];                                                                            \
304       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;_args_[3]=(u32)_arg3_;  \
305       _args_[4]=(u32)_arg4_;_args_[5]=(u32)_arg5_;                                              \
306       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
307                 sizeof(__FUNCTION__),__LINE__,_args_,6);    }
308     #define APP_TRACE_5ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,                 \
309                                _arg4_) {                                                        \
310       u32 _args_[5];                                                                            \
311       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;_args_[3]=(u32)_arg3_;  \
312       _args_[4]=(u32)_arg4_;                                                                    \
313       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
314                 sizeof(__FUNCTION__),__LINE__,_args_,5);    }
315     #define APP_TRACE_4ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_){                \
316       u32 _args_[4];                                                                            \
317       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;_args_[3]=(u32)_arg3_;  \
318       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
319                 sizeof(__FUNCTION__),__LINE__,_args_,4);    }
320     #define APP_TRACE_3ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_) {                      \
321       u32 _args_[3];                                                                            \
322       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;_args_[2]=(u32)_arg2_;                        \
323       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
324                 sizeof(__FUNCTION__),__LINE__,_args_,3);    }
325     #define APP_TRACE_2ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_)  {                            \
326       u32 _args_[2];                                                                            \
327       _args_[0]=(u32)_arg0_;_args_[1]=(u32)_arg1_;                                              \
328       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
329                 sizeof(__FUNCTION__),__LINE__,_args_,2);    }
330     #define APP_TRACE_1ARG_OPT(_cat_,_level_,_opt_,_arg0_) {                                    \
331       u32 _args_[1];                                                                            \
332       _args_[0]=(u32)_arg0_;                                                                    \
333       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
334                 sizeof(__FUNCTION__),__LINE__,_args_,1);    }
335     #define APP_TRACE_0ARG_OPT(_cat_,_level_,_opt_) {                                           \
336       OSLogFunc(_cat_,_level_,_opt_,__FUNCTION__,                                               \
337                 sizeof(__FUNCTION__),__LINE__,NULL,0);    }
338 
339     /*
340      * APP_TRACE_...
341      * Logs general "APP" category function trace, with varied argument counts
342      */
343     /* "notice" level */
344     #define APP_TRACE_1ARG(_arg0_)                                                   \
345             APP_TRACE_1ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
346                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_)
347     #define APP_TRACE_2ARG(_arg0_,_arg1_)                                            \
348             APP_TRACE_2ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
349                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_)
350     #define APP_TRACE_3ARG(_arg0_,_arg1_,_arg2_)                                     \
351             APP_TRACE_3ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
352                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_)
353     #define APP_TRACE_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)                              \
354             APP_TRACE_4ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
355                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
356                                _arg3_)
357     #define APP_TRACE_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)                       \
358             APP_TRACE_5ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
359                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
360                                _arg3_,_arg4_)
361     #define APP_TRACE_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)                \
362             APP_TRACE_6ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
363                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
364                                _arg3_,_arg4_,_arg5_)
365     #define APP_TRACE_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)         \
366             APP_TRACE_7ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
367                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
368                                _arg3_,_arg4_,_arg5_,_arg6_)
369     #define APP_TRACE_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,         \
370                            _arg7_)                                                   \
371             APP_TRACE_8ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
372                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
373                                _arg3_,_arg4_,_arg5_,_arg6_,_arg7_)
374     /* "noise" level */
375     #define APP_TRACE_NOISE_1ARG(_arg0_)                                             \
376             APP_TRACE_1ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
377                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_)
378     #define APP_TRACE_NOISE_2ARG(_arg0_,_arg1_)                                      \
379             APP_TRACE_2ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
380                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_)
381     #define APP_TRACE_NOISE_3ARG(_arg0_,_arg1_,_arg2_)                               \
382             APP_TRACE_3ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
383                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_)
384     #define APP_TRACE_NOISE_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)                        \
385             APP_TRACE_4ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
386                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
387                                _arg3_)
388     #define APP_TRACE_NOISE_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)                 \
389             APP_TRACE_5ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
390                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
391                                _arg3_,_arg4_)
392     #define APP_TRACE_NOISE_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)          \
393             APP_TRACE_6ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
394                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
395                                _arg3_,_arg4_,_arg5_)
396     #define APP_TRACE_NOISE_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)   \
397             APP_TRACE_7ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
398                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
399                                _arg3_,_arg4_,_arg5_,_arg6_)
400     #define APP_TRACE_NOISE_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,   \
401                                  _arg7_)                                             \
402             APP_TRACE_8ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
403                                OS_LOG_DATA_OPT_DEFAULT_MASK,_arg0_,_arg1_,_arg2_,    \
404                                _arg3_,_arg4_,_arg5_,_arg6_,_arg7_)
405 
406     /*
407      * APP_TRACE_ENTER...
408      * Logs "APP" category function entry, with varied argument counts
409      */
410     /* "notice" level */
411     #define APP_TRACE_ENTER()                                                        \
412             APP_TRACE_0ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
413                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK)
414     #define APP_TRACE_ENTER_1ARG(_arg0_)                                             \
415             APP_TRACE_1ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
416                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_)
417     #define APP_TRACE_ENTER_2ARG(_arg0_,_arg1_)                                      \
418             APP_TRACE_2ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
419                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_)
420     #define APP_TRACE_ENTER_3ARG(_arg0_,_arg1_,_arg2_)                               \
421             APP_TRACE_3ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
422                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_)
423     #define APP_TRACE_ENTER_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)                        \
424             APP_TRACE_4ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
425                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_, \
426                                _arg3_)
427     #define APP_TRACE_ENTER_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)                 \
428             APP_TRACE_5ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
429                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_, \
430                                _arg3_,_arg4_)
431     #define APP_TRACE_ENTER_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)          \
432             APP_TRACE_6ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
433                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_, \
434                                _arg3_,_arg4_,_arg5_)
435     #define APP_TRACE_ENTER_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)   \
436             APP_TRACE_7ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
437                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_, \
438                                _arg3_,_arg4_,_arg5_,_arg6_)
439     #define APP_TRACE_ENTER_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,   \
440                                  _arg7_)                                             \
441             APP_TRACE_8ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
442                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK,_arg0_,_arg1_,_arg2_, \
443                                _arg3_,_arg4_,_arg5_,_arg6_,_arg7_)
444     /* "noise" level */
445     #define APP_TRACE_NOISE_ENTER()                                                  \
446             APP_TRACE_0ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOISE,               \
447                                OS_LOG_DATA_OPT_FUNC_ENTER_MASK)
448 
449     /*
450      * APP_TRACE_EXIT...
451      * Logs "APP" category function exit, with varied argument counts
452      */
453     /* "notice" level */
454     #define APP_TRACE_EXIT()                                                         \
455             APP_TRACE_0ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
456                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK)
457     #define APP_TRACE_EXIT_1ARG(_arg0_)                                              \
458             APP_TRACE_1ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
459                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_)
460     #define APP_TRACE_EXIT_2ARG(_arg0_,_arg1_)                                       \
461             APP_TRACE_2ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
462                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_)
463     #define APP_TRACE_EXIT_3ARG(_arg0_,_arg1_,_arg2_)                                \
464             APP_TRACE_3ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
465                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_)
466     #define APP_TRACE_EXIT_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)                         \
467             APP_TRACE_4ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
468                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_,  \
469                                _arg3_)
470     #define APP_TRACE_EXIT_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)                  \
471             APP_TRACE_5ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
472                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_,  \
473                                _arg3_,_arg4_)
474     #define APP_TRACE_EXIT_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)           \
475             APP_TRACE_6ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
476                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_,  \
477                                _arg3_,_arg4_,_arg5_)
478     #define APP_TRACE_EXIT_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)    \
479             APP_TRACE_7ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
480                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_,  \
481                                _arg3_,_arg4_,_arg5_,_arg6_)
482     #define APP_TRACE_EXIT_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,    \
483                                  _arg7_)                                             \
484             APP_TRACE_8ARG_OPT(OS_LOG_CATEGORY_APP,OS_LOG_LEVEL_NOTICE,              \
485                                OS_LOG_DATA_OPT_FUNC_EXIT_MASK,_arg0_,_arg1_,_arg2_,  \
486                                _arg3_,_arg4_,_arg5_,_arg6_,_arg7_)
487 
488 #else // APP_TRACE_ENABLED is not enabled
489 
490     #define APP_KEYTRACE_3ARG(_seqByte_,_key_,_arg0_,_arg1_,_arg2_)
491     #define APP_KEYTRACE_2ARG(_seqByte_,_key_,_arg0_,_arg1_)
492     #define APP_KEYTRACE_1ARG(_seqByte_,_key_,_arg0_)
493     #define APP_KEYTRACE_0ARG(_seqByte_,_key_)
494     #define APP_TRACE_8ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,      \
495                                _arg4_,_arg5_,_arg6_,_arg7_)
496     #define APP_TRACE_7ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,      \
497                               _arg4_,_arg5_,_arg6_)
498     #define APP_TRACE_6ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,      \
499                                _arg4_,_arg5_)
500     #define APP_TRACE_5ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_,      \
501                                _arg4_)
502     #define APP_TRACE_4ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_,_arg3_)
503     #define APP_TRACE_3ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_,_arg2_)
504     #define APP_TRACE_2ARG_OPT(_cat_,_level_,_opt_,_arg0_,_arg1_)
505     #define APP_TRACE_1ARG_OPT(_cat_,_level_,_opt_,_arg0_)
506     #define APP_TRACE_0ARG_OPT(_cat_,_level_,_opt_)
507     #define APP_TRACE_1ARG(_arg0_)
508     #define APP_TRACE_2ARG(_arg0_,_arg1_)
509     #define APP_TRACE_3ARG(_arg0_,_arg1_,_arg2_)
510     #define APP_TRACE_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)
511     #define APP_TRACE_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)
512     #define APP_TRACE_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
513     #define APP_TRACE_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)
514     #define APP_TRACE_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,         \
515                            _arg7_)
516     #define APP_TRACE_NOISE_1ARG(_arg0_)
517     #define APP_TRACE_NOISE_2ARG(_arg0_,_arg1_)
518     #define APP_TRACE_NOISE_3ARG(_arg0_,_arg1_,_arg2_)
519     #define APP_TRACE_NOISE_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)
520     #define APP_TRACE_NOISE_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)
521     #define APP_TRACE_NOISE_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
522     #define APP_TRACE_NOISE_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)
523     #define APP_TRACE_NOISE_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,   \
524                                  _arg7_)
525     #define APP_TRACE_ENTER()
526     #define APP_TRACE_ENTER_1ARG(_arg0_)
527     #define APP_TRACE_ENTER_2ARG(_arg0_,_arg1_)
528     #define APP_TRACE_ENTER_3ARG(_arg0_,_arg1_,_arg2_)
529     #define APP_TRACE_ENTER_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)
530     #define APP_TRACE_ENTER_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)
531     #define APP_TRACE_ENTER_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
532     #define APP_TRACE_ENTER_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)
533     #define APP_TRACE_ENTER_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,   \
534                                  _arg7_)
535     #define APP_TRACE_NOISE_ENTER()
536     #define APP_TRACE_EXIT()
537     #define APP_TRACE_EXIT_1ARG(_arg0_)
538     #define APP_TRACE_EXIT_2ARG(_arg0_,_arg1_)
539     #define APP_TRACE_EXIT_3ARG(_arg0_,_arg1_,_arg2_)
540     #define APP_TRACE_EXIT_4ARG(_arg0_,_arg1_,_arg2_,_arg3_)
541     #define APP_TRACE_EXIT_5ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_)
542     #define APP_TRACE_EXIT_6ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_)
543     #define APP_TRACE_EXIT_7ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_)
544     #define APP_TRACE_EXIT_8ARG(_arg0_,_arg1_,_arg2_,_arg3_,_arg4_,_arg5_,_arg6_,    \
545                                  _arg7_)
546 
547 #endif // APP_TRACE_ENABLED
548 
549 
550 #ifdef __cplusplus
551 }
552 #endif
553 
554 #endif // __OSSYSTEMLOG_H__
555