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 #ifdef __cplusplus
37 #if __cplusplus
38 extern "C" {
39 #endif /* __cplusplus */
40 #endif /* __cplusplus */
41
42 #if (LOSCFG_KERNEL_SMP == 1)
43 LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_pipeSpin);
44 #define PIPE_LOCK(state) LOS_SpinLockSave(&g_pipeSpin, &(state))
45 #define PIPE_UNLOCK(state) LOS_SpinUnlockRestore(&g_pipeSpin, (state))
46 #else
47 #define PIPE_LOCK(state) (state) = LOS_IntLock()
48 #define PIPE_UNLOCK(state) LOS_IntRestore(state)
49 #endif
50
51 STATIC TlvTable g_traceTlvTblNotify[] = {
52 { CMD, LOS_OFF_SET_OF(TraceNotifyFrame, cmd), sizeof(UINT32) },
53 { PARAMS, LOS_OFF_SET_OF(TraceNotifyFrame, param), sizeof(UINT32) },
54 { TRACE_TLV_TYPE_NULL, 0, 0 },
55 };
56
57 STATIC TlvTable g_traceTlvTblHead[] = {
58 { ENDIAN, LOS_OFF_SET_OF(TraceBaseHeaderInfo, bigLittleEndian), sizeof(UINT32) },
59 { VERSION, LOS_OFF_SET_OF(TraceBaseHeaderInfo, version), sizeof(UINT32) },
60 { CLOCK_FREQ, LOS_OFF_SET_OF(TraceBaseHeaderInfo, clockFreq), sizeof(UINT32) },
61 { TRACE_TLV_TYPE_NULL, 0, 0 },
62 };
63
64 STATIC TlvTable g_traceTlvTblObj[] = {
65 { ADDR, LOS_OFF_SET_OF(ObjData, id), sizeof(UINT32) },
66 { PRIO, LOS_OFF_SET_OF(ObjData, prio), sizeof(UINT32) },
67 { NAME, LOS_OFF_SET_OF(ObjData, name), sizeof(CHAR) * LOSCFG_TRACE_OBJ_MAX_NAME_SIZE },
68 { TRACE_TLV_TYPE_NULL, 0, 0 },
69 };
70
71 STATIC TlvTable g_traceTlvTblEvent[] = {
72 #if (LOSCFG_TRACE_FRAME_CORE_MSG == 1)
73 { CORE, LOS_OFF_SET_OF(TraceEventFrame, core), sizeof(UINT32) },
74 #endif
75 { EVENT_CODE, LOS_OFF_SET_OF(TraceEventFrame, eventType), sizeof(UINT32) },
76 { CUR_TIME, LOS_OFF_SET_OF(TraceEventFrame, curTime), sizeof(UINT64) },
77
78 #if (LOSCFG_TRACE_FRAME_EVENT_COUNT == 1)
79 { EVENT_COUNT, LOS_OFF_SET_OF(TraceEventFrame, eventCount), sizeof(UINT32) },
80 #endif
81 { CUR_TASK, LOS_OFF_SET_OF(TraceEventFrame, curTask), sizeof(UINT32) },
82 { IDENTITY, LOS_OFF_SET_OF(TraceEventFrame, identity), sizeof(UINTPTR) },
83 { EVENT_PARAMS, LOS_OFF_SET_OF(TraceEventFrame, params), sizeof(UINTPTR) * LOSCFG_TRACE_FRAME_MAX_PARAMS },
84 { TRACE_TLV_TYPE_NULL, 0, 0 },
85 };
86
87 STATIC TlvTable *g_traceTlvTbl[] = {
88 g_traceTlvTblNotify,
89 g_traceTlvTblHead,
90 g_traceTlvTblObj,
91 g_traceTlvTblEvent
92 };
93
DefaultPipelineInit(VOID)94 STATIC UINT32 DefaultPipelineInit(VOID)
95 {
96 return LOS_OK;
97 }
98
DefaultDataSend(UINT16 len,UINT8 * data)99 STATIC VOID DefaultDataSend(UINT16 len, UINT8 *data)
100 {
101 (VOID)len;
102 (VOID)data;
103 }
104
DefaultDataReceive(UINT8 * data,UINT32 size,UINT32 timeout)105 STATIC UINT32 DefaultDataReceive(UINT8 *data, UINT32 size, UINT32 timeout)
106 {
107 (VOID)data;
108 (VOID)size;
109 (VOID)timeout;
110 return LOS_OK;
111 }
112
DefaultWait(VOID)113 STATIC UINT32 DefaultWait(VOID)
114 {
115 return LOS_OK;
116 }
117
118 STATIC TracePipelineOps g_defaultOps = {
119 .init = DefaultPipelineInit,
120 .dataSend = DefaultDataSend,
121 .dataRecv = DefaultDataReceive,
122 .wait = DefaultWait,
123 };
124
125 STATIC const TracePipelineOps *g_tracePipelineOps = &g_defaultOps;
126
OsTracePipelineReg(const TracePipelineOps * ops)127 VOID OsTracePipelineReg(const TracePipelineOps *ops)
128 {
129 g_tracePipelineOps = ops;
130 }
131
OsTraceDataSend(UINT8 type,UINT16 len,UINT8 * data)132 VOID OsTraceDataSend(UINT8 type, UINT16 len, UINT8 *data)
133 {
134 UINT32 intSave;
135 UINT8 outBuf[LOSCFG_TRACE_TLV_BUF_SIZE] = {0};
136
137 if ((type >= TRACE_MSG_MAX) || (len > LOSCFG_TRACE_TLV_BUF_SIZE)) {
138 return;
139 }
140
141 len = OsTraceDataEncode(type, g_traceTlvTbl[type], data, &outBuf[0], sizeof(outBuf));
142
143 PIPE_LOCK(intSave);
144 g_tracePipelineOps->dataSend(len, &outBuf[0]);
145 PIPE_UNLOCK(intSave);
146 }
147
OsTraceDataRecv(UINT8 * data,UINT32 size,UINT32 timeout)148 UINT32 OsTraceDataRecv(UINT8 *data, UINT32 size, UINT32 timeout)
149 {
150 return g_tracePipelineOps->dataRecv(data, size, timeout);
151 }
152
OsTraceDataWait(VOID)153 UINT32 OsTraceDataWait(VOID)
154 {
155 return g_tracePipelineOps->wait();
156 }
157
158 #ifdef __cplusplus
159 #if __cplusplus
160 }
161 #endif /* __cplusplus */
162 #endif /* __cplusplus */
163