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