1 /*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2022 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_cnv.h"
33 #include "los_trace.h"
34 #include "los_task.h"
35 #include "los_sem.h"
36 #include "los_mux.h"
37 #include "los_queue.h"
38 #include "los_event.h"
39 #include "los_swtmr.h"
40 #include "hm_liteipc.h"
41 #include "los_hook.h"
42
LOS_TraceMemInit(VOID * pool,UINT32 size)43 STATIC VOID LOS_TraceMemInit(VOID *pool, UINT32 size)
44 {
45 LOS_TRACE(MEM_INFO_REQ, pool);
46 }
47
LOS_TraceMemAlloc(VOID * pool,VOID * ptr,UINT32 size)48 STATIC VOID LOS_TraceMemAlloc(VOID *pool, VOID *ptr, UINT32 size)
49 {
50 LOS_TRACE(MEM_ALLOC, pool, (UINTPTR)ptr, size);
51 }
52
LOS_TraceMemFree(VOID * pool,VOID * ptr)53 STATIC VOID LOS_TraceMemFree(VOID *pool, VOID *ptr)
54 {
55 LOS_TRACE(MEM_FREE, pool, (UINTPTR)ptr);
56 }
57
LOS_TraceMemRealloc(VOID * pool,VOID * ptr,UINT32 size)58 STATIC VOID LOS_TraceMemRealloc(VOID *pool, VOID *ptr, UINT32 size)
59 {
60 LOS_TRACE(MEM_REALLOC, pool, (UINTPTR)ptr, size);
61 }
62
LOS_TraceMemAllocAlign(VOID * pool,VOID * ptr,UINT32 size,UINT32 boundary)63 STATIC VOID LOS_TraceMemAllocAlign(VOID *pool, VOID *ptr, UINT32 size, UINT32 boundary)
64 {
65 LOS_TRACE(MEM_ALLOC_ALIGN, pool, (UINTPTR)ptr, size, boundary);
66 }
67
LOS_TraceEventInit(PEVENT_CB_S eventCB)68 STATIC VOID LOS_TraceEventInit(PEVENT_CB_S eventCB)
69 {
70 LOS_TRACE(EVENT_CREATE, (UINTPTR)eventCB);
71 }
72
LOS_TraceEventRead(PEVENT_CB_S eventCB,UINT32 eventMask,UINT32 mode,UINT32 timeout)73 STATIC VOID LOS_TraceEventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout)
74 {
75 LOS_TRACE(EVENT_READ, (UINTPTR)eventCB, eventCB->uwEventID, eventMask, mode, timeout);
76 }
77
LOS_TraceEventWrite(PEVENT_CB_S eventCB,UINT32 events)78 STATIC VOID LOS_TraceEventWrite(PEVENT_CB_S eventCB, UINT32 events)
79 {
80 LOS_TRACE(EVENT_WRITE, (UINTPTR)eventCB, eventCB->uwEventID, events);
81 }
82
LOS_TraceEventClear(PEVENT_CB_S eventCB,UINT32 events)83 STATIC VOID LOS_TraceEventClear(PEVENT_CB_S eventCB, UINT32 events)
84 {
85 LOS_TRACE(EVENT_CLEAR, (UINTPTR)eventCB, eventCB->uwEventID, events);
86 }
87
LOS_TraceEventDestroy(PEVENT_CB_S eventCB)88 STATIC VOID LOS_TraceEventDestroy(PEVENT_CB_S eventCB)
89 {
90 LOS_TRACE(EVENT_DELETE, (UINTPTR)eventCB, LOS_OK);
91 }
92
LOS_TraceQueueCreate(const LosQueueCB * queueCB)93 STATIC VOID LOS_TraceQueueCreate(const LosQueueCB *queueCB)
94 {
95 LOS_TRACE(QUEUE_CREATE, queueCB->queueID, queueCB->queueLen, queueCB->queueSize - sizeof(UINT32),
96 (UINTPTR)queueCB, 0);
97 }
98
LOS_TraceQueueRW(const LosQueueCB * queueCB,UINT32 operateType,UINT32 bufferSize,UINT32 timeout)99 STATIC VOID LOS_TraceQueueRW(const LosQueueCB *queueCB, UINT32 operateType,
100 UINT32 bufferSize, UINT32 timeout)
101 {
102 LOS_TRACE(QUEUE_RW, queueCB->queueID, queueCB->queueSize, bufferSize, operateType,
103 queueCB->readWriteableCnt[OS_QUEUE_READ], queueCB->readWriteableCnt[OS_QUEUE_WRITE], timeout);
104 }
105
LOS_TraceQueueDelete(const LosQueueCB * queueCB)106 STATIC VOID LOS_TraceQueueDelete(const LosQueueCB *queueCB)
107 {
108 LOS_TRACE(QUEUE_DELETE, queueCB->queueID, queueCB->queueState, queueCB->readWriteableCnt[OS_QUEUE_READ]);
109 }
110
LOS_TraceSemCreate(const LosSemCB * semCB)111 STATIC VOID LOS_TraceSemCreate(const LosSemCB *semCB)
112 {
113 LOS_TRACE(SEM_CREATE, semCB->semID, 0, semCB->semCount);
114 }
115
LOS_TraceSemPost(const LosSemCB * semCB,const LosTaskCB * resumedTask)116 STATIC VOID LOS_TraceSemPost(const LosSemCB *semCB, const LosTaskCB *resumedTask)
117 {
118 (VOID)resumedTask;
119 LOS_TRACE(SEM_POST, semCB->semID, 0, semCB->semCount);
120 }
121
LOS_TraceSemPend(const LosSemCB * semCB,const LosTaskCB * runningTask,UINT32 timeout)122 STATIC VOID LOS_TraceSemPend(const LosSemCB *semCB, const LosTaskCB *runningTask, UINT32 timeout)
123 {
124 (VOID)runningTask;
125 LOS_TRACE(SEM_PEND, semCB->semID, semCB->semCount, timeout);
126 }
127
LOS_TraceSemDelete(const LosSemCB * semCB)128 STATIC VOID LOS_TraceSemDelete(const LosSemCB *semCB)
129 {
130 LOS_TRACE(SEM_DELETE, semCB->semID, LOS_OK);
131 }
132
LOS_TraceMuxCreate(const LosMux * muxCB)133 STATIC VOID LOS_TraceMuxCreate(const LosMux *muxCB)
134 {
135 LOS_TRACE(MUX_CREATE, (UINTPTR)muxCB);
136 }
137
LOS_TraceMuxPost(const LosMux * muxCB)138 STATIC VOID LOS_TraceMuxPost(const LosMux *muxCB)
139 {
140 LOS_TRACE(MUX_POST, (UINTPTR)muxCB, muxCB->muxCount,
141 (muxCB->owner == NULL) ? 0xffffffff : ((LosTaskCB *)muxCB->owner)->taskID);
142 }
143
LOS_TraceMuxPend(const LosMux * muxCB,UINT32 timeout)144 STATIC VOID LOS_TraceMuxPend(const LosMux *muxCB, UINT32 timeout)
145 {
146 LOS_TRACE(MUX_PEND, (UINTPTR)muxCB, muxCB->muxCount,
147 (muxCB->owner == NULL) ? 0xffffffff : ((LosTaskCB *)muxCB->owner)->taskID, timeout);
148 }
149
LOS_TraceMuxDelete(const LosMux * muxCB)150 STATIC VOID LOS_TraceMuxDelete(const LosMux *muxCB)
151 {
152 LOS_TRACE(MUX_DELETE, (UINTPTR)muxCB, muxCB->attr.type, muxCB->muxCount,
153 (muxCB->owner == NULL) ? 0xffffffff : ((LosTaskCB *)muxCB->owner)->taskID);
154 }
155
LOS_TraceTaskCreate(const LosTaskCB * taskCB)156 STATIC VOID LOS_TraceTaskCreate(const LosTaskCB *taskCB)
157 {
158 #ifdef LOSCFG_KERNEL_TRACE
159 SchedParam param = { 0 };
160 taskCB->ops->schedParamGet(taskCB, ¶m);
161 LOS_TRACE(TASK_CREATE, taskCB->taskID, taskCB->taskStatus, param.priority);
162 #else
163 (VOID)taskCB;
164 #endif
165 }
166
LOS_TraceTaskPriModify(const LosTaskCB * taskCB,UINT32 prio)167 STATIC VOID LOS_TraceTaskPriModify(const LosTaskCB *taskCB, UINT32 prio)
168 {
169 #ifdef LOSCFG_KERNEL_TRACE
170 SchedParam param = { 0 };
171 taskCB->ops->schedParamGet(taskCB, ¶m);
172 LOS_TRACE(TASK_PRIOSET, taskCB->taskID, taskCB->taskStatus, param.priority, prio);
173 #else
174 (VOID)taskCB;
175 (VOID)prio;
176 #endif
177 }
178
LOS_TraceTaskDelete(const LosTaskCB * taskCB)179 STATIC VOID LOS_TraceTaskDelete(const LosTaskCB *taskCB)
180 {
181 LOS_TRACE(TASK_DELETE, taskCB->taskID, taskCB->taskStatus, (UINTPTR)taskCB->stackPointer);
182 }
183
LOS_TraceTaskSwitchedIn(const LosTaskCB * newTask,const LosTaskCB * runTask)184 STATIC VOID LOS_TraceTaskSwitchedIn(const LosTaskCB *newTask, const LosTaskCB *runTask)
185 {
186 #ifdef LOSCFG_KERNEL_TRACE
187 SchedParam runParam = { 0 };
188 SchedParam newParam = { 0 };
189 runTask->ops->schedParamGet(runTask, &runParam);
190 newTask->ops->schedParamGet(newTask, &newParam);
191 LOS_TRACE(TASK_SWITCH, newTask->taskID, runParam.priority, runTask->taskStatus,
192 newParam.priority, newTask->taskStatus);
193 #else
194 (VOID)newTask;
195 (VOID)runTask;
196 #endif
197 }
198
LOS_TraceTaskResume(const LosTaskCB * taskCB)199 STATIC VOID LOS_TraceTaskResume(const LosTaskCB *taskCB)
200 {
201 #ifdef LOSCFG_KERNEL_TRACE
202 SchedParam param = { 0 };
203 taskCB->ops->schedParamGet(taskCB, ¶m);
204 LOS_TRACE(TASK_RESUME, taskCB->taskID, taskCB->taskStatus, param.priority);
205 #else
206 (VOID)taskCB;
207 #endif
208 }
209
LOS_TraceTaskSuspend(const LosTaskCB * taskCB)210 STATIC VOID LOS_TraceTaskSuspend(const LosTaskCB *taskCB)
211 {
212 LOS_TRACE(TASK_SUSPEND, taskCB->taskID, taskCB->taskStatus, OsCurrTaskGet()->taskID);
213 }
214
LOS_TraceIsrEnter(UINT32 hwiNum)215 STATIC VOID LOS_TraceIsrEnter(UINT32 hwiNum)
216 {
217 LOS_TRACE(HWI_RESPONSE_IN, hwiNum);
218 }
219
LOS_TraceIsrExit(UINT32 hwiNum)220 STATIC VOID LOS_TraceIsrExit(UINT32 hwiNum)
221 {
222 LOS_TRACE(HWI_RESPONSE_OUT, hwiNum);
223 }
224
LOS_TraceSwtmrCreate(const SWTMR_CTRL_S * swtmr)225 STATIC VOID LOS_TraceSwtmrCreate(const SWTMR_CTRL_S *swtmr)
226 {
227 LOS_TRACE(SWTMR_CREATE, swtmr->usTimerID);
228 }
229
LOS_TraceSwtmrDelete(const SWTMR_CTRL_S * swtmr)230 STATIC VOID LOS_TraceSwtmrDelete(const SWTMR_CTRL_S *swtmr)
231 {
232 LOS_TRACE(SWTMR_DELETE, swtmr->usTimerID);
233 }
234
LOS_TraceSwtmrExpired(const SWTMR_CTRL_S * swtmr)235 STATIC VOID LOS_TraceSwtmrExpired(const SWTMR_CTRL_S *swtmr)
236 {
237 LOS_TRACE(SWTMR_EXPIRED, swtmr->usTimerID);
238 }
239
LOS_TraceSwtmrStart(const SWTMR_CTRL_S * swtmr)240 STATIC VOID LOS_TraceSwtmrStart(const SWTMR_CTRL_S *swtmr)
241 {
242 LOS_TRACE(SWTMR_START, swtmr->usTimerID, swtmr->ucMode, swtmr->uwInterval);
243 }
244
LOS_TraceSwtmrStop(const SWTMR_CTRL_S * swtmr)245 STATIC VOID LOS_TraceSwtmrStop(const SWTMR_CTRL_S *swtmr)
246 {
247 LOS_TRACE(SWTMR_STOP, swtmr->usTimerID);
248 }
249
LOS_TraceIpcWriteDrop(const IpcMsg * msg,UINT32 dstTid,UINT32 dstPid,UINT32 ipcStatus)250 STATIC VOID LOS_TraceIpcWriteDrop(const IpcMsg *msg, UINT32 dstTid, UINT32 dstPid, UINT32 ipcStatus)
251 {
252 LOS_TRACE(IPC_WRITE_DROP, dstTid, dstPid, msg->type, msg->code, ipcStatus);
253 }
254
LOS_TraceIpcWrite(const IpcMsg * msg,UINT32 dstTid,UINT32 dstPid,UINT32 ipcStatus)255 STATIC VOID LOS_TraceIpcWrite(const IpcMsg *msg, UINT32 dstTid, UINT32 dstPid, UINT32 ipcStatus)
256 {
257 LOS_TRACE(IPC_WRITE, dstTid, dstPid, msg->type, msg->code, ipcStatus);
258 }
259
LOS_TraceIpcReadDrop(const IpcMsg * msg,UINT32 ipcStatus)260 STATIC VOID LOS_TraceIpcReadDrop(const IpcMsg *msg, UINT32 ipcStatus)
261 {
262 LOS_TRACE(IPC_READ_DROP, msg->taskID, msg->processID, msg->type, msg->code, ipcStatus);
263 }
264
LOS_TraceIpcRead(const IpcMsg * msg,UINT32 ipcStatus)265 STATIC VOID LOS_TraceIpcRead(const IpcMsg *msg, UINT32 ipcStatus)
266 {
267 LOS_TRACE(IPC_READ_DROP, msg->taskID, msg->processID, msg->type, msg->code, ipcStatus);
268 }
269
LOS_TraceIpcTryRead(UINT32 msgType,UINT32 ipcStatus)270 STATIC VOID LOS_TraceIpcTryRead(UINT32 msgType, UINT32 ipcStatus)
271 {
272 LOS_TRACE(IPC_TRY_READ, msgType, ipcStatus);
273 }
274
LOS_TraceIpcReadTimeout(UINT32 msgType,UINT32 ipcStatus)275 STATIC VOID LOS_TraceIpcReadTimeout(UINT32 msgType, UINT32 ipcStatus)
276 {
277 LOS_TRACE(IPC_READ_TIMEOUT, msgType, ipcStatus);
278 }
279
LOS_TraceIpcKill(UINT32 msgType,UINT32 ipcStatus)280 STATIC VOID LOS_TraceIpcKill(UINT32 msgType, UINT32 ipcStatus)
281 {
282 LOS_TRACE(IPC_KILL, msgType, ipcStatus);
283 }
284
LOS_TraceUsrEvent(VOID * buffer,UINT32 len)285 STATIC VOID LOS_TraceUsrEvent(VOID *buffer, UINT32 len)
286 {
287 #ifdef LOSCFG_DRIVERS_TRACE
288 UsrEventInfo *info = (UsrEventInfo *)buffer;
289 if ((info == NULL) || (len != sizeof(UsrEventInfo))) {
290 return;
291 }
292 LOS_TRACE_EASY(info->eventType & (~TRACE_USER_DEFAULT_FLAG), info->identity, info->params[0], info->params[1],
293 info->params[2]); /* 2, params num, no special meaning */
294 LOS_MemFree(m_aucSysMem0, buffer);
295 #endif
296 }
297
OsTraceCnvInit(VOID)298 VOID OsTraceCnvInit(VOID)
299 {
300 LOS_HookReg(LOS_HOOK_TYPE_MEM_ALLOC, LOS_TraceMemAlloc);
301 LOS_HookReg(LOS_HOOK_TYPE_MEM_FREE, LOS_TraceMemFree);
302 LOS_HookReg(LOS_HOOK_TYPE_MEM_INIT, LOS_TraceMemInit);
303 LOS_HookReg(LOS_HOOK_TYPE_MEM_REALLOC, LOS_TraceMemRealloc);
304 LOS_HookReg(LOS_HOOK_TYPE_MEM_ALLOCALIGN, LOS_TraceMemAllocAlign);
305 LOS_HookReg(LOS_HOOK_TYPE_EVENT_INIT, LOS_TraceEventInit);
306 LOS_HookReg(LOS_HOOK_TYPE_EVENT_READ, LOS_TraceEventRead);
307 LOS_HookReg(LOS_HOOK_TYPE_EVENT_WRITE, LOS_TraceEventWrite);
308 LOS_HookReg(LOS_HOOK_TYPE_EVENT_CLEAR, LOS_TraceEventClear);
309 LOS_HookReg(LOS_HOOK_TYPE_EVENT_DESTROY, LOS_TraceEventDestroy);
310 LOS_HookReg(LOS_HOOK_TYPE_QUEUE_CREATE, LOS_TraceQueueCreate);
311 LOS_HookReg(LOS_HOOK_TYPE_QUEUE_DELETE, LOS_TraceQueueDelete);
312 LOS_HookReg(LOS_HOOK_TYPE_QUEUE_READ, LOS_TraceQueueRW);
313 LOS_HookReg(LOS_HOOK_TYPE_QUEUE_WRITE, LOS_TraceQueueRW);
314 LOS_HookReg(LOS_HOOK_TYPE_SEM_CREATE, LOS_TraceSemCreate);
315 LOS_HookReg(LOS_HOOK_TYPE_SEM_DELETE, LOS_TraceSemDelete);
316 LOS_HookReg(LOS_HOOK_TYPE_SEM_POST, LOS_TraceSemPost);
317 LOS_HookReg(LOS_HOOK_TYPE_SEM_PEND, LOS_TraceSemPend);
318 LOS_HookReg(LOS_HOOK_TYPE_MUX_CREATE, LOS_TraceMuxCreate);
319 LOS_HookReg(LOS_HOOK_TYPE_MUX_POST, LOS_TraceMuxPost);
320 LOS_HookReg(LOS_HOOK_TYPE_MUX_PEND, LOS_TraceMuxPend);
321 LOS_HookReg(LOS_HOOK_TYPE_MUX_DELETE, LOS_TraceMuxDelete);
322 LOS_HookReg(LOS_HOOK_TYPE_TASK_PRIMODIFY, LOS_TraceTaskPriModify);
323 LOS_HookReg(LOS_HOOK_TYPE_TASK_DELETE, LOS_TraceTaskDelete);
324 LOS_HookReg(LOS_HOOK_TYPE_TASK_CREATE, LOS_TraceTaskCreate);
325 LOS_HookReg(LOS_HOOK_TYPE_TASK_SWITCHEDIN, LOS_TraceTaskSwitchedIn);
326 LOS_HookReg(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, LOS_TraceTaskResume);
327 LOS_HookReg(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, LOS_TraceTaskSuspend);
328 LOS_HookReg(LOS_HOOK_TYPE_ISR_ENTER, LOS_TraceIsrEnter);
329 LOS_HookReg(LOS_HOOK_TYPE_ISR_EXIT, LOS_TraceIsrExit);
330 LOS_HookReg(LOS_HOOK_TYPE_SWTMR_CREATE, LOS_TraceSwtmrCreate);
331 LOS_HookReg(LOS_HOOK_TYPE_SWTMR_DELETE, LOS_TraceSwtmrDelete);
332 LOS_HookReg(LOS_HOOK_TYPE_SWTMR_EXPIRED, LOS_TraceSwtmrExpired);
333 LOS_HookReg(LOS_HOOK_TYPE_SWTMR_START, LOS_TraceSwtmrStart);
334 LOS_HookReg(LOS_HOOK_TYPE_SWTMR_STOP, LOS_TraceSwtmrStop);
335 LOS_HookReg(LOS_HOOK_TYPE_USR_EVENT, LOS_TraceUsrEvent);
336 LOS_HookReg(LOS_HOOK_TYPE_IPC_WRITE_DROP, LOS_TraceIpcWriteDrop);
337 LOS_HookReg(LOS_HOOK_TYPE_IPC_WRITE, LOS_TraceIpcWrite);
338 LOS_HookReg(LOS_HOOK_TYPE_IPC_READ_DROP, LOS_TraceIpcReadDrop);
339 LOS_HookReg(LOS_HOOK_TYPE_IPC_READ, LOS_TraceIpcRead);
340 LOS_HookReg(LOS_HOOK_TYPE_IPC_TRY_READ, LOS_TraceIpcTryRead);
341 LOS_HookReg(LOS_HOOK_TYPE_IPC_READ_TIMEOUT, LOS_TraceIpcReadTimeout);
342 LOS_HookReg(LOS_HOOK_TYPE_IPC_KILL, LOS_TraceIpcKill);
343 }
344
345