openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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_ */