This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit 0dc716d426c15893c4fc2bab375204ed09982e44 Author: chao.an <anc...@xiaomi.com> AuthorDate: Thu Mar 31 22:27:50 2022 +0800 sched/note: unify the data format Signed-off-by: chao.an <anc...@xiaomi.com> --- system/sched_note/note_main.c | 102 +++++++++++++++++++++--------------------- system/trace/trace_dump.c | 94 ++++++++++++++++++++------------------ 2 files changed, 101 insertions(+), 95 deletions(-) diff --git a/system/sched_note/note_main.c b/system/sched_note/note_main.c index 817a9f1..ae59315 100644 --- a/system/sched_note/note_main.c +++ b/system/sched_note/note_main.c @@ -84,6 +84,36 @@ static FAR const char *g_statenames[] = ************************************************************************************/ /************************************************************************************ + * Name: trace_dump_unflatten + ************************************************************************************/ + +static void trace_dump_unflatten(FAR void *dst, + FAR uint8_t *src, size_t len) +{ + switch (len) + { +#ifdef CONFIG_HAVE_LONG_LONG + case 8: + *(uint64_t *)dst = ((uint64_t)src[7] << 56) + + ((uint64_t)src[6] << 48) + + ((uint64_t)src[5] << 40) + + ((uint64_t)src[4] << 32); +#endif + case 4: + *(uint32_t *)dst = ((uint64_t)src[3] << 24) + + ((uint64_t)src[2] << 16); + case 2: + *(uint16_t *)dst = ((uint64_t)src[1] << 8); + case 1: + *(uint8_t *)dst = src[0]; + break; + default: + DEBUGASSERT(FALSE); + break; + } +} + +/************************************************************************************ * Name: dump_notes ************************************************************************************/ @@ -103,22 +133,14 @@ static void dump_notes(size_t nread) while (offset < nread) { note = (FAR struct note_common_s *)&g_note_buffer[offset]; - pid = (pid_t)note->nc_pid[0] + - ((pid_t)note->nc_pid[1] << 8); + trace_dump_unflatten(&pid, note->note->nc_pid, sizeof(pid)); #ifdef CONFIG_SCHED_INSTRUMENTATION_HIRES - systime_nsec = (uint32_t)note->nc_systime_nsec[0] + - (uint32_t)(note->nc_systime_nsec[1] << 8) + - (uint32_t)(note->nc_systime_nsec[2] << 16) + - (uint32_t)(note->nc_systime_nsec[3] << 24); - systime_sec = (uint32_t)note->nc_systime_sec[0] + - (uint32_t)(note->nc_systime_sec[1] << 8) + - (uint32_t)(note->nc_systime_sec[2] << 16) + - (uint32_t)(note->nc_systime_sec[3] << 24); + trace_dump_unflatten(&systime_nsec, + note->nc_systime_nsec, sizeof(systime_nsec)); + trace_dump_unflatten(&systime_sec, + note->nc_systime_sec, sizeof(systime_sec)); #else - systime = (uint32_t) note->nc_systime[0] + - (uint32_t)(note->nc_systime[1] << 8) + - (uint32_t)(note->nc_systime[2] << 16) + - (uint32_t)(note->nc_systime[3] << 24); + trace_dump_unflatten(&systime, note->nc_systime, sizeof(systime)); #endif switch (note->nc_type) @@ -395,8 +417,7 @@ static void dump_notes(size_t nread) return; } - count = (uint16_t) note_preempt->npr_count[0] + - (uint16_t)(note_preempt->npr_count[1] << 8); + trace_dump_unflatten(&count, note_preempt->npr_count, sizeof(count)); if (note->nc_type == NOTE_PREEMPT_LOCK) { @@ -452,8 +473,7 @@ static void dump_notes(size_t nread) } #ifdef CONFIG_SMP - count = (uint16_t) note_csection->ncs_count[0] + - (uint16_t)(note_csection->ncs_count[1] << 8); + trace_dump_unflatten(&count, note_csection->ncs_count, sizeof(count)); if (note->nc_type == NOTE_CSECTION_ENTER) { @@ -509,20 +529,9 @@ static void dump_notes(size_t nread) return; } - spinlock = (FAR void *) - ((uintptr_t)note_spinlock->nsp_spinlock[0] - + ((uintptr_t)note_spinlock->nsp_spinlock[1] << 8) -#if UINTPTR_MAX > UINT16_MAX - + ((uintptr_t)note_spinlock->nsp_spinlock[2] << 16) - + ((uintptr_t)note_spinlock->nsp_spinlock[3] << 24) -#if UINTPTR_MAX > UINT32_MAX - + ((uintptr_t)note_spinlock->nsp_spinlock[4] << 32) - + ((uintptr_t)note_spinlock->nsp_spinlock[5] << 40) - + ((uintptr_t)note_spinlock->nsp_spinlock[6] << 48) - + ((uintptr_t)note_spinlock->nsp_spinlock[7] << 56) -#endif -#endif - ); + trace_dump_unflatten(&spinlock, + note_spinlock->nsp_spinlock, + sizeof(spinlock)); switch (note->nc_type) { @@ -666,19 +675,9 @@ static void dump_notes(size_t nread) return; } - result = (uintptr_t)note_sysleave->nsc_result[0] - + ((uintptr_t)note_sysleave->nsc_result[1] << 8) -#if UINTPTR_MAX > UINT16_MAX - + ((uintptr_t)note_sysleave->nsc_result[2] << 16) - + ((uintptr_t)note_sysleave->nsc_result[3] << 24) -#if UINTPTR_MAX > UINT32_MAX - + ((uintptr_t)note_sysleave->nsc_result[4] << 32) - + ((uintptr_t)note_sysleave->nsc_result[5] << 40) - + ((uintptr_t)note_sysleave->nsc_result[6] << 48) - + ((uintptr_t)note_sysleave->nsc_result[7] << 56) -#endif -#endif - ; + trace_dump_unflatten(&result, + note_sysleave->nsc_result, + sizeof(result)); syslog_time(LOG_INFO, "Task %u Leave SYSCALL %d: %" PRIdPTR "\n", @@ -738,6 +737,7 @@ static void dump_notes(size_t nread) { FAR struct note_binary_s *note_binary = (FAR struct note_binary_s *)note; + uint32_t module; char out[1280]; int count; int ret = 0; @@ -758,15 +758,15 @@ static void dump_notes(size_t nread) ret += sprintf(&out[ret], " 0x%x", note_binary->nbi_data[i]); } + trace_dump_unflatten(&module, + note_binary->nbi_module, + sizeof(module)); + syslog_time(LOG_INFO, - "Task %u priority %u, binary:module=%c%c%c%c " + "Task %u priority %u, binary:module=%lx " "event=%u count=%u%s\n", (unsigned int)pid, - (unsigned int)note->nc_priority, - note_binary->nbi_module[0], - note_binary->nbi_module[1], - note_binary->nbi_module[2], - note_binary->nbi_module[3], + (unsigned int)note->nc_priority, module, note_binary->nbi_event, count, out); diff --git a/system/trace/trace_dump.c b/system/trace/trace_dump.c index 1f41f90..4951f92 100644 --- a/system/trace/trace_dump.c +++ b/system/trace/trace_dump.c @@ -24,6 +24,7 @@ #include <nuttx/config.h> +#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <inttypes.h> @@ -100,6 +101,36 @@ struct trace_dump_context_s ****************************************************************************/ /**************************************************************************** + * Name: trace_dump_unflatten + ****************************************************************************/ + +static void trace_dump_unflatten(FAR void *dst, + FAR uint8_t *src, size_t len) +{ + switch (len) + { +#ifdef CONFIG_HAVE_LONG_LONG + case 8: + *(uint64_t *)dst = ((uint64_t)src[7] << 56) + + ((uint64_t)src[6] << 48) + + ((uint64_t)src[5] << 40) + + ((uint64_t)src[4] << 32); +#endif + case 4: + *(uint32_t *)dst = ((uint64_t)src[3] << 24) + + ((uint64_t)src[2] << 16); + case 2: + *(uint16_t *)dst = ((uint64_t)src[1] << 8); + case 1: + *(uint8_t *)dst = src[0]; + break; + default: + DEBUGASSERT(FALSE); + break; + } +} + +/**************************************************************************** * Name: note_ioctl ****************************************************************************/ @@ -270,19 +301,15 @@ static void trace_dump_header(FAR FILE *out, { pid_t pid; #ifdef CONFIG_SCHED_INSTRUMENTATION_HIRES - uint32_t nsec = note->nc_systime_nsec[0] + - (note->nc_systime_nsec[1] << 8) + - (note->nc_systime_nsec[2] << 16) + - (note->nc_systime_nsec[3] << 24); - uint32_t sec = note->nc_systime_sec[0] + - (note->nc_systime_sec[1] << 8) + - (note->nc_systime_sec[2] << 16) + - (note->nc_systime_sec[3] << 24); + uint32_t nsec; + uint32_t sec; + + trace_dump_unflatten(&nsec, note->nc_systime_nsec, sizeof(nsec)); + trace_dump_unflatten(&sec, note->nc_systime_sec, sizeof(sec)); #else - uint32_t systime = note->nc_systime[0] + - (note->nc_systime[1] << 8) + - (note->nc_systime[2] << 16) + - (note->nc_systime[3] << 24); + uint32_t systime; + + trace_dump_unflatten(&systime, note->nc_systime, sizeof(systime)); #endif #ifdef CONFIG_SMP int cpu = note->nc_cpu; @@ -357,7 +384,7 @@ static int trace_dump_one(FAR FILE *out, #endif cctx = &ctx->cpu[cpu]; - pid = note->nc_pid[0] + (note->nc_pid[1] << 8); + trace_dump_unflatten(&pid, note->nc_pid, sizeof(pid)); if (cctx->current_pid < 0) { @@ -486,18 +513,7 @@ static int trace_dump_one(FAR FILE *out, for (i = j = 0; i < nsc->nsc_argc; i++) { - arg = (uintptr_t)nsc->nsc_args[j++]; - arg |= (uintptr_t)nsc->nsc_args[j++] << 8; -#if UINTPTR_MAX > UINT16_MAX - arg |= (uintptr_t)nsc->nsc_args[j++] << 16; - arg |= (uintptr_t)nsc->nsc_args[j++] << 24; -#if UINTPTR_MAX > UINT32_MAX - arg |= (uintptr_t)nsc->nsc_args[j++] << 32; - arg |= (uintptr_t)nsc->nsc_args[j++] << 40; - arg |= (uintptr_t)nsc->nsc_args[j++] << 48; - arg |= (uintptr_t)nsc->nsc_args[j++] << 56; -#endif -#endif + trace_dump_unflatten(&arg, nsc->nsc_args, sizeof(arg)); if (i == 0) { fprintf(out, "arg%d: 0x%" PRIxPTR, i, arg); @@ -549,21 +565,7 @@ static int trace_dump_one(FAR FILE *out, } trace_dump_header(out, note, ctx); - - result = (uintptr_t)nsc->nsc_result[0] - + ((uintptr_t)nsc->nsc_result[1] << 8) -#if UINTPTR_MAX > UINT16_MAX - + ((uintptr_t)nsc->nsc_result[2] << 16) - + ((uintptr_t)nsc->nsc_result[3] << 24) -#if UINTPTR_MAX > UINT32_MAX - + ((uintptr_t)nsc->nsc_result[4] << 32) - + ((uintptr_t)nsc->nsc_result[5] << 40) - + ((uintptr_t)nsc->nsc_result[6] << 48) - + ((uintptr_t)nsc->nsc_result[7] << 56) -#endif -#endif - ; - + trace_dump_unflatten(&result, nsc->nsc_result, sizeof(result)); fprintf(out, "sys_%s -> 0x%" PRIxPTR "\n", g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED], result); @@ -624,16 +626,20 @@ static int trace_dump_one(FAR FILE *out, case NOTE_DUMP_BINARY: { FAR struct note_binary_s *nbi; + uint32_t module; uint8_t count; int i; nbi = (FAR struct note_binary_s *)p; trace_dump_header(out, note, ctx); count = note->nc_length - sizeof(struct note_binary_s) + 1; - fprintf(out, "dump_binary: module=%c%c%c%c event=%u count=%u", - nbi->nbi_module[0], nbi->nbi_module[1], - nbi->nbi_module[2], nbi->nbi_module[3], - nbi->nbi_event, count); + + trace_dump_unflatten(&module, + note_binary->nbi_module, + sizeof(module)); + + fprintf(out, "dump_binary: module=%lx event=%u count=%u", + module, nbi->nbi_event, count); for (i = 0; i < count; i++) { fprintf(out, " 0x%x", nbi->nbi_data[i]);