|
|
/* ----------------------------------------------------------------------------
|
|
|
* Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved.
|
|
|
* Description: LiteOS Trace Implementation
|
|
|
* Author: Huawei LiteOS Team
|
|
|
* Create: 2019-08-31
|
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
|
* are permitted provided that the following conditions are met:
|
|
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
|
* conditions and the following disclaimer.
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
|
* provided with the distribution.
|
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
|
|
* to endorse or promote products derived from this software without specific prior written
|
|
|
* permission.
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
* --------------------------------------------------------------------------- */
|
|
|
#include "uart.h"
|
|
|
#include "los_trace_pri.h"
|
|
|
#include "trace_pipeline.h"
|
|
|
|
|
|
#ifdef LOSCFG_KERNEL_SMP
|
|
|
#include "los_mp_pri.h"
|
|
|
#endif
|
|
|
|
|
|
#ifdef LOSCFG_SHELL
|
|
|
#include "shcmd.h"
|
|
|
#include "shell.h"
|
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
#if __cplusplus
|
|
|
extern "C" {
|
|
|
#endif /* __cplusplus */
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
#ifdef LOSCFG_KERNEL_TRACE
|
|
|
LITE_OS_SEC_BSS STATIC UINT32 g_traceEventCount; //<><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
LITE_OS_SEC_BSS STATIC volatile enum TraceState g_traceState = TRACE_UNINIT; //<><D7B7>״̬//
|
|
|
LITE_OS_SEC_DATA_INIT STATIC volatile BOOL g_enableTrace = FALSE; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
LITE_OS_SEC_BSS STATIC UINT32 g_traceMask = TRACE_DEFAULT_MASK; //<><D7B7><EFBFBD><EFBFBD><EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD>//
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_CONTROL_AGENT
|
|
|
LITE_OS_SEC_BSS STATIC UINT32 g_traceTaskId; //<><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID//
|
|
|
#endif
|
|
|
|
|
|
#define EVENT_MASK 0xFFFFFFF0
|
|
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
|
|
|
|
|
LITE_OS_SEC_BSS STATIC TRACE_HWI_FILTER_HOOK g_traceHwiFliterHook = NULL;
|
|
|
|
|
|
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_traceSpin);
|
|
|
|
|
|
STATIC_INLINE BOOL OsTraceHwiFilter(UINT32 hwiNum) //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>Ӳ<EFBFBD><D3B2><EFBFBD>ж<EFBFBD>//
|
|
|
{
|
|
|
BOOL ret = ((hwiNum == NUM_HAL_INTERRUPT_UART) || (hwiNum == OS_TICK_INT_NUM));
|
|
|
#ifdef LOSCFG_KERNEL_SMP
|
|
|
ret |= (hwiNum == LOS_MP_IPI_SCHEDULE);
|
|
|
#endif
|
|
|
if (g_traceHwiFliterHook != NULL) {
|
|
|
ret |= g_traceHwiFliterHook(hwiNum);
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>֡<EFBFBD><D6A1>Ϣ//
|
|
|
STATIC VOID OsTraceSetFrame(TraceEventFrame *frame, UINT32 eventType, UINTPTR identity, const UINTPTR *params,
|
|
|
UINT16 paramCount)
|
|
|
{
|
|
|
INT32 i;
|
|
|
UINT32 intSave;
|
|
|
|
|
|
(VOID)memset_s(frame, sizeof(TraceEventFrame), 0, sizeof(TraceEventFrame));
|
|
|
|
|
|
if (paramCount > LOSCFG_TRACE_FRAME_MAX_PARAMS) {
|
|
|
paramCount = LOSCFG_TRACE_FRAME_MAX_PARAMS;
|
|
|
}
|
|
|
|
|
|
TRACE_LOCK(intSave);
|
|
|
frame->curTask = OsTraceGetMaskTid(OsCurrTaskGet()->taskId);
|
|
|
frame->identity = identity;
|
|
|
frame->curTime = HalClockGetCycles();
|
|
|
frame->eventType = eventType;
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_FRAME_CORE_MSG
|
|
|
frame->core.cpuId = ArchCurrCpuid(); //CPU<50><55>ID//
|
|
|
frame->core.hwiActive = OS_INT_ACTIVE ? TRUE : FALSE; //Ӳ<><D3B2><EFBFBD>жϻ״̬//
|
|
|
frame->core.taskLockCnt = MIN(OsPercpuGet()->taskLockCnt, 0xF); /* taskLockCnt is 4 bits, max vaule = 0xF */ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
frame->core.paramCount = paramCount; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ//
|
|
|
#endif
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_FRAME_EVENT_COUNT
|
|
|
frame->eventCount = g_traceEventCount; //<><D7B7><EFBFBD>¼<EFBFBD><C2BC>ļ<EFBFBD><C4BC><EFBFBD>//
|
|
|
g_traceEventCount++;
|
|
|
#endif
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
|
|
|
for (i = 0; i < paramCount; i++) {
|
|
|
frame->params[i] = params[i];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
VOID OsTraceSetObj(ObjData *obj, const LosTaskCB *tcb) //<2F><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD><EFBFBD>Ϣ//
|
|
|
{
|
|
|
errno_t ret;
|
|
|
(VOID)memset_s(obj, sizeof(ObjData), 0, sizeof(ObjData));
|
|
|
|
|
|
obj->id = OsTraceGetMaskTid(tcb->taskId); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ID//
|
|
|
obj->prio = tcb->priority; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>//
|
|
|
|
|
|
ret = strncpy_s(obj->name, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE, tcb->taskName, LOSCFG_TRACE_OBJ_MAX_NAME_SIZE - 1);
|
|
|
if (ret != EOK) {
|
|
|
TRACE_ERROR("Task name copy failed!\n");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
VOID OsTraceHook(UINT32 eventType, UINTPTR identity, const UINTPTR *params, UINT16 paramCount)
|
|
|
{
|
|
|
if ((eventType == TASK_CREATE) || (eventType == TASK_PRIOSET)) {
|
|
|
OsTraceObjAdd(eventType, identity); /* handle important obj info, these can not be filtered */
|
|
|
}
|
|
|
|
|
|
if ((g_enableTrace == TRUE) && (eventType & g_traceMask)) {
|
|
|
UINTPTR id = identity;
|
|
|
if (TRACE_GET_MODE_FLAG(eventType) == TRACE_HWI_FLAG) {
|
|
|
if (OsTraceHwiFilter(identity)) {
|
|
|
return;
|
|
|
}
|
|
|
} else if (TRACE_GET_MODE_FLAG(eventType) == TRACE_TASK_FLAG) {
|
|
|
id = OsTraceGetMaskTid(identity);
|
|
|
} else if (eventType == MEM_INFO_REQ) {
|
|
|
LOS_MEM_POOL_STATUS status;
|
|
|
LOS_MemInfoGet((VOID *)identity, &status);
|
|
|
LOS_TRACE(MEM_INFO, identity, status.uwTotalUsedSize, status.uwTotalFreeSize);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
TraceEventFrame frame;
|
|
|
OsTraceSetFrame(&frame, eventType, id, params, paramCount);
|
|
|
|
|
|
OsTraceWriteOrSendEvent(&frame); //<2F><><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣд<CFA2><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ȥ//
|
|
|
}
|
|
|
}
|
|
|
|
|
|
BOOL OsTraceIsEnable(VOID) //<2F>ж<EFBFBD><EFBFBD><D7B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬//
|
|
|
{
|
|
|
return g_enableTrace == TRUE;
|
|
|
}
|
|
|
|
|
|
STATIC VOID OsTraceHookInstall(VOID) //<2F><>װ<D7B0>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
{
|
|
|
g_traceEventHook = OsTraceHook;
|
|
|
#ifdef LOSCFG_RECORDER_MODE_OFFLINE
|
|
|
g_traceDumpHook = OsTraceRecordDump; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B7>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_CONTROL_AGENT
|
|
|
STATIC BOOL OsTraceCmdIsValid(const TraceClientCmd *msg) //<2F>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD>TraceClientCmd<6D>ṹ<EFBFBD><E1B9B9><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч//
|
|
|
{
|
|
|
return ((msg->end == TRACE_CMD_END_CHAR) && (msg->cmd < TRACE_CMD_MAX_CODE));
|
|
|
}
|
|
|
|
|
|
STATIC VOID OsTraceCmdHandle(const TraceClientCmd *msg) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TraceClientCmd<6D>ṹ<EFBFBD><E1B9B9>//
|
|
|
{
|
|
|
if (!OsTraceCmdIsValid(msg)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
switch (msg->cmd) {
|
|
|
case TRACE_CMD_START: //<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7>//
|
|
|
LOS_TraceStart();
|
|
|
break;
|
|
|
case TRACE_CMD_STOP: //ֹͣ<D6B9><D7B7>//
|
|
|
LOS_TraceStop();
|
|
|
break;
|
|
|
case TRACE_CMD_SET_EVENT_MASK: //<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
/* 4 params(UINT8) composition the mask(UINT32) */
|
|
|
LOS_TraceEventMaskSet(TRACE_MASK_COMBINE(msg->param1, msg->param2, msg->param3, msg->param4));
|
|
|
break;
|
|
|
case TRACE_CMD_RECODE_DUMP: //<>ټ<EFBFBD>¼ת<C2BC><D7AA>//
|
|
|
LOS_TraceRecordDump(TRUE);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
VOID TraceAgent(VOID) //<2F><><EFBFBD>ϵȴ<CFB5><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD>ݵĵ<DDB5><C4B5><EFBFBD><EFA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
{
|
|
|
UINT32 ret;
|
|
|
TraceClientCmd msg;
|
|
|
|
|
|
while (1) {
|
|
|
(VOID)memset_s(&msg, sizeof(TraceClientCmd), 0, sizeof(TraceClientCmd));
|
|
|
ret = OsTraceDataWait();
|
|
|
if (ret == LOS_OK) {
|
|
|
OsTraceDataRecv((UINT8 *)&msg, sizeof(TraceClientCmd), 0);
|
|
|
OsTraceCmdHandle(&msg);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
STATIC UINT32 OsCreateTraceAgentTask(VOID) //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><D7B7><EFBFBD><EFBFBD>//
|
|
|
{
|
|
|
UINT32 ret;
|
|
|
TSK_INIT_PARAM_S taskInitParam;
|
|
|
|
|
|
(VOID)memset_s((VOID *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
|
|
|
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)TraceAgent;
|
|
|
taskInitParam.usTaskPrio = LOSCFG_TRACE_TASK_PRIORITY;
|
|
|
taskInitParam.pcName = "TraceAgent";
|
|
|
taskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
|
|
|
#ifdef LOSCFG_KERNEL_SMP
|
|
|
taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid());
|
|
|
#endif
|
|
|
ret = LOS_TaskCreate(&g_traceTaskId, &taskInitParam);
|
|
|
return ret;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
UINT32 LOS_TraceInit(VOID *buf, UINT32 size) //<2F><>ʼ<EFBFBD><CABC><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
{
|
|
|
UINT32 intSave;
|
|
|
UINT32 ret;
|
|
|
|
|
|
TRACE_LOCK(intSave);
|
|
|
if (g_traceState != TRACE_UNINIT) {
|
|
|
TRACE_ERROR("trace has been initialized already, the current state is :%d\n", g_traceState);
|
|
|
ret = LOS_ERRNO_TRACE_ERROR_STATUS;
|
|
|
goto LOS_ERREND;
|
|
|
}
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_CLIENT_INTERACT //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>ʼ<EFBFBD><CABC><EFBFBD>ٹܵ<D9B9>//
|
|
|
ret = OsTracePipelineInit();
|
|
|
if (ret != LOS_OK) {
|
|
|
goto LOS_ERREND;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
#ifdef LOSCFG_TRACE_CONTROL_AGENT //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
ret = OsCreateTraceAgentTask();
|
|
|
if (ret != LOS_OK) {
|
|
|
TRACE_ERROR("trace init create agentTask error :0x%x\n", ret);
|
|
|
goto LOS_ERREND;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
ret = OsTraceBufInit(buf, size); //<2F><>ʼ<EFBFBD><CABC><EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
if (ret != LOS_OK) {
|
|
|
goto LOS_RELEASE;
|
|
|
}
|
|
|
|
|
|
OsTraceHookInstall(); //<2F><>װ<D7B0>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
|
|
|
g_traceEventCount = 0;
|
|
|
|
|
|
/*<2A>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ȴ<EFBFBD><EFBFBD>ٿͻ<D9BF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7B7>*/
|
|
|
#ifdef LOSCFG_RECORDER_MODE_ONLINE /* Wait trace client to start trace */
|
|
|
g_enableTrace = FALSE;
|
|
|
g_traceState = TRACE_INITED;
|
|
|
#else
|
|
|
g_enableTrace = TRUE;
|
|
|
g_traceState = TRACE_STARTED;
|
|
|
#endif
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
return LOS_OK;
|
|
|
LOS_RELEASE:
|
|
|
#ifdef LOSCFG_TRACE_CONTROL_AGENT //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫɾ<D2AA><C9BE><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
LOS_TaskDelete(g_traceTaskId);
|
|
|
#endif
|
|
|
LOS_ERREND:
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
UINT32 LOS_TraceStart(VOID) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
{
|
|
|
UINT32 intSave;
|
|
|
UINT32 ret = LOS_OK;
|
|
|
|
|
|
TRACE_LOCK(intSave);
|
|
|
if (g_traceState == TRACE_STARTED) {
|
|
|
goto START_END;
|
|
|
}
|
|
|
|
|
|
if (g_traceState == TRACE_UNINIT) {
|
|
|
TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n");
|
|
|
ret = LOS_ERRNO_TRACE_ERROR_STATUS;
|
|
|
goto START_END;
|
|
|
}
|
|
|
|
|
|
OsTraceNotifyStart(); //֪ͨ<D6AA>ٹ<EFBFBD><D9B9>ܿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>//
|
|
|
|
|
|
g_enableTrace = TRUE;
|
|
|
g_traceState = TRACE_STARTED;
|
|
|
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
LOS_TRACE(MEM_INFO_REQ, m_aucSysMem0); //<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD><EFBFBD>Ϣ//
|
|
|
return ret;
|
|
|
START_END:
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
VOID LOS_TraceStop(VOID) //<2F><><EFBFBD><EFBFBD>ֹͣ<D6B9>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
{
|
|
|
UINT32 intSave;
|
|
|
|
|
|
TRACE_LOCK(intSave);
|
|
|
if (g_traceState != TRACE_STARTED) {
|
|
|
goto STOP_END;
|
|
|
}
|
|
|
|
|
|
g_enableTrace = FALSE;
|
|
|
g_traceState = TRACE_STOPED;
|
|
|
OsTraceNotifyStop(); //֪ͨ<D6AA>ٹ<EFBFBD><D9B9><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>//
|
|
|
STOP_END:
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
}
|
|
|
|
|
|
VOID LOS_TraceEventMaskSet(UINT32 mask) //<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
{
|
|
|
g_traceMask = mask & EVENT_MASK;
|
|
|
}
|
|
|
|
|
|
VOID LOS_TraceRecordDump(BOOL toClient) //ת<><D7AA><EFBFBD>ټ<EFBFBD>¼//
|
|
|
{
|
|
|
if (g_traceState != TRACE_STOPED) {
|
|
|
TRACE_ERROR("trace dump must after trace stopped , the current state is : %d\n", g_traceState);
|
|
|
return;
|
|
|
}
|
|
|
OsTraceRecordDump(toClient);
|
|
|
}
|
|
|
|
|
|
OfflineHead *LOS_TraceRecordGet(VOID) //<2F><>ȡ<C8A1>ټ<EFBFBD>¼//
|
|
|
{
|
|
|
return OsTraceRecordGet();
|
|
|
}
|
|
|
|
|
|
VOID LOS_TraceReset(VOID) //<2F><><EFBFBD><EFBFBD><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD>//
|
|
|
{
|
|
|
if (g_traceState == TRACE_UNINIT) {
|
|
|
TRACE_ERROR("trace not inited, be sure LOS_TraceInit excute success\n");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
OsTraceReset();
|
|
|
}
|
|
|
|
|
|
VOID LOS_TraceHwiFilterHookReg(TRACE_HWI_FILTER_HOOK hook) //ע<><D7A2><EFBFBD>жϹ<D0B6><CFB9>˹<EFBFBD><CBB9><EFBFBD>//
|
|
|
{
|
|
|
UINT32 intSave;
|
|
|
|
|
|
TRACE_LOCK(intSave);
|
|
|
g_traceHwiFliterHook = hook;
|
|
|
TRACE_UNLOCK(intSave);
|
|
|
}
|
|
|
|
|
|
#ifdef LOSCFG_SHELL
|
|
|
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceSetMask(INT32 argc, const CHAR **argv) //<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
{
|
|
|
size_t mask;
|
|
|
CHAR *endPtr = NULL;
|
|
|
|
|
|
if (argc >= 2) { /* 2:Just as number of parameters */
|
|
|
PRINTK("\nUsage: trace_mask or trace_mask ID\n");
|
|
|
return OS_ERROR;
|
|
|
}
|
|
|
|
|
|
if (argc == 0) {
|
|
|
mask = TRACE_DEFAULT_MASK;
|
|
|
} else {
|
|
|
mask = strtoul(argv[0], &endPtr, 0);
|
|
|
}
|
|
|
LOS_TraceEventMaskSet((UINT32)mask);
|
|
|
return LOS_OK;
|
|
|
}
|
|
|
|
|
|
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTraceDump(INT32 argc, const CHAR **argv) //<2F><><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD>¼<EFBFBD><C2BC>ת<EFBFBD><D7AA>//
|
|
|
{
|
|
|
BOOL toClient;
|
|
|
CHAR *endPtr = NULL;
|
|
|
|
|
|
if (argc >= 2) { /* 2:Just as number of parameters */
|
|
|
PRINTK("\nUsage: trace_dump or trace_dump [1/0]\n");
|
|
|
return OS_ERROR;
|
|
|
}
|
|
|
|
|
|
if (argc == 0) {
|
|
|
toClient = FALSE;
|
|
|
} else {
|
|
|
toClient = strtoul(argv[0], &endPtr, 0) != 0 ? TRUE : FALSE;
|
|
|
}
|
|
|
LOS_TraceRecordDump(toClient);
|
|
|
return LOS_OK;
|
|
|
}
|
|
|
|
|
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>*/
|
|
|
SHELLCMD_ENTRY(tracestart_shellcmd, CMD_TYPE_EX, "trace_start", 0, (CmdCallBackFunc)LOS_TraceStart); //<>ٹ<EFBFBD><D9B9>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
SHELLCMD_ENTRY(tracestop_shellcmd, CMD_TYPE_EX, "trace_stop", 0, (CmdCallBackFunc)LOS_TraceStop); //<>ٹ<EFBFBD><D9B9>ܵ<EFBFBD>ֹͣ//
|
|
|
SHELLCMD_ENTRY(tracesetmask_shellcmd, CMD_TYPE_EX, "trace_mask", 1, (CmdCallBackFunc)OsShellCmdTraceSetMask); //<2F><><EFBFBD><EFBFBD><EFBFBD><D7B7><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>//
|
|
|
SHELLCMD_ENTRY(tracereset_shellcmd, CMD_TYPE_EX, "trace_reset", 0, (CmdCallBackFunc)LOS_TraceReset); //<2F><><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD>¼//
|
|
|
SHELLCMD_ENTRY(tracedump_shellcmd, CMD_TYPE_EX, "trace_dump", 1, (CmdCallBackFunc)OsShellCmdTraceDump); //ת<><D7AA><EFBFBD>ټ<EFBFBD>¼//
|
|
|
#endif
|
|
|
|
|
|
#endif /* LOSCFG_KERNEL_TRACE */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
#if __cplusplus
|
|
|
}
|
|
|
#endif /* __cplusplus */
|
|
|
#endif /* __cplusplus */
|