evlog.h (5160B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: evlog.h 8 * Purpose: 9 */ 10 11 #ifndef _SHARED_EVLOG_H_ 12 #define _SHARED_EVLOG_H_ 13 14 #include <shared/error.h> 15 16 #include <sal/types.h> 17 #include <sal/core/time.h> 18 #include <sal/core/thread.h> 19 #include <sal/core/spl.h> 20 21 #if defined(INCLUDE_SHARED_EVLOG) 22 23 typedef struct shared_evlog_s { 24 int max_entries; /* Max number of entries in log */ 25 int max_args; /* Max number of arguments per entry */ 26 27 int cur_idx; /* Current input pointer */ 28 uint32 ev_class_bmp; /* Which event classes are enabled */ 29 int ev_count; /* How many events */ 30 31 /* The following are arrays indexed by log event number */ 32 char **ev_strs; /* Pointer to description string (may be NULL) */ 33 uint32 *ev_args; /* Pointer to array of (max_args) integer args */ 34 sal_usecs_t *ev_ts; /* Timestamp of event */ 35 sal_thread_t *ev_tid; /* Thread ID of event */ 36 uint32 *ev_flags; /* Was this in interrupt context */ 37 38 } shared_evlog_t; 39 40 #define SHARED_EVLOG_INTR_CONTEXT 0x1 41 42 #define SHARED_EVLOG_DECLARE(log_ptr) shared_evlog_t *log_ptr; 43 #define SHARED_EVLOG_EXTERN(log_ptr) extern SHARED_EVLOG_DECLARE(log_ptr) 44 45 #define SHARED_EVLOG_CLASS_BMP(ev) ((ev)->ev_class_bmp) 46 #define SHARED_EVLOG_CLASS_ALL 0xffffffff 47 #define SHARED_EVLOG_ENABLE_SET(ev, enable) \ 48 SHARED_EVLOG_CLASS_BMP(ev) = (enable) ? SHARED_EVLOG_CLASS_ALL : 0 49 #define SHARED_EVLOG_ENABLE_GET(ev) SHARED_EVLOG_CLASS_BMP(ev) 50 #define SHARED_EVLOG_ENABLE_ALL(ev) \ 51 SHARED_EVLOG_ENABLE_SET(ev, SHARED_EVLOG_CLASS_ALL) 52 #define SHARED_EVLOG_COUNT(ev) ((ev)->ev_count) 53 54 #define SHARED_EVENT_LOG_CLASS(ev, class, str, arg0, arg1, arg2, arg3) \ 55 if (((ev) != NULL) && (((ev)->ev_class_bmp & (class)) != 0)) do { \ 56 int idx, sp; \ 57 shared_evlog_t *loc_ev; \ 58 sp = sal_splhi(); \ 59 idx = ((ev)->cur_idx)++; \ 60 ((ev)->cur_idx) %= (ev)->max_entries; \ 61 ((ev)->ev_count)++; \ 62 loc_ev = ev; \ 63 sal_spl(sp); \ 64 SHARED_EVLOG_STR(loc_ev, idx) = (str); \ 65 SHARED_EVLOG_FLAGS(loc_ev, idx) = \ 66 sal_int_context() ? SHARED_EVLOG_INTR_CONTEXT : 0; \ 67 SHARED_EVLOG_RECORD_TS(loc_ev, idx); \ 68 SHARED_EVLOG_RECORD_TID(loc_ev, idx); \ 69 SHARED_EVLOG_ARG(loc_ev, idx, 0) = arg0; \ 70 SHARED_EVLOG_ARG(loc_ev, idx, 1) = arg1; \ 71 SHARED_EVLOG_ARG(loc_ev, idx, 2) = arg2; \ 72 SHARED_EVLOG_ARG(loc_ev, idx, 3) = arg3; \ 73 } while (0) 74 75 #define SHARED_EVENT_LOG(ev, str, arg0, arg1, arg2, arg3) \ 76 SHARED_EVENT_LOG_CLASS(ev, 0xffffffff, str, arg0, arg1, arg2, arg3) 77 78 #define SHARED_EVLOG_ARG(ev, ent, n) \ 79 ((ev)->ev_args[(ev)->max_args * (ent) + (n)]) 80 #define SHARED_EVLOG_TIMESTAMP(ev, ent) ((ev)->ev_ts[ent]) 81 #define SHARED_EVLOG_TID(ev, ent) ((ev)->ev_tid[ent]) 82 #define SHARED_EVLOG_STR(ev, ent) ((ev)->ev_strs[ent]) 83 #define SHARED_EVLOG_FLAGS(ev, ent) ((ev)->ev_flags[ent]) 84 85 #define SHARED_EVLOG_MAXARGS_DEFAULT 4 86 87 88 /* Should timestamp be recorded in interrupt? */ 89 #if !defined(SHARED_EVLOG_NO_INTR_TIMESTAMP) 90 #define SHARED_EVLOG_RECORD_TS(ev, idx) \ 91 SHARED_EVLOG_TIMESTAMP(ev, idx) = sal_time_usecs() 92 #else 93 #define SHARED_EVLOG_RECORD_TS(ev, idx) \ 94 if (!sal_int_context()) SHARED_EVLOG_TIMESTAMP(ev, idx) = sal_time_usecs() 95 #endif 96 97 /* Should thread ID be recorded in interrupt? */ 98 #if !defined(SHARED_EVLOG_NO_INTR_TID) 99 #define SHARED_EVLOG_RECORD_TID(ev, idx) \ 100 SHARED_EVLOG_TID(ev, idx) = sal_thread_self() 101 #else 102 #define SHARED_EVLOG_RECORD_TID(ev, idx) \ 103 if (!sal_int_context()) SHARED_EVLOG_TID(ev, idx) = sal_thread_self() 104 #endif 105 106 #else /* SAL_NO_EVLOG defined */ 107 108 /* Nullify API macros */ 109 #define SHARED_EVLOG_DECLARE(log_ptr) 110 #define SHARED_EVLOG_EXTERN(log_ptr) 111 #define SHARED_EVLOG_CREATE(max_entries) 112 #define SHARED_EVENT_LOG(ev, str, arg0, arg1, arg2, arg3) 113 #define SHARED_EVENT_LOG_CLASS(ev, class, str, arg0, arg1, arg2, arg3) 114 115 #define SHARED_EVLOG_ARG(ev, ent, n) 116 #define SHARED_EVLOG_TIMESTAMP(ev, ent) 117 #define SHARED_EVLOG_TID(ev, ent) 118 #define SHARED_EVLOG_STR(ev, ent) 119 #define SHARED_EVLOG_FLAGS(ev, ent) 120 121 #define SHARED_EVLOG_MAXARGS_DEFAULT 4 122 123 #endif /* !SHARED_NO_EVLOG */ 124 125 #endif /* !_SHARED_EVLOG_H_ */