1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  *    conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  *    of conditions and the following disclaimer in the documentation and/or other materials
13  *    provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  *    to endorse or promote products derived from this software without specific prior written
17  *    permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include "trace_pipeline.h"
33 #include "trace_tlv.h"
34 #include "los_trace_pri.h"
35 
36 #if (LOSCFG_KERNEL_SMP == 1)
37 LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_pipeSpin);
38 #define PIPE_LOCK(state)                   LOS_SpinLockSave(&g_pipeSpin, &(state))
39 #define PIPE_UNLOCK(state)                 LOS_SpinUnlockRestore(&g_pipeSpin, (state))
40 #else
41 #define PIPE_LOCK(state) 		   (state) = LOS_IntLock()
42 #define PIPE_UNLOCK(state)		   LOS_IntRestore(state)
43 #endif
44 
45 STATIC TlvTable g_traceTlvTblNotify[] = {
46     { CMD,    LOS_OFF_SET_OF(TraceNotifyFrame, cmd),   sizeof(UINT32) },
47     { PARAMS, LOS_OFF_SET_OF(TraceNotifyFrame, param), sizeof(UINT32) },
48     { TRACE_TLV_TYPE_NULL, 0, 0 },
49 };
50 
51 STATIC TlvTable g_traceTlvTblHead[] = {
52     { ENDIAN,     LOS_OFF_SET_OF(TraceBaseHeaderInfo, bigLittleEndian), sizeof(UINT32) },
53     { VERSION,    LOS_OFF_SET_OF(TraceBaseHeaderInfo, version),         sizeof(UINT32) },
54     { CLOCK_FREQ, LOS_OFF_SET_OF(TraceBaseHeaderInfo, clockFreq),       sizeof(UINT32) },
55     { TRACE_TLV_TYPE_NULL, 0, 0 },
56 };
57 
58 STATIC TlvTable g_traceTlvTblObj[] = {
59     { ADDR, LOS_OFF_SET_OF(ObjData, id),   sizeof(UINT32) },
60     { PRIO, LOS_OFF_SET_OF(ObjData, prio), sizeof(UINT32) },
61     { NAME, LOS_OFF_SET_OF(ObjData, name), sizeof(CHAR) * LOSCFG_TRACE_OBJ_MAX_NAME_SIZE },
62     { TRACE_TLV_TYPE_NULL, 0, 0 },
63 };
64 
65 STATIC TlvTable g_traceTlvTblEvent[] = {
66 #if (LOSCFG_TRACE_FRAME_CORE_MSG == 1)
67     { CORE,         LOS_OFF_SET_OF(TraceEventFrame, core),       sizeof(UINT32) },
68 #endif
69     { EVENT_CODE,   LOS_OFF_SET_OF(TraceEventFrame, eventType),  sizeof(UINT32) },
70     { CUR_TIME,     LOS_OFF_SET_OF(TraceEventFrame, curTime),    sizeof(UINT64) },
71 
72 #if (LOSCFG_TRACE_FRAME_EVENT_COUNT == 1)
73     { EVENT_COUNT,  LOS_OFF_SET_OF(TraceEventFrame, eventCount), sizeof(UINT32) },
74 #endif
75     { CUR_TASK,     LOS_OFF_SET_OF(TraceEventFrame, curTask),    sizeof(UINT32) },
76     { IDENTITY,     LOS_OFF_SET_OF(TraceEventFrame, identity),   sizeof(UINTPTR) },
77     { EVENT_PARAMS, LOS_OFF_SET_OF(TraceEventFrame, params),     sizeof(UINTPTR) * LOSCFG_TRACE_FRAME_MAX_PARAMS },
78     { TRACE_TLV_TYPE_NULL, 0, 0 },
79 };
80 
81 STATIC TlvTable *g_traceTlvTbl[] = {
82     g_traceTlvTblNotify,
83     g_traceTlvTblHead,
84     g_traceTlvTblObj,
85     g_traceTlvTblEvent
86 };
87 
DefaultPipelineInitnull88 STATIC UINT32 DefaultPipelineInit(VOID)
89 {
90     return LOS_OK;
91 }
92 
DefaultDataSend(UINT16 len, UINT8 *data)93 STATIC VOID DefaultDataSend(UINT16 len, UINT8 *data)
94 {
95     (VOID)len;
96     (VOID)data;
97 }
98 
DefaultDataReceive(UINT8 *data, UINT32 size, UINT32 timeout)99 STATIC UINT32 DefaultDataReceive(UINT8 *data, UINT32 size, UINT32 timeout)
100 {
101     (VOID)data;
102     (VOID)size;
103     (VOID)timeout;
104     return LOS_OK;
105 }
106 
DefaultWaitnull107 STATIC UINT32 DefaultWait(VOID)
108 {
109     return LOS_OK;
110 }
111 
112 STATIC TracePipelineOps g_defaultOps = {
113     .init = DefaultPipelineInit,
114     .dataSend = DefaultDataSend,
115     .dataRecv = DefaultDataReceive,
116     .wait = DefaultWait,
117 };
118 
119 STATIC const TracePipelineOps *g_tracePipelineOps = &g_defaultOps;
120 
OsTracePipelineReg(const TracePipelineOps *ops)121 VOID OsTracePipelineReg(const TracePipelineOps *ops)
122 {
123     g_tracePipelineOps = ops;
124 }
125 
OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)126 VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)
127 {
128     UINT32 intSave;
129     UINT8 outBuf[LOSCFG_TRACE_TLV_BUF_SIZE] = {0};
130 
131     if ((type >= TRACE_MSG_MAX) || (len > LOSCFG_TRACE_TLV_BUF_SIZE)) {
132         return;
133     }
134 
135     len = OsTraceDataEncode(type, g_traceTlvTbl[type], data, &outBuf[0], sizeof(outBuf));
136 
137     PIPE_LOCK(intSave);
138     g_tracePipelineOps->dataSend(len, &outBuf[0]);
139     PIPE_UNLOCK(intSave);
140 }
141 
OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout)142 UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout)
143 {
144     return g_tracePipelineOps->dataRecv(data, size, timeout);
145 }
146 
OsTraceDataWaitnull147 UINT32 OsTraceDataWait(VOID)
148 {
149     return g_tracePipelineOps->wait();
150 }
151