diff --git a/kernel/arch/arm/cortex-m4/iar/los_interrupt.c b/kernel/arch/arm/cortex-m4/iar/los_interrupt.c index a6b6cbba..35b41b71 100755 --- a/kernel/arch/arm/cortex-m4/iar/los_interrupt.c +++ b/kernel/arch/arm/cortex-m4/iar/los_interrupt.c @@ -28,12 +28,14 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + #include "los_interrupt.h" -#include #include "securec.h" -#include "los_context.h" +#include #include "los_arch_interrupt.h" +#include "los_context.h" #include "los_debug.h" +#include "los_hook.h" #include "los_task.h" #include "los_memory.h" #include "los_membox.h" @@ -176,6 +178,8 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID) hwiIndex = HalIntNumGet(); + OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex); + HalPreInterruptHandler(hwiIndex); #if (OS_HWI_WITH_ARG == 1) @@ -193,6 +197,8 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID) intSave = LOS_IntLock(); g_intCount--; LOS_IntRestore(intSave); + + OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, hwiIndex); } /* **************************************************************************** diff --git a/kernel/arch/arm/cortex-m7/iar/los_interrupt.c b/kernel/arch/arm/cortex-m7/iar/los_interrupt.c index 2abb9241..2a40bea1 100755 --- a/kernel/arch/arm/cortex-m7/iar/los_interrupt.c +++ b/kernel/arch/arm/cortex-m7/iar/los_interrupt.c @@ -28,12 +28,14 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + #include "los_interrupt.h" -#include #include "securec.h" -#include "los_context.h" +#include #include "los_arch_interrupt.h" +#include "los_context.h" #include "los_debug.h" +#include "los_hook.h" #include "los_task.h" #include "los_memory.h" #include "los_membox.h" @@ -172,6 +174,8 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID) hwiIndex = HalIntNumGet(); + OsHookCall(LOS_HOOK_TYPE_ISR_ENTER, hwiIndex); + HalPreInterruptHandler(hwiIndex); #if (OS_HWI_WITH_ARG == 1) @@ -189,6 +193,8 @@ LITE_OS_SEC_TEXT VOID HalInterrupt(VOID) intSave = LOS_IntLock(); g_intCount--; LOS_IntRestore(intSave); + + OsHookCall(LOS_HOOK_TYPE_ISR_EXIT, hwiIndex); } /* **************************************************************************** diff --git a/kernel/include/los_config.h b/kernel/include/los_config.h index 04290cde..a4820a28 100755 --- a/kernel/include/los_config.h +++ b/kernel/include/los_config.h @@ -559,6 +559,14 @@ extern UINT8 *m_aucSysMem0; #define LOSCFG_KERNEL_TRACE 0 #endif +/** + * @ingroup los_config + * Configuration trace tool + */ +#ifndef LOSCFG_DEBUG_HOOK +#define LOSCFG_DEBUG_HOOK 0 +#endif + /* ============================================================================= printf configuration ============================================================================= */ diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h index 5ef1a695..73fb1b12 100644 --- a/kernel/include/los_task.h +++ b/kernel/include/los_task.h @@ -37,9 +37,10 @@ #ifndef _LOS_TASK_H #define _LOS_TASK_H -#include "los_tick.h" +#include "los_config.h" #include "los_context.h" #include "los_event.h" +#include "los_tick.h" #ifdef __cplusplus #if __cplusplus @@ -1551,13 +1552,13 @@ extern UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 ta * @ingroup los_task * @brief the high-order mask of roll num. */ -#define OS_TSK_HIGH_BITS_MASK (OS_TSK_SORTLINK_MASK << OS_TSK_LOW_BITS) +#define OS_TSK_HIGH_BITS_MASK (OS_TSK_SORTLINK_MASK << OS_TSK_LOW_BITS) /** * @ingroup los_task * @brief the low-order mask of roll num. */ -#define OS_TSK_LOW_BITS_MASK (~OS_TSK_HIGH_BITS_MASK) +#define OS_TSK_LOW_BITS_MASK (~OS_TSK_HIGH_BITS_MASK) /** * @ingroup los_task @@ -1580,7 +1581,7 @@ extern UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 ta *
  • los_task_pri.h: the header file that contains the API declaration.
* @see */ -#define OS_TSK_GET_INDEX(taskID) (taskID) +#define OS_TSK_GET_INDEX(taskID) (taskID) /** * @ingroup los_task @@ -1614,8 +1615,8 @@ extern UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 ta *
  • los_task_pri.h: the header file that contains the API declaration.
* @see */ -#define OS_TCB_FROM_TID(taskID) (((LosTaskCB *)g_taskCBArray) + (taskID)) -#define OS_IDLE_TASK_ENTRY ((TSK_ENTRY_FUNC)OsIdleTask) +#define OS_TCB_FROM_TID(taskID) (((LosTaskCB *)g_taskCBArray) + (taskID)) +#define OS_IDLE_TASK_ENTRY ((TSK_ENTRY_FUNC)OsIdleTask) /** diff --git a/kernel/src/los_event.c b/kernel/src/los_event.c index f1ab2af6..b0d1335d 100644 --- a/kernel/src/los_event.c +++ b/kernel/src/los_event.c @@ -29,8 +29,11 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_task.h" +#include "los_event.h" +#include "los_hook.h" #include "los_interrupt.h" +#include "los_task.h" + #ifdef __cplusplus #if __cplusplus extern "C" { @@ -44,6 +47,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB) } eventCB->uwEventID = 0; LOS_ListInit(&eventCB->stEventList); + OsHookCall(LOS_HOOK_TYPE_EVENT_INIT); return LOS_OK; } @@ -110,6 +114,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); if (ret == 0) { if (timeOut == 0) { LOS_IntRestore(intSave); @@ -159,6 +164,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events) } intSave = LOS_IntLock(); 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);) { @@ -200,6 +206,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB) eventCB->stEventList.pstNext = (LOS_DL_LIST *)NULL; eventCB->stEventList.pstPrev = (LOS_DL_LIST *)NULL; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_EVENT_DESTROY); return LOS_OK; } LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 events) @@ -211,6 +218,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 events) intSave = LOS_IntLock(); eventCB->uwEventID &= events; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_EVENT_CLEAR, eventCB); return LOS_OK; } diff --git a/kernel/src/los_init.c b/kernel/src/los_init.c index 50a344cc..7962a892 100755 --- a/kernel/src/los_init.c +++ b/kernel/src/los_init.c @@ -29,14 +29,14 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_config.h" +#include "stdarg.h" #include "los_arch.h" -#include "los_queue.h" +#include "los_config.h" +#include "los_debug.h" #include "los_memory.h" #include "los_mux.h" +#include "los_queue.h" #include "los_sem.h" -#include "los_debug.h" -#include "stdarg.h" #if (LOSCFG_PLATFORM_HWI == 1) #include "los_interrupt.h" diff --git a/kernel/src/los_mux.c b/kernel/src/los_mux.c index 87cdf5a1..fc7457fa 100644 --- a/kernel/src/los_mux.c +++ b/kernel/src/los_mux.c @@ -28,11 +28,13 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_config.h" -#include "los_interrupt.h" + #include "los_mux.h" -#include "los_memory.h" +#include "los_config.h" #include "los_debug.h" +#include "los_hook.h" +#include "los_interrupt.h" +#include "los_memory.h" #ifdef __cplusplus #if __cplusplus @@ -112,6 +114,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxCreate(UINT32 *muxHandle) LOS_ListInit(&muxCreated->muxList); *muxHandle = (UINT32)muxCreated->muxID; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MUX_CREATE, muxCreated); return LOS_OK; ERR_HANDLER: OS_RETURN_ERROR_P2(errLine, errNo); @@ -152,6 +155,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxDelete(UINT32 muxHandle) LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MUX_DELETE, muxDeleted); return LOS_OK; ERR_HANDLER: OS_RETURN_ERROR_P2(errLine, errNo); @@ -207,13 +211,13 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout) muxPended->owner = runningTask; muxPended->priority = runningTask->priority; LOS_IntRestore(intSave); - return LOS_OK; + goto HOOK; } if (muxPended->owner == runningTask) { muxPended->muxCount++; LOS_IntRestore(intSave); - return LOS_OK; + goto HOOK; } if (!timeout) { @@ -230,6 +234,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout) OsTaskWait(&muxPended->muxList, OS_TASK_STATUS_PEND, timeout); LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended); LOS_Schedule(); if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { @@ -241,6 +246,10 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout) return LOS_OK; +HOOK: + OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended); + return LOS_OK; + ERROR_MUX_PEND: LOS_IntRestore(intSave); OS_RETURN_ERROR(retErr); @@ -276,6 +285,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle) if (--(muxPosted->muxCount) != 0) { LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted); return LOS_OK; } @@ -294,6 +304,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle) OsTaskWake(resumedTask, OS_TASK_STATUS_PEND); LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted); LOS_Schedule(); } else { LOS_IntRestore(intSave); diff --git a/kernel/src/los_queue.c b/kernel/src/los_queue.c index c68ace3f..cdba4671 100755 --- a/kernel/src/los_queue.c +++ b/kernel/src/los_queue.c @@ -28,14 +28,16 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_config.h" + #include "los_queue.h" #include "securec.h" -#include "los_membox.h" -#include "los_task.h" -#include "los_memory.h" -#include "los_interrupt.h" +#include "los_config.h" #include "los_debug.h" +#include "los_hook.h" +#include "los_interrupt.h" +#include "los_membox.h" +#include "los_memory.h" +#include "los_task.h" #ifdef __cplusplus #if __cplusplus @@ -152,6 +154,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(CHAR *queueName, *queueID = queueCB->queueID; + OsHookCall(LOS_HOOK_TYPE_QUEUE_CREATE, queueCB); + return LOS_OK; } @@ -397,6 +401,9 @@ 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)); + return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeOut); } @@ -413,6 +420,9 @@ 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)); + return OsQueueOperate(queueID, operateType, &bufferAddr, &size, timeOut); } @@ -602,6 +612,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueID) LOS_ListAdd(&g_freeQueueList, &queueCB->readWriteList[OS_QUEUE_WRITE]); LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_QUEUE_DELETE, queueCB); + ret = LOS_MemFree(m_aucSysMem0, (VOID *)queue); return ret; diff --git a/kernel/src/los_sem.c b/kernel/src/los_sem.c index 830625a1..e33ee305 100755 --- a/kernel/src/los_sem.c +++ b/kernel/src/los_sem.c @@ -28,11 +28,14 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_config.h" + #include "los_sem.h" -#include "los_memory.h" -#include "los_interrupt.h" +#include "los_arch.h" +#include "los_config.h" #include "los_debug.h" +#include "los_hook.h" +#include "los_interrupt.h" +#include "los_memory.h" #ifdef __cplusplus #if __cplusplus @@ -118,6 +121,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSemCreate(UINT16 count, UINT16 maxCount, UINT32 * LOS_ListInit(&semCreated->semList); *semHandle = (UINT32)semCreated->semID; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_SEM_CREATE, semCreated); return LOS_OK; ERR_HANDLER: @@ -181,6 +185,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemDelete(UINT32 semHandle) LOS_ListAdd(&g_unusedSemList, &semDeleted->semList); semDeleted->semStat = OS_SEM_UNUSED; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_SEM_DELETE, semDeleted); return LOS_OK; ERR_HANDLER: OS_RETURN_ERROR_P2(errLine, errNo); @@ -235,6 +240,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); return LOS_OK; } @@ -247,6 +253,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout) runningTask->taskSem = (VOID *)semPended; OsTaskWait(&semPended->semList, OS_TASK_STATUS_PEND, timeout); LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask); LOS_Schedule(); if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { @@ -297,10 +304,12 @@ LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle) OsTaskWake(resumedTask, OS_TASK_STATUS_PEND); LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask); LOS_Schedule(); } else { semPosted->semCount++; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask); } return LOS_OK; diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 1a4b2941..bbc4146c 100755 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -28,18 +28,21 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "los_config.h" + +#include "los_task.h" #include "securec.h" +#include "los_config.h" +#include "los_debug.h" +#include "los_hook.h" +#include "los_interrupt.h" #include "los_memory.h" +#include "los_mpu.h" #include "los_mux.h" #include "los_sem.h" #include "los_timer.h" -#include "los_interrupt.h" #if (LOSCFG_BASE_CORE_CPUP == 1) #include "los_cpup.h" #endif -#include "los_debug.h" -#include "los_mpu.h" #ifdef __cplusplus #if __cplusplus @@ -270,10 +273,12 @@ LITE_OS_SEC_TEXT_MINOR VOID OsTaskPriModify(LosTaskCB *taskCB, UINT16 priority) taskCB->taskStatus &= (~OS_TASK_STATUS_READY); taskCB->priority = priority; taskCB->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB); OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority); } else { taskCB->priority = priority; } + OsHookCall(LOS_HOOK_TYPE_TASK_PRIMODIFY, taskCB, taskCB->priority); } /***************************************************************************** @@ -379,6 +384,7 @@ LITE_OS_SEC_TEXT VOID OsTaskScan(VOID) if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) { taskCB->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB); OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority); needSchedule = TRUE; } @@ -987,6 +993,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S } *taskID = taskCB->taskID; + OsHookCall(LOS_HOOK_TYPE_TASK_CREATE, taskCB); return retVal; LOS_ERREND: @@ -1006,6 +1013,7 @@ VOID OsTaskSchedule(VOID) #if (LOSCFG_BASE_CORE_TSK_MONITOR == 1) OsTaskSwitchCheck(); #endif + OsHookCall(LOS_HOOK_TYPE_TASK_SWITCHEDIN); HalTaskSchedule(); } @@ -1087,6 +1095,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskResume(UINT32 taskID) taskCB->taskStatus &= (~OS_TASK_STATUS_SUSPEND); if (!(taskCB->taskStatus & OS_CHECK_TASK_BLOCK)) { taskCB->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB); OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority); if (g_taskScheduled) { LOS_IntRestore(intSave); @@ -1147,6 +1156,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID) } taskCB->taskStatus |= OS_TASK_STATUS_SUSPEND; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, taskCB); if (taskID == g_losTask.runTask->taskID) { LOS_IntRestore(intSave); LOS_Schedule(); @@ -1201,6 +1211,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) g_losTaskLock = 0; } + OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB); + if ((taskCB->taskStatus) & OS_TASK_STATUS_READY) { OsPriqueueDequeue(&taskCB->pendList); taskCB->taskStatus &= (~OS_TASK_STATUS_READY); @@ -1262,6 +1274,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) return LOS_ERRNO_TSK_DELAY_IN_LOCK; } + OsHookCall(LOS_HOOK_TYPE_TASK_DELAY, tick); if (tick == 0) { return LOS_TaskYield(); } else { @@ -1271,6 +1284,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) OsTaskAdd2TimerList((LosTaskCB *)g_losTask.runTask, tick); g_losTask.runTask->taskStatus |= OS_TASK_STATUS_DELAY; LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, g_losTask.runTask); LOS_Schedule(); } @@ -1338,6 +1352,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio) taskCB->taskStatus &= (~OS_TASK_STATUS_READY); taskCB->priority = taskPrio; taskCB->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB); OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority); } else { taskCB->priority = taskPrio; @@ -1403,6 +1418,7 @@ VOID OsTaskWake(LosTaskCB *resumedTask, UINT32 taskStatus) } if (!(resumedTask->taskStatus & OS_TASK_STATUS_SUSPEND)) { resumedTask->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, resumedTask); OsPriqueueEnqueue(&resumedTask->pendList, resumedTask->priority); } } @@ -1432,6 +1448,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID) if (taskCount > 1) { LOS_ListDelete(&(g_losTask.runTask->pendList)); g_losTask.runTask->taskStatus |= OS_TASK_STATUS_READY; + OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, g_losTask.runTask); OsPriqueueEnqueue(&(g_losTask.runTask->pendList), g_losTask.runTask->priority); } else { LOS_IntRestore(intSave); @@ -1677,6 +1694,7 @@ VOID LOS_Schedule(VOID) if (g_losTask.runTask != g_losTask.newTask) { if (LOS_CHECK_SCHEDULE) { LOS_IntRestore(intSave); + OsHookCall(LOS_HOOK_TYPE_ISR_EXITTOSCHEDULER); OsTaskSchedule(); return; } diff --git a/kernel/src/mm/los_memory.c b/kernel/src/mm/los_memory.c index 69ae3e2a..5f289e81 100755 --- a/kernel/src/mm/los_memory.c +++ b/kernel/src/mm/los_memory.c @@ -29,15 +29,14 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "securec.h" -#include "los_config.h" -#include "los_interrupt.h" -#include "los_arch.h" #include "los_memory.h" -#include "los_task.h" +#include "securec.h" +#include "los_arch.h" +#include "los_config.h" #include "los_debug.h" -#ifdef LOSCFG_LIB_LIBC -#endif +#include "los_hook.h" +#include "los_interrupt.h" +#include "los_task.h" #ifdef __cplusplus #if __cplusplus @@ -911,6 +910,8 @@ UINT32 LOS_MemInit(VOID *pool, UINT32 size) LOS_TraceReg(LOS_TRACE_MEM_INFO, OsMemInfoTrace, LOS_TRACE_MEM_INFO_NAME, LOS_TRACE_ENABLE); #endif + OsHookCall(LOS_HOOK_TYPE_MEM_INIT, pool, size); + return LOS_OK; } @@ -932,6 +933,8 @@ UINT32 LOS_MemDeInit(VOID *pool) LOS_TraceUnreg(LOS_TRACE_MEM_INFO); #endif + OsHookCall(LOS_HOOK_TYPE_MEM_DEINIT, pool); + return LOS_OK; } @@ -1041,6 +1044,8 @@ VOID *LOS_MemAlloc(VOID *pool, UINT32 size) poolStatus.maxFreeNodeSize, poolStatus.usedNodeNum, poolStatus.freeNodeNum); #endif + OsHookCall(LOS_HOOK_TYPE_MEM_ALLOC, pool, size); + return ptr; } @@ -1104,6 +1109,8 @@ VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary) LOS_Trace(LOS_TRACE_MEM_TIME, (UINTPTR)pool & MEM_POOL_ADDR_MASK, MEM_TRACE_MEMALIGN, timeUsed); #endif + OsHookCall(LOS_HOOK_TYPE_MEM_ALLOCALIGN, pool, size, boundary); + return ptr; } @@ -1304,6 +1311,8 @@ UINT32 LOS_MemFree(VOID *pool, VOID *ptr) LOS_Trace(LOS_TRACE_MEM_TIME, (UINTPTR)pool & MEM_POOL_ADDR_MASK, MEM_TRACE_FREE, timeUsed); #endif + OsHookCall(LOS_HOOK_TYPE_MEM_FREE, pool, ptr); + return ret; } @@ -1384,6 +1393,8 @@ VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size) return NULL; } + OsHookCall(LOS_HOOK_TYPE_MEM_REALLOC, pool, ptr, size); + if (ptr == NULL) { return LOS_MemAlloc(pool, size); } @@ -1699,7 +1710,7 @@ STATIC VOID OsMemNodeInfo(const struct OsMemNodeHead *tmpNode, usedNode->header.sizeAndFlag); } else { freeNode = (struct OsMemFreeNodeHead *)tmpNode; - PRINTK("\n broken node head: 0x%x 0x%x " + PRINTK("\n broken node head: 0x%x 0x%x 0x%x " #if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == 1) "0x%x " #endif @@ -1725,7 +1736,7 @@ STATIC VOID OsMemNodeInfo(const struct OsMemNodeHead *tmpNode, usedNode->header.sizeAndFlag); } else { freeNode = (struct OsMemFreeNodeHead *)preNode; - PRINTK("prev node head: 0x%x 0x%x " + PRINTK("prev node head: 0x%x 0x%x 0x%x " #if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == 1) "0x%x " #endif @@ -1932,7 +1943,7 @@ STATIC VOID OsMemInfoPrint(VOID *pool) "max free node size used node num free node num UsageWaterLine\n"); PRINTK("--------------- -------- ------- -------- " "-------------- ------------- ------------ ------------\n"); - PRINTK("%-16#x 0x%-8x 0x%-8x 0x%-8x 0x%-16x 0x%-13x 0x%-13x 0x%-13x\n", + PRINTK("0x%-16x 0x%-8x 0x%-8x 0x%-8x 0x%-16x 0x%-13x 0x%-13x 0x%-13x\n", poolInfo->info.pool, LOS_MemPoolSizeGet(pool), status.totalUsedSize, status.totalFreeSize, status.maxFreeNodeSize, status.usedNodeNum, status.freeNodeNum, status.usageWaterLine); diff --git a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp index 8f1086bc..7ca8d51a 100755 --- a/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp +++ b/targets/cortex-m4_stm32f429ig_fire-challenger_iar/project/los_demo.ewp @@ -2094,6 +2094,9 @@ $PROJ_DIR$\..\..\..\utils\los_error.c + + $PROJ_DIR$\..\..\..\utils\los_hook.c + $PROJ_DIR$\..\..\..\kernel\src\los_event.c diff --git a/utils/internal/los_hook_types.h b/utils/internal/los_hook_types.h new file mode 100644 index 00000000..ca4760d4 --- /dev/null +++ b/utils/internal/los_hook_types.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * 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. + */ + +#ifndef _LOS_HOOK_TYPES_H +#define _LOS_HOOK_TYPES_H + +#include "los_compiler.h" +#include "los_config.h" +#include "los_context.h" +#include "los_event.h" +#include "los_mux.h" +#include "los_queue.h" +#include "los_sem.h" +#include "los_task.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#if (LOSCFG_DEBUG_HOOK == 1) +#define LOS_HOOK_ALL_TYPES_DEF \ + /* Hook types supported by memory modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_INIT, (VOID *pool, UINT32 size)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_DEINIT, (VOID *pool)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_ALLOC, (VOID *pool, UINT32 size)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_FREE, (VOID *pool, VOID *ptr)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_REALLOC, (VOID *pool, VOID *ptr, UINT32 size)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MEM_ALLOCALIGN, (VOID *pool, UINT32 size, UINT32 boundary)) \ + /* Hook types supported by event modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_EVENT_INIT, (VOID)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_EVENT_READ, (PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_EVENT_WRITE, (PEVENT_CB_S eventCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_EVENT_CLEAR, (PEVENT_CB_S eventCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_EVENT_DESTROY, (VOID)) \ + /* Hook types supported by queue modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_QUEUE_CREATE, (const LosQueueCB *queueCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_QUEUE_READ, (const LosQueueCB *queueCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_QUEUE_WRITE, (const LosQueueCB *queueCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_QUEUE_DELETE, (const LosQueueCB *queueCB)) \ + /* Hook types supported by semphore modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_SEM_CREATE, (const LosSemCB *semCreated)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_SEM_POST, (const LosSemCB *semPosted, const LosTaskCB *resumedTask)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_SEM_PEND, (const LosSemCB *semPended, const LosTaskCB *runningTask)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_SEM_DELETE, (const LosSemCB *semDeleted)) \ + /* Hook types supported by mutex modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MUX_CREATE, (const LosMuxCB *muxCreated)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MUX_POST, (const LosMuxCB *muxPosted)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MUX_PEND, (const LosMuxCB *muxPended)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MUX_DELETE, (const LosMuxCB *muxDeleted)) \ + /* Hook types supported by task modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_TASK_CREATE, (const LosTaskCB *taskCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_TASK_DELAY, (UINT32 tick)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_TASK_PRIMODIFY, (const LosTaskCB *pxTask, UINT32 uxNewPriority)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_TASK_DELETE, (const LosTaskCB *taskCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_TASK_SWITCHEDIN, (VOID)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, (const LosTaskCB *pstTaskCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MOVEDTASKTODELAYEDLIST, (const LosTaskCB *pstTaskCB)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_MOVEDTASKTOSUSPENDEDLIST, (const LosTaskCB *pstTaskCB)) \ + /* Hook types supported by interrupt modules */ \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_ISR_EXITTOSCHEDULER, (VOID)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_ISR_ENTER, (UINT32 hwiIndex)) \ + LOS_HOOK_TYPE_DEF(LOS_HOOK_TYPE_ISR_EXIT, (UINT32 hwiIndex)) + +/** + * Defines the types of all hooks. + */ +#define LOS_HOOK_TYPE_DEF(type, paramList) type, + +typedef enum { + /* Used to manage hook pools */ + LOS_HOOK_TYPE_START = 0, + /* All supported hook types */ + LOS_HOOK_ALL_TYPES_DEF + /* Used to manage hook pools */ + LOS_HOOK_TYPE_END +} HookType; + +#undef LOS_HOOK_TYPE_DEF + +/** + * Declare the type and interface of the hook functions. + */ +#define LOS_HOOK_TYPE_DEF(type, paramList) \ + typedef VOID (*type##_FN) paramList; \ + extern UINT32 type##_RegHook(type##_FN func); \ + extern UINT32 type##_UnRegHook(type##_FN func); \ + extern VOID type##_CallHook paramList; + +LOS_HOOK_ALL_TYPES_DEF + +#undef LOS_HOOK_TYPE_DEF + +#endif /* LOSCFG_DEBUG_HOOK */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* _LOS_HOOK_TYPES_H */ diff --git a/utils/internal/los_hook_types_parse.h b/utils/internal/los_hook_types_parse.h new file mode 100644 index 00000000..e8407a2e --- /dev/null +++ b/utils/internal/los_hook_types_parse.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * 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. + */ + +#ifndef _LOS_HOOK_TYPES_PARSE_H +#define _LOS_HOOK_TYPES_PARSE_H + +#define ADDR(a) (&(a)) +#define ARGS(a) (a) +#define ADDRn(...) _CONCAT(ADDR, _NARGS(__VA_ARGS__))(__VA_ARGS__) +#define ARGSn(...) _CONCAT(ARGS, _NARGS(__VA_ARGS__))(__VA_ARGS__) +#define ARGS0() +#define ADDR0() +#define ARGS1(a) ARGS(a) +#define ADDR1(a) ADDR(a) + +#define ARG_const _ARG_const( +#define _ARG_const(a) ARG_CP_##a) +#define ARG_CP_LosSemCB ADDR( +#define ARG_CP_LosTaskCB ADDR( +#define ARG_CP_UINT32 ADDR( +#define ARG_CP_LosMuxCB ADDR( +#define ARG_CP_LosQueueCB ADDR( +#define ARG_UINT32 ARGS( +#define ARG_PEVENT_CB_S ARGS( +#define ARG_void ADDRn( +#define ARG(a) ARG_##a) + +#define PARAM_TO_ARGS1(a) ARG(a) +#define PARAM_TO_ARGS2(a, b) ARG(a), PARAM_TO_ARGS1(b) +#define PARAM_TO_ARGS3(a, b, c) ARG(a), PARAM_TO_ARGS2(b, c) +#define PARAM_TO_ARGS4(a, b, c, d) ARG(a), PARAM_TO_ARGS3(b, c, d) +#define PARAM_TO_ARGS5(a, b, c, d, e) ARG(a), PARAM_TO_ARGS4(b, c, d, e) +#define PARAM_TO_ARGS6(a, b, c, d, e, f) ARG(a), PARAM_TO_ARGS5(b, c, d, e, f) +#define PARAM_TO_ARGS7(a, b, c, d, e, f, g) ARG(a), PARAM_TO_ARGS6(b, c, d, e, f, g) + +#define __NARGS(a, b, c, d, e, f, g, h, n, ...) n +#define _NARGS(...) __NARGS(x, ##__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0, ) +#define __CONCAT(a, b) a##b +#define _CONCAT(a, b) __CONCAT(a, b) + +#define PARAM_TO_ARGS(...) _CONCAT(PARAM_TO_ARGS, _NARGS(__VA_ARGS__))(__VA_ARGS__) +#define OS_HOOK_PARAM_TO_ARGS(paramList) (PARAM_TO_ARGS paramList) + +#endif /* _LOS_HOOK_TYPES_PARSE_H */ diff --git a/utils/los_error.h b/utils/los_error.h index 3c090722..a1248ff1 100644 --- a/utils/los_error.h +++ b/utils/los_error.h @@ -203,10 +203,11 @@ enum LOS_MOUDLE_ID { LOS_MOD_EVENT = 0x1c, LOS_MOD_MUX = 0X1d, LOS_MOD_CPUP = 0x1e, + LOS_MOD_HOOK = 0x1f, LOS_MOD_SHELL = 0x31, LOS_MOD_BUTT }; - + /** * @ingroup los_err * Define the error magic word. @@ -288,7 +289,7 @@ enum LOS_MOUDLE_ID { goto ERR_HANDLER; \ } while (0) - + #ifdef __cplusplus #if __cplusplus } diff --git a/utils/los_hook.c b/utils/los_hook.c new file mode 100644 index 00000000..ae09bfa4 --- /dev/null +++ b/utils/los_hook.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * 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 "los_hook.h" +#include "internal/los_hook_types_parse.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#if (LOSCFG_DEBUG_HOOK == 1) +#define LOS_HOOK_TYPE_DEF(type, paramList) \ + STATIC type##_FN g_fn##type; \ + UINT32 type##_RegHook(type##_FN func) { \ + if ((func) == NULL) { \ + return LOS_ERRNO_HOOK_REG_INVALID; \ + } \ + if (g_fn##type) { \ + return LOS_ERRNO_HOOK_POOL_IS_FULL; \ + } \ + g_fn##type = (func); \ + return LOS_OK; \ + } \ + UINT32 type##_UnRegHook(type##_FN func) { \ + if (((func) == NULL) || (g_fn##type != (func))) { \ + return LOS_ERRNO_HOOK_UNREG_INVALID; \ + } \ + g_fn##type = NULL; \ + return LOS_OK; \ + } \ + VOID type##_CallHook paramList { \ + if (g_fn##type) { \ + g_fn##type(PARAM_TO_ARGS paramList); \ + } \ + } + +LOS_HOOK_ALL_TYPES_DEF; + +#undef LOS_HOOK_TYPE_DEF + +#endif /* LOSCFG_DEBUG_HOOK */ + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ diff --git a/utils/los_hook.h b/utils/los_hook.h new file mode 100644 index 00000000..3b3693bc --- /dev/null +++ b/utils/los_hook.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. + * + * 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. + */ + +#ifndef _LOS_HOOK_H +#define _LOS_HOOK_H + +#include "internal/los_hook_types.h" +#include "los_config.h" +#include "los_error.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#if (LOSCFG_DEBUG_HOOK == 1) +/** + * @ingroup los_hook + * Hook error code: The hook pool is insufficient. + * + * Value: 0x02001f00 + * + * Solution: Deregister the registered hook. + */ +#define LOS_ERRNO_HOOK_POOL_IS_FULL LOS_ERRNO_OS_ERROR(LOS_MOD_HOOK, 0x00) + +/** + * @ingroup los_hook + * Hook error code: Invalid parameter. + * + * Value: 0x02001f01 + * + * Solution: Check the input parameters of LOS_HookReg. + */ +#define LOS_ERRNO_HOOK_REG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HOOK, 0x01) + +/** + * @ingroup los_hook + * Hook error code: Invalid parameter. + * + * Value: 0x02001f02 + * + * Solution: Check the input parameters of LOS_HookUnReg. + */ +#define LOS_ERRNO_HOOK_UNREG_INVALID LOS_ERRNO_OS_ERROR(LOS_MOD_HOOK, 0x02) + +/** + * @ingroup los_hook + * @brief Registration of hook function. + * + * @par Description: + * This API is used to register hook function. + * + * @attention + *
    + *
  • None.
  • + *
+ * + * @param hookType [IN] Register the type of the hook. + * @param hookFn [IN] The function to be registered. + * + * @retval None. + * @par Dependency: + *
  • los_hook.h: the header file that contains the API declaration.
+ * @see + */ +#define LOS_HookReg(hookType, hookFn) hookType##_RegHook(hookFn) + +/** + * @ingroup los_hook + * @brief Deregistration of hook function. + * + * @par Description: + * This API is used to deregister hook function. + * + * @attention + *
    + *
  • None.
  • + *
+ * + * @param hookType [IN] Deregister the type of the hook. + * @param hookFn [IN] The function to be deregistered. + * + * @retval None. + * @par Dependency: + *
  • los_hook.h: the header file that contains the API declaration.
+ * @see + */ +#define LOS_HookUnReg(hookType, hookFn) hookType##_UnRegHook(hookFn) + +/** + * Call hook functions. + */ +#define OsHookCall(hookType, ...) hookType##_CallHook(__VA_ARGS__) + +#else +#define LOS_HookReg(hookType, hookFn) +#define LOS_HookUnReg(hookType, hookFn) +#define OsHookCall(hookType, ...) +#endif + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* _LOS_HOOK_H */