feat: L0 支持Trace
1.【需求描述】 L0 支持Trace,提供两种工作模式:在线模式、离线缓存模式, 用于按时间线追踪系统事件,如任务切换、中断、ipc等。 2.【方案描述】 (1).在内核模块预置静态代码桩 (2).触发桩后,收集系统上下文信息 (3).离线模式则写入内存,用户可通过dump导出; (4).在线模式通过pipeline对接IDE进行可视化解析和展示; BREAKING CHANGE: 1.新增一系列trace的对外API,位于los_trace.h中. LOS_TRACE_EASY简易插桩 LOS_TRACE标准插桩 LOS_TraceInit配置Trace缓冲区的地址和大小 LOS_TraceStart开启事件记录 LOS_TraceStop停止事件记录 LOS_TraceRecordDump输出Trace缓冲区数据 LOS_TraceRecordGet获取Trace缓冲区的首地址 LOS_TraceReset清除Trace缓冲区中的事件 LOS_TraceEventMaskSet设置事件掩码,仅记录某些模块的事件 LOS_TraceHwiFilterHookReg注册过滤特定中断号事件的钩子函数 Close #I41Y9Y Signed-off-by: LiteOS2021 <dinglu@huawei.com>
This commit is contained in:
@@ -110,7 +110,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UIN
|
||||
}
|
||||
intSave = LOS_IntLock();
|
||||
ret = LOS_EventPoll(&(eventCB->uwEventID), eventMask, mode);
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_READ, eventCB, eventMask, mode);
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_READ, eventCB, eventMask, mode, timeOut);
|
||||
if (ret == 0) {
|
||||
if (timeOut == 0) {
|
||||
LOS_IntRestore(intSave);
|
||||
@@ -158,8 +158,8 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events)
|
||||
return LOS_ERRNO_EVENT_SETBIT_INVALID;
|
||||
}
|
||||
intSave = LOS_IntLock();
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_WRITE, eventCB, events);
|
||||
eventCB->uwEventID |= events;
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_WRITE, eventCB);
|
||||
if (!LOS_ListEmpty(&eventCB->stEventList)) {
|
||||
for (resumedTask = LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext, LosTaskCB, pendList);
|
||||
&resumedTask->pendList != (&eventCB->stEventList);) {
|
||||
@@ -210,10 +210,10 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 eventMa
|
||||
if (eventCB == NULL) {
|
||||
return LOS_ERRNO_EVENT_PTR_NULL;
|
||||
}
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_CLEAR, eventCB, eventMask);
|
||||
intSave = LOS_IntLock();
|
||||
eventCB->uwEventID &= eventMask;
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_EVENT_CLEAR, eventCB);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -182,6 +182,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if (LOSCFG_KERNEL_TRACE == 1)
|
||||
ret = LOS_TraceInit(NULL, LOSCFG_TRACE_BUFFER_SIZE);
|
||||
if (ret != LOS_OK) {
|
||||
PRINT_ERR("LOS_TraceInit error\n");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (LOSCFG_KERNEL_PM == 1)
|
||||
ret = OsPmInit();
|
||||
if (ret != LOS_OK) {
|
||||
|
||||
@@ -230,7 +230,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
|
||||
OsSchedTaskWait(&muxPended->muxList, timeout);
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended);
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended, timeout);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
@@ -244,7 +244,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
|
||||
return LOS_OK;
|
||||
|
||||
HOOK:
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended);
|
||||
OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended, timeout);
|
||||
return LOS_OK;
|
||||
|
||||
ERROR_MUX_PEND:
|
||||
|
||||
@@ -397,7 +397,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 b
|
||||
|
||||
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_READ, OS_QUEUE_HEAD, OS_QUEUE_POINT);
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_QUEUE_READ, (LosQueueCB *)GET_QUEUE_HANDLE(queueID));
|
||||
OsHookCall(LOS_HOOK_TYPE_QUEUE_READ, (LosQueueCB *)GET_QUEUE_HANDLE(queueID), operateType, bufferSize, timeOut);
|
||||
|
||||
return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeOut);
|
||||
}
|
||||
@@ -416,7 +416,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueID, VOID *bufferAddr, UINT32
|
||||
|
||||
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_TAIL, OS_QUEUE_POINT);
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_QUEUE_WRITE, (LosQueueCB *)GET_QUEUE_HANDLE(queueID));
|
||||
OsHookCall(LOS_HOOK_TYPE_QUEUE_WRITE, (LosQueueCB *)GET_QUEUE_HANDLE(queueID), operateType, size, timeOut);
|
||||
|
||||
return OsQueueOperate(queueID, operateType, &bufferAddr, &size, timeOut);
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
|
||||
if (semPended->semCount > 0) {
|
||||
semPended->semCount--;
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask, timeout);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
|
||||
runningTask->taskSem = (VOID *)semPended;
|
||||
OsSchedTaskWait(&semPended->semList, timeout);
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask);
|
||||
OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask, timeout);
|
||||
LOS_Schedule();
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "los_memory.h"
|
||||
#include "los_queue.h"
|
||||
#include "los_debug.h"
|
||||
#include "los_hook.h"
|
||||
#include "los_sched.h"
|
||||
|
||||
|
||||
@@ -292,6 +293,7 @@ STATIC BOOL OsSwtmrScan(VOID)
|
||||
OsDeleteNodeSortLink(g_swtmrSortLinkList, sortList);
|
||||
|
||||
SWTMR_CTRL_S *swtmr = LOS_DL_LIST_ENTRY(sortList, SWTMR_CTRL_S, stSortList);
|
||||
OsHookCall(LOS_HOOK_TYPE_SWTMR_EXPIRED, swtmr);
|
||||
OsSwtmrTimeoutHandle(swtmr);
|
||||
|
||||
needSchedule = TRUE;
|
||||
@@ -475,7 +477,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
|
||||
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
|
||||
*swtmrId = swtmr->usTimerID;
|
||||
SET_SORTLIST_VALUE(&swtmr->stSortList, OS_SORT_LINK_INVALID_TIME);
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_SWTMR_CREATE, swtmr);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -529,6 +531,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStart(UINT32 swtmrId)
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SWTMR_START, swtmr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -573,6 +576,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrStop(UINT32 swtmrId)
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SWTMR_STOP, swtmr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -658,6 +662,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT32 swtmrId)
|
||||
}
|
||||
|
||||
LOS_IntRestore(intSave);
|
||||
OsHookCall(LOS_HOOK_TYPE_SWTMR_DELETE, swtmr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1013,7 +1013,7 @@ VOID *LOS_MemAlloc(VOID *pool, UINT32 size)
|
||||
} while (0);
|
||||
MEM_UNLOCK(poolHead, intSave);
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_MEM_ALLOC, pool, size);
|
||||
OsHookCall(LOS_HOOK_TYPE_MEM_ALLOC, pool, ptr, size);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
@@ -1068,7 +1068,7 @@ VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary)
|
||||
} while (0);
|
||||
MEM_UNLOCK(poolHead, intSave);
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_MEM_ALLOCALIGN, pool, size, boundary);
|
||||
OsHookCall(LOS_HOOK_TYPE_MEM_ALLOCALIGN, pool, ptr, size, boundary);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user