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
The following commit(s) were added to refs/heads/master by this push: new 007033f Fix note_syscall_leave_s to avoid unaligned access 007033f is described below commit 007033f2958ff6bb9eca4f894ee46bc44b00fdc9 Author: Nakamura, Yuuichi <yuuichi.a.nakam...@sony.com> AuthorDate: Fri Oct 16 23:08:48 2020 +0900 Fix note_syscall_leave_s to avoid unaligned access --- system/sched_note/note_main.c | 51 +++++++++++++++++++++++++++++++++++-------- system/trace/trace_dump.c | 21 ++++++++++++++++-- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/system/sched_note/note_main.c b/system/sched_note/note_main.c index d81708b..ad656e1 100644 --- a/system/sched_note/note_main.c +++ b/system/sched_note/note_main.c @@ -457,6 +457,7 @@ static void dump_notes(size_t nread) { FAR struct note_spinlock_s *note_spinlock = (FAR struct note_spinlock_s *)note; + FAR void *spinlock; if (note->nc_length != sizeof(struct note_spinlock_s)) { @@ -466,6 +467,21 @@ 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 + ); + switch (note->nc_type) { #ifdef CONFIG_SMP @@ -476,7 +492,7 @@ static void dump_notes(size_t nread) "priority %u\n", (unsigned long)systime, (unsigned int)pid, (unsigned int)note->nc_cpu, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -489,7 +505,7 @@ static void dump_notes(size_t nread) "priority %u\n", (unsigned long)systime, (unsigned int)pid, (unsigned int)note->nc_cpu, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -502,7 +518,7 @@ static void dump_notes(size_t nread) "priority %u\n", (unsigned long)systime, (unsigned int)pid, (unsigned int)note->nc_cpu, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -515,7 +531,7 @@ static void dump_notes(size_t nread) "priority %u\n", (unsigned long)systime, (unsigned int)pid, (unsigned int)note->nc_cpu, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -527,7 +543,7 @@ static void dump_notes(size_t nread) "%08lx: Task %u wait for spinlock=%p value=%u " "priority %u\n", (unsigned long)systime, (unsigned int)pid, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -538,7 +554,7 @@ static void dump_notes(size_t nread) syslog(LOG_INFO, "%08lx: Task %u has spinlock=%p value=%u priority %u\n", (unsigned long)systime, (unsigned int)pid, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -550,7 +566,7 @@ static void dump_notes(size_t nread) "%08lx: Task %u unlocking spinlock=%p value=%u " "priority %u\n", (unsigned long)systime, (unsigned int)pid, - (unsigned int)note->nc_cpu, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } @@ -562,13 +578,15 @@ static void dump_notes(size_t nread) "%08lx: Task %u abort wait on spinlock=%p value=%u " "priority %u\n", (unsigned long)systime, (unsigned int)pid, - note_spinlock->nsp_spinlock, + spinlock, (unsigned int)note_spinlock->nsp_value, (unsigned int)note->nc_priority); } break; #endif } + break; + } #endif #ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL @@ -596,6 +614,7 @@ static void dump_notes(size_t nread) { FAR struct note_syscall_leave_s *note_sysleave = (FAR struct note_syscall_leave_s *)note; + uintptr_t result; if (note->nc_length != sizeof(struct note_syscall_leave_s)) { @@ -605,10 +624,24 @@ 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 + ; + syslog(LOG_INFO, "%08lx: Task %u Leave SYSCALL %d: %" PRIdPTR "\n", (unsigned long)systime, (unsigned int)pid, - note_sysleave->nsc_nr, note_sysleave->nsc_result); + note_sysleave->nsc_nr, result); } break; #endif diff --git a/system/trace/trace_dump.c b/system/trace/trace_dump.c index a2f3243..bc936dd 100644 --- a/system/trace/trace_dump.c +++ b/system/trace/trace_dump.c @@ -26,6 +26,7 @@ #include <stdio.h> #include <stdlib.h> +#include <inttypes.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> @@ -459,6 +460,7 @@ static int trace_dump_one(FAR FILE *out, { FAR struct note_syscall_leave_s *nsc; FAR struct trace_dump_task_context_s *tctx; + uintptr_t result; /* Exclude the case of syscall issued by an interrupt handler and * nested syscalls to correct tracecompass display. @@ -491,9 +493,24 @@ static int trace_dump_one(FAR FILE *out, } trace_dump_header(out, note, ctx); - fprintf(out, "sys_%s -> 0x%x\n", + + 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 + ; + + fprintf(out, "sys_%s -> 0x%" PRIxPTR "\n", g_funcnames[nsc->nsc_nr - CONFIG_SYS_RESERVED], - nsc->nsc_result); + result); } break; #endif