45#define PERF_LOCK(state) LOS_SpinLockSave(&g_perfSpin, &(state))
46#define PERF_UNLOCK(state) LOS_SpinUnlockRestore(&g_perfSpin, (state))
48#define MIN(x, y) ((x) < (y) ? (x) : (y))
52#ifdef LOSCFG_PERF_CALC_TIME_BY_TICK
61#ifdef LOSCFG_PERF_HW_PMU
63 return LOS_ERRNO_PERF_HW_INIT_ERROR;
67#ifdef LOSCFG_PERF_TIMED_PMU
69 return LOS_ERRNO_PERF_TIMED_INIT_ERROR;
73#ifdef LOSCFG_PERF_SW_PMU
75 return LOS_ERRNO_PERF_SW_INIT_ERROR;
88 PRINT_ERR(
"perf config type error %u!\n", eventsCfg->
type);
89 return LOS_ERRNO_PERF_INVALID_PMU;
96 for (i = 0; i < eventNum; i++) {
106 PRINT_ERR(
"perf config failed!\n");
108 return LOS_ERRNO_PERF_PMU_CONFIG_ERROR;
123 for (index = 0; index < eventNum; index++) {
124 Event *
event = &(events->
per[index]);
127 if (event->period == 0) {
130 PRINT_EMG(
"[%s] eventType: 0x%x [core %u]: %llu\n",
g_pmu->
getName(event), event->eventId, cpuid,
131 event->count[cpuid]);
133 PERF_UNLOCK(intSave);
138#ifdef LOSCFG_PERF_CALC_TIME_BY_TICK
143 PRINT_EMG(
"time used: %.6f(s)\n",
time);
151 PRINT_ERR(
"pmu not registered!\n");
158 PRINT_ERR(
"perf start on core:%u failed, ret = 0x%x\n", cpuid, ret);
173 PRINT_ERR(
"pmu not registered!\n");
180 PRINT_ERR(
"perf stop on core:%u failed, ret = 0x%x\n", cpuid, ret);
197#ifdef LOSCFG_KERNEL_VM
198 UINT32 len = ALIGN(info->
len,
sizeof(
size_t));
203 *(
UINT32 *)(buf + size) = len;
206 if (strncpy_s(buf + size, REGION_PATH_MAX, info->
f_path, info->
len) != EOK) {
207 PRINT_ERR(
"copy f_path failed, %s\n", info->
f_path);
220 PRINT_DEBUG(
"backtrace depth = %u, fp = 0x%x\n", count, regs->
fp);
229 for (i = 0; i < count; i++) {
246 size +=
sizeof(data->
cpuid);
251 size +=
sizeof(data->
taskId);
260 *(
UINT32 *)(p + size) =
event->eventId;
265 *(
UINT32 *)(p + size) =
event->period;
266 size +=
sizeof(data->
period);
271 size +=
sizeof(data->
time);
299 for (i = 0; i < idsNr; i++) {
324 for (index = 0; index < eventNum; index++) {
333 .
magic = PERF_DATA_MAGIC_WORD,
366 ret = LOS_ERRNO_PERF_STATUS_INVALID;
367 goto PERF_INIT_ERROR;
372 goto PERF_INIT_ERROR;
377 ret = LOS_ERRNO_PERF_BUF_ERROR;
378 goto PERF_INIT_ERROR;
395 PRINTK(
"pmu is NULL\n");
412 ret = memcpy_s(dstIds, PERF_MAX_FILTER_TSKS *
sizeof(
UINT32), ids, idsNr *
sizeof(
UINT32));
414 PRINT_ERR(
"In %s At line:%d execute memcpy_s error\n", __FUNCTION__, __LINE__);
418 *dstIdsNr = MIN(idsNr, PERF_MAX_FILTER_TSKS);
430 return LOS_ERRNO_PERF_CONFIG_NULL;
435 ret = LOS_ERRNO_PERF_STATUS_INVALID;
437 goto PERF_CONFIG_ERROR;
451 PERF_UNLOCK(intSave);
463 goto PERF_START_ERROR;
467 PRINT_ERR(
"forgot call `LOS_PerfConfig(...)` before perf start?\n");
468 goto PERF_START_ERROR;
474 PRINT_ERR(
"perf hdr init error 0x%x\n", ret);
475 goto PERF_START_ERROR;
483 PERF_UNLOCK(intSave);
494 goto PERF_STOP_ERROR;
510 PERF_UNLOCK(intSave);
525 PERF_UNLOCK(intSave);
534 PERF_UNLOCK(intSave);
VOID(* PERF_BUF_NOTIFY_HOOK)(VOID)
VOID(* PERF_BUF_FLUSH_HOOK)(VOID *addr, UINT32 size)
VOID LOS_PerfNotifyHookReg(const PERF_BUF_NOTIFY_HOOK func)
Register perf sample data buffer water mark hook function.
UINT32 LOS_PerfDataRead(CHAR *dest, UINT32 size)
Read data from perf sample data buffer.
VOID LOS_PerfStart(UINT32 sectionId)
Start perf sampling.
VOID LOS_PerfFlushHookReg(const PERF_BUF_FLUSH_HOOK func)
Register perf sample data buffer flush hook function.
UINT32 LOS_PerfConfig(PerfConfigAttr *attr)
Config perf parameters.
VOID LOS_PerfStop(VOID)
Stop perf sampling.
LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID)
获取自系统启动以来的Tick数
LITE_OS_SEC_TEXT UINT32 LOS_CurTaskIDGet(VOID)
Obtain current running task ID.
UINT64 HalClockGetCycles(VOID)
BOOL OsGetUsrIpInfo(UINTPTR ip, IpInfo *info)
UINT32 BackTraceGet(UINTPTR regFP, IpInfo *callChain, UINT32 maxDepth)
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
STATIC INLINE VOID * ArchCurrTaskGet(VOID)
获取当前task的地址
LOS_MODULE_INIT(OsPerfInit, LOS_INIT_LEVEL_KMOD_EXTENDED)
STATIC INLINE UINT32 OsPerfParamValid(VOID)
STATIC UINT32 OsPerfInit(VOID)
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_perfSpin)
STATIC INLINE BOOL OsFilterId(UINT32 id, UINT32 *ids, UINT8 idsNr)
STATIC VOID OsPerfPrintCount(VOID)
STATIC VOID OsPerfStop(VOID)
STATIC VOID PerfInfoDump(VOID)
STATIC UINT32 OsPerfCollectData(Event *event, PerfSampleData *data, PerfRegs *regs)
STATIC INLINE UINT32 OsPerfSaveIpInfo(CHAR *buf, IpInfo *info)
STATIC VOID OsPerfStart(VOID)
STATIC INLINE UINT64 OsPerfGetCurrTime(VOID)
STATIC UINT32 OsPmuInit(VOID)
STATIC UINT32 OsPerfBackTrace(PerfBackTrace *callChain, UINT32 maxDepth, PerfRegs *regs)
STATIC INLINE UINT32 OsPerfSaveBackTrace(CHAR *buf, PerfBackTrace *callChain, UINT32 count)
STATIC UINT32 OsPerfConfig(PerfEventConfig *eventsCfg)
STATIC UINT32 OsPerfHdrInit(UINT32 id)
STATIC INLINE VOID OsPerfPrintTs(VOID)
VOID OsPerfHandleOverFlow(Event *event, PerfRegs *regs)
VOID OsPerfUpdateEventCount(Event *event, UINT32 value)
STATIC INLINE BOOL OsPerfFilter(UINT32 taskId, UINT32 processId)
VOID OsPerfSetIrqRegs(UINTPTR pc, UINTPTR fp)
STATIC INLINE VOID OsPerfSetFilterIds(UINT32 *dstIds, UINT8 *dstIdsNr, UINT32 *ids, UINT32 idsNr)
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
UINT32 OsPerfOutputInit(VOID *buf, UINT32 size)
UINT32 OsPerfOutputWrite(CHAR *data, UINT32 size)
VOID OsPerfOutputInfo(VOID)
UINT32 OsPerfOutputRead(CHAR *dest, UINT32 size)
VOID OsPerfOutputFlush(VOID)
VOID OsPerfFlushHookReg(const PERF_BUF_FLUSH_HOOK func)
VOID OsPerfNotifyHookReg(const PERF_BUF_NOTIFY_HOOK func)
Pmu * OsPerfPmuGet(UINT32 type)
UINT32 OsTimedPmuInit(VOID)
CHAR f_path[REGION_PATH_MAX]
IpInfo ip[PERF_MAX_CALLCHAIN_DEPTH]
UINT32 taskIds[PERF_MAX_FILTER_TSKS]
enum PmuStatus pmuStatusPerCpu[LOSCFG_KERNEL_CORE_NUM]
UINT32 processIds[PERF_MAX_FILTER_TSKS]
unsigned int processIdsNr
PerfEventConfig eventsCfg
unsigned int processIds[PERF_MAX_FILTER_TSKS]
unsigned int taskIds[PERF_MAX_FILTER_TSKS]
struct PerfEventConfig::@0 events[PERF_MAX_EVENT]
Event per[PERF_MAX_EVENT]
CHAR *(* getName)(Event *event)