From 7aa18716640657136d9ef0709c29be90ca98ca71 Mon Sep 17 00:00:00 2001 From: zhangwenjian Date: Thu, 11 Apr 2024 16:53:08 +0800 Subject: [PATCH] note:support filter for each note channel Signed-off-by: zhangwenjian --- drivers/note/note_driver.c | 438 ++++++++++++++++++------------- drivers/note/notectl_driver.c | 26 +- drivers/note/notelog_driver.c | 11 + drivers/note/noteram_driver.c | 37 ++- drivers/note/noterpmsg_driver.c | 15 +- drivers/note/notesnap_driver.c | 15 +- drivers/note/notestream_driver.c | 31 ++- drivers/segger/note_rtt.c | 11 + drivers/segger/note_sysview.c | 27 +- include/nuttx/note/note_driver.h | 21 ++ include/nuttx/sched_note.h | 40 ++- 11 files changed, 459 insertions(+), 213 deletions(-) diff --git a/drivers/note/note_driver.c b/drivers/note/note_driver.c index 14760583342..db15e2ffc98 100644 --- a/drivers/note/note_driver.c +++ b/drivers/note/note_driver.c @@ -106,22 +106,6 @@ * Private Types ****************************************************************************/ -#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER -struct note_filter_s -{ - struct note_filter_mode_s mode; -# ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP - struct note_filter_tag_s tag_mask; -# endif -# ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER - struct note_filter_irq_s irq_mask; -# endif -# ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL - struct note_filter_syscall_s syscall_mask; -# endif -}; -#endif - struct note_startalloc_s { struct note_common_s nsa_cmn; /* Common note parameters */ @@ -157,16 +141,6 @@ struct note_taskname_s ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER -static struct note_filter_s g_note_filter = -{ - { - CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE -#ifdef CONFIG_SMP - , (cpu_set_t)CONFIG_SCHED_INSTRUMENTATION_CPUSET -#endif - } -}; - #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER static unsigned int g_note_disabled_irq_nest[CONFIG_SMP_NCPUS]; #endif @@ -251,17 +225,17 @@ static void note_common(FAR struct tcb_s *tcb, * Check whether the instrumentation is enabled. * * Input Parameters: - * None + * driver - The channel of note driver * * Returned Value: * True is returned if the instrumentation is enabled. * ****************************************************************************/ -static inline int note_isenabled(void) +static inline int note_isenabled(FAR struct note_driver_s *driver) { #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_ENABLE)) + if (!(driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_ENABLE)) { return false; } @@ -269,7 +243,7 @@ static inline int note_isenabled(void) #ifdef CONFIG_SMP /* Ignore notes that are not in the set of monitored CPUs */ - if (CPU_ISSET(this_cpu(), &g_note_filter.mode.cpuset) == 0) + if (CPU_ISSET(this_cpu(), &driver->filter.mode.cpuset) == 0) { /* Not in the set of monitored CPUs. Do not log the note. */ @@ -288,7 +262,7 @@ static inline int note_isenabled(void) * Check whether the switch instrumentation is enabled. * * Input Parameters: - * None + * driver - The channel of note driver * * Returned Value: * True is returned if the instrumentation is enabled. @@ -296,17 +270,17 @@ static inline int note_isenabled(void) ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_SWITCH -static inline int note_isenabled_switch(void) +static inline int note_isenabled_switch(FAR struct note_driver_s *driver) { #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!note_isenabled()) + if (!note_isenabled(driver)) { return false; } /* If the switch trace is disabled, do nothing. */ - if ((g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_SWITCH) == 0) + if ((driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_SWITCH) == 0) { return false; } @@ -323,6 +297,7 @@ static inline int note_isenabled_switch(void) * Check whether the syscall instrumentation is enabled. * * Input Parameters: + * driver - The channel of note driver * nr - syscall number * * Returned Value: @@ -331,10 +306,11 @@ static inline int note_isenabled_switch(void) ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL -static inline int note_isenabled_syscall(int nr) +static inline int note_isenabled_syscall(FAR struct note_driver_s *driver, + int nr) { #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!note_isenabled()) + if (!note_isenabled(driver)) { return false; } @@ -361,9 +337,9 @@ static inline int note_isenabled_syscall(int nr) * do nothing. */ - if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_SYSCALL) || + if (!(driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_SYSCALL) || NOTE_FILTER_SYSCALLMASK_ISSET(nr - CONFIG_SYS_RESERVED, - &g_note_filter.syscall_mask)) + &driver->filter.syscall_mask)) { return false; } @@ -380,6 +356,7 @@ static inline int note_isenabled_syscall(int nr) * Check whether the interrupt handler instrumentation is enabled. * * Input Parameters: + * driver - The channel of note driver * irq - IRQ number * enter - interrupt enter/leave flag * @@ -389,10 +366,11 @@ static inline int note_isenabled_syscall(int nr) ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER -static inline int note_isenabled_irq(int irq, bool enter) +static inline int note_isenabled_irq(FAR struct note_driver_s *driver, + int irq, bool enter) { #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!note_isenabled()) + if (!note_isenabled(driver)) { return false; } @@ -401,8 +379,8 @@ static inline int note_isenabled_irq(int irq, bool enter) * subsequent syscall traces until leaving the interrupt handler */ - if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_IRQ) || - NOTE_FILTER_IRQMASK_ISSET(irq, &g_note_filter.irq_mask)) + if (!(driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_IRQ) || + NOTE_FILTER_IRQMASK_ISSET(irq, &driver->filter.irq_mask)) { int cpu = this_cpu(); @@ -430,6 +408,7 @@ static inline int note_isenabled_irq(int irq, bool enter) * Check whether the dump instrumentation is enabled. * * Input Parameters: + * driver - The channel of note driver * tag: The dump instrumentation tag * * Returned Value: @@ -438,18 +417,19 @@ static inline int note_isenabled_irq(int irq, bool enter) ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP -static inline int note_isenabled_dump(uint32_t tag) +static inline int note_isenabled_dump(FAR struct note_driver_s *driver, + uint32_t tag) { # ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!note_isenabled()) + if (!note_isenabled(driver)) { return false; } /* If the dump trace is disabled, do nothing. */ - if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_DUMP) || - NOTE_FILTER_TAGMASK_ISSET(tag, &g_note_filter.tag_mask)) + if (!(driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_DUMP) || + NOTE_FILTER_TAGMASK_ISSET(tag, &driver->filter.tag_mask)) { return false; } @@ -614,13 +594,13 @@ void sched_note_start(FAR struct tcb_s *tcb) int namelen; #endif - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_start(*driver, tcb)) { continue; @@ -671,13 +651,13 @@ void sched_note_stop(FAR struct tcb_s *tcb) note_record_taskname(tcb->pid, tcb->name); #endif - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_stop(*driver, tcb)) { continue; @@ -709,13 +689,13 @@ void sched_note_suspend(FAR struct tcb_s *tcb) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_suspend(*driver, tcb)) { continue; @@ -748,13 +728,13 @@ void sched_note_resume(FAR struct tcb_s *tcb) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_resume(*driver, tcb)) { continue; @@ -787,13 +767,13 @@ void sched_note_cpu_start(FAR struct tcb_s *tcb, int cpu) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_cpu_start(*driver, tcb, cpu)) { continue; @@ -826,13 +806,13 @@ void sched_note_cpu_started(FAR struct tcb_s *tcb) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_cpu_started(*driver, tcb)) { continue; @@ -864,13 +844,13 @@ void sched_note_cpu_pause(FAR struct tcb_s *tcb, int cpu) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_cpu_pause(*driver, tcb, cpu)) { continue; @@ -903,13 +883,13 @@ void sched_note_cpu_paused(FAR struct tcb_s *tcb) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_cpu_paused(*driver, tcb)) { continue; @@ -941,13 +921,13 @@ void sched_note_cpu_resume(FAR struct tcb_s *tcb, int cpu) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_cpu_resume(*driver, tcb, cpu)) { continue; @@ -980,13 +960,13 @@ void sched_note_cpu_resumed(FAR struct tcb_s *tcb) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled_switch()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_switch(*driver)) + { + continue; + } + if (note_cpu_resumed(*driver, tcb)) { continue; @@ -1021,13 +1001,13 @@ void sched_note_premption(FAR struct tcb_s *tcb, bool locked) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_premption(*driver, tcb, locked)) { continue; @@ -1062,13 +1042,13 @@ void sched_note_csection(FAR struct tcb_s *tcb, bool enter) FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_csection(*driver, tcb, enter)) { continue; @@ -1122,13 +1102,13 @@ void sched_note_spinlock(FAR struct tcb_s *tcb, FAR struct note_driver_s **driver; bool formatted = false; - if (!note_isenabled()) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_spinlock(*driver, tcb, spinlock, type)) { continue; @@ -1187,26 +1167,40 @@ void sched_note_syscall_enter(int nr, int argc, ...) FAR struct tcb_s *tcb = this_task(); unsigned int length; uintptr_t arg; - va_list ap; + int argc_bak = argc; int i; - if (!note_isenabled_syscall(nr)) - { - return; - } - -#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!(g_note_filter.mode.flag & NOTE_FILTER_MODE_FLAG_SYSCALL_ARGS)) - { - argc = 0; - } -#endif - va_start(ap, argc); for (driver = g_note_drivers; *driver; driver++) { va_list copy; + if (!note_isenabled_syscall(*driver, nr)) + { + continue; + } + +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + if (!(*driver->filter.mode.flag & NOTE_FILTER_MODE_FLAG_SYSCALL_ARGS)) + { + if (formatted && argc != 0) + { + formatted = false; + } + + argc = 0; + } + else + { + if (formatted && argc == 0) + { + formatted = false; + } + + argc = argc_bak; + } +#endif + va_copy(copy, ap); if (note_syscall_enter(*driver, nr, argc, ©)) { @@ -1258,13 +1252,13 @@ void sched_note_syscall_leave(int nr, uintptr_t result) bool formatted = false; FAR struct tcb_s *tcb = this_task(); - if (!note_isenabled_syscall(nr)) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_syscall(*driver, nr)) + { + continue; + } + if (note_syscall_leave(*driver, nr, result)) { continue; @@ -1303,13 +1297,13 @@ void sched_note_irqhandler(int irq, FAR void *handler, bool enter) bool formatted = false; FAR struct tcb_s *tcb = this_task(); - if (!note_isenabled_irq(irq, enter)) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_irq(*driver, irq, enter)) + { + continue; + } + if (note_irqhandler(*driver, irq, handler, enter)) { continue; @@ -1381,15 +1375,13 @@ void sched_note_heap(uint8_t event, FAR void *heap, FAR void *mem, bool formatted = false; FAR struct tcb_s *tcb = this_task(); -#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER - if (!note_isenabled()) - { - return; - } -#endif - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled(*driver)) + { + continue; + } + if (note_heap(*driver, event, heap, mem, size, used)) { continue; @@ -1428,13 +1420,13 @@ void sched_note_event_ip(uint32_t tag, uintptr_t ip, uint8_t event, unsigned int length; FAR struct tcb_s *tcb = this_task(); - if (!note_isenabled_dump(tag)) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_dump(*driver, tag)) + { + continue; + } + if (note_event(*driver, ip, event, buf, len)) { continue; @@ -1478,13 +1470,13 @@ void sched_note_vprintf_ip(uint32_t tag, uintptr_t ip, FAR const char *fmt, size_t length = 0; FAR struct tcb_s *tcb = this_task(); - if (!note_isenabled_dump(tag)) - { - return; - } - for (driver = g_note_drivers; *driver; driver++) { + if (!note_isenabled_dump(*driver, tag)) + { + continue; + } + if (note_vprintf(*driver, ip, fmt, va)) { continue; @@ -1778,21 +1770,46 @@ void sched_note_printf_ip(uint32_t tag, uintptr_t ip, FAR const char *fmt, * ****************************************************************************/ -void sched_note_filter_mode(FAR struct note_filter_mode_s *oldm, - FAR struct note_filter_mode_s *newm) +void sched_note_filter_mode(FAR struct note_filter_named_mode_s *oldm, + FAR struct note_filter_named_mode_s *newm) { irqstate_t irq_mask; + FAR struct note_driver_s **driver; irq_mask = spin_lock_irqsave_wo_note(&g_note_lock); if (oldm != NULL) { - *oldm = g_note_filter.mode; + for (driver = g_note_drivers; *driver; driver++) + { + if (oldm->name[0] == '\0') + { + oldm->mode = (*driver)->filter.mode; + strlcpy(oldm->name, (*driver)->name, NAME_MAX); + break; + } + else if (strcmp((*driver)->name, oldm->name) == 0) + { + oldm->mode = (*driver)->filter.mode; + break; + } + } } if (newm != NULL) { - g_note_filter.mode = *newm; + for (driver = g_note_drivers; *driver; driver++) + { + if (newm->name[0] == '\0') + { + (*driver)->filter.mode = newm->mode; + } + else if (0 == strcmp((*driver)->name, newm->name)) + { + (*driver)->filter.mode = newm->mode; + break; + } + } } spin_unlock_irqrestore_wo_note(&g_note_lock, irq_mask); @@ -1819,25 +1836,46 @@ void sched_note_filter_mode(FAR struct note_filter_mode_s *oldm, ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL -void sched_note_filter_syscall(FAR struct note_filter_syscall_s *oldf, - FAR struct note_filter_syscall_s *newf) +void sched_note_filter_syscall(FAR struct note_filter_named_syscall_s *oldf, + FAR struct note_filter_named_syscall_s *newf) { irqstate_t irq_mask; + FAR struct note_driver_s **driver; irq_mask = spin_lock_irqsave_wo_note(&g_note_lock); if (oldf != NULL) { - /* Return the current filter setting */ - - *oldf = g_note_filter.syscall_mask; + for (driver = g_note_drivers; *driver; driver++) + { + if (oldf->name[0] == '\0') + { + oldf->syscall_mask = (*driver)->filter.syscall_mask; + strlcpy(oldf->name, (*driver)->name, NAME_MAX); + break; + } + else if (strcmp((*driver)->name, oldf->name) == 0) + { + oldf->syscall_mask = (*driver)->filter.syscall_mask; + break; + } + } } if (newf != NULL) { - /* Replace the syscall filter mask by the provided setting */ - - g_note_filter.syscall_mask = *newf; + for (driver = g_note_drivers; *driver; driver++) + { + if (newf->name[0] == '\0') + { + (*driver)->filter.syscall_mask = newf->syscall_mask; + } + else if (0 == strcmp((*driver)->name, newf->name)) + { + (*driver)->filter.syscall_mask = newf->syscall_mask; + break; + } + } } spin_unlock_irqrestore_wo_note(&g_note_lock, irq_mask); @@ -1865,25 +1903,46 @@ void sched_note_filter_syscall(FAR struct note_filter_syscall_s *oldf, ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER -void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf, - FAR struct note_filter_irq_s *newf) +void sched_note_filter_irq(FAR struct note_filter_named_irq_s *oldf, + FAR struct note_filter_named_irq_s *newf) { irqstate_t irq_mask; + FAR struct note_driver_s **driver; irq_mask = spin_lock_irqsave_wo_note(&g_note_lock); if (oldf != NULL) { - /* Return the current filter setting */ - - *oldf = g_note_filter.irq_mask; + for (driver = g_note_drivers; *driver; driver++) + { + if (oldf->name[0] == '\0') + { + oldf->irq_mask = (*driver)->filter.irq_mask; + strlcpy(oldf->name, (*driver)->name, NAME_MAX); + break; + } + else if (strcmp((*driver)->name, oldf->name) == 0) + { + oldf->irq_mask = (*driver)->filter.irq_mask; + break; + } + } } if (newf != NULL) { - /* Replace the syscall filter mask by the provided setting */ - - g_note_filter.irq_mask = *newf; + for (driver = g_note_drivers; *driver; driver++) + { + if (newf->name[0] == '\0') + { + (*driver)->filter.irq_mask = newf->irq_mask; + } + else if (0 == strcmp((*driver)->name, newf->name)) + { + (*driver)->filter.irq_mask = newf->irq_mask; + break; + } + } } spin_unlock_irqrestore_wo_note(&g_note_lock, irq_mask); @@ -1911,25 +1970,46 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf, ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP -void sched_note_filter_tag(FAR struct note_filter_tag_s *oldf, - FAR struct note_filter_tag_s *newf) +void sched_note_filter_tag(FAR struct note_filter_named_tag_s *oldf, + FAR struct note_filter_named_tag_s *newf) { irqstate_t falgs; + FAR struct note_driver_s **driver; falgs = spin_lock_irqsave_wo_note(&g_note_lock); if (oldf != NULL) { - /* Return the current filter setting */ - - *oldf = g_note_filter.tag_mask; + for (driver = g_note_drivers; *driver; driver++) + { + if (oldf->name[0] == '\0') + { + oldf->tag_mask = (*driver)->filter.tag_mask; + strlcpy(oldf->name, (*driver)->name, NAME_MAX); + break; + } + else if (strcmp((*driver)->name, oldf->name) == 0) + { + oldf->tag_mask = (*driver)->filter.tag_mask; + break; + } + } } if (newf != NULL) { - /* Replace the dump filter mask by the provided setting */ - - g_note_filter.tag_mask = *newf; + for (driver = g_note_drivers; *driver; driver++) + { + if (newf->name[0] == '\0') + { + (*driver)->filter.tag_mask = newf->tag_mask; + } + else if (0 == strcmp((*driver)->name, newf->name)) + { + (*driver)->filter.tag_mask = newf->tag_mask; + break; + } + } } spin_unlock_irqrestore_wo_note(&g_note_lock, falgs); diff --git a/drivers/note/notectl_driver.c b/drivers/note/notectl_driver.c index 1769c1cfbdb..c1b5229a7a7 100644 --- a/drivers/note/notectl_driver.c +++ b/drivers/note/notectl_driver.c @@ -38,7 +38,7 @@ * Private Function Prototypes ****************************************************************************/ -static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg); +static int notectl_ioctl(FAR struct file *filep, int cmd, unsigned long arg); /**************************************************************************** * Private Data @@ -62,7 +62,7 @@ static const struct file_operations g_notectl_fops = * Name: notectl_ioctl ****************************************************************************/ -static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) +static int notectl_ioctl(FAR struct file *filep, int cmd, unsigned long arg) { int ret = -ENOSYS; @@ -77,7 +77,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_GETMODE: { - struct note_filter_mode_s *mode = (struct note_filter_mode_s *)arg; + FAR struct note_filter_named_mode_s *mode = + (FAR struct note_filter_named_mode_s *)arg; if (mode == NULL) { @@ -98,7 +99,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_SETMODE: { - struct note_filter_mode_s *mode = (struct note_filter_mode_s *)arg; + FAR struct note_filter_named_mode_s *mode = + (FAR struct note_filter_named_mode_s *)arg; if (mode == NULL) { @@ -120,8 +122,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_GETSYSCALLFILTER: { - struct note_filter_syscall_s *filter; - filter = (struct note_filter_syscall_s *)arg; + FAR struct note_filter_named_syscall_s *filter; + filter = (FAR struct note_filter_named_syscall_s *)arg; if (filter == NULL) { @@ -142,8 +144,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_SETSYSCALLFILTER: { - struct note_filter_syscall_s *filter; - filter = (struct note_filter_syscall_s *)arg; + FAR struct note_filter_named_syscall_s *filter; + filter = (FAR struct note_filter_named_syscall_s *)arg; if (filter == NULL) { @@ -166,8 +168,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_GETIRQFILTER: { - struct note_filter_irq_s *filter; - filter = (struct note_filter_irq_s *)arg; + FAR struct note_filter_named_irq_s *filter; + filter = (FAR struct note_filter_named_irq_s *)arg; if (filter == NULL) { @@ -189,8 +191,8 @@ static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) case NOTECTL_SETIRQFILTER: { - struct note_filter_irq_s *filter; - filter = (struct note_filter_irq_s *)arg; + FAR struct note_filter_named_irq_s *filter; + filter = (FAR struct note_filter_named_irq_s *)arg; if (filter == NULL) { diff --git a/drivers/note/notelog_driver.c b/drivers/note/notelog_driver.c index ccce11aee0d..790c804599d 100644 --- a/drivers/note/notelog_driver.c +++ b/drivers/note/notelog_driver.c @@ -124,6 +124,17 @@ static const struct note_driver_ops_s g_notelog_ops = struct note_driver_s g_notelog_driver = { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "log", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif &g_notelog_ops, }; diff --git a/drivers/note/noteram_driver.c b/drivers/note/noteram_driver.c index 79b7d5dfbd8..c90d2483f38 100644 --- a/drivers/note/noteram_driver.c +++ b/drivers/note/noteram_driver.c @@ -146,7 +146,20 @@ static const struct note_driver_ops_s g_noteram_ops = struct noteram_driver_s g_noteram_driver = { - {&g_noteram_ops}, + { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "ram", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif + &g_noteram_ops + }, g_ramnote_buffer, CONFIG_DRIVERS_NOTERAM_BUFSIZE, #ifdef CONFIG_DRIVERS_NOTERAM_DEFAULT_NOOVERWRITE @@ -1339,17 +1352,35 @@ FAR struct note_driver_s * noteram_initialize(FAR const char *devpath, size_t bufsize, bool overwrite) { FAR struct noteram_driver_s *drv; +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + size_t len = strlen(devpath) + 1; +#else + size_t len = 0; +#endif int ret; - drv = kmm_malloc(sizeof(*drv) + bufsize); + drv = kmm_malloc(sizeof(*drv) + len + bufsize); if (drv == NULL) { return NULL; } +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + + memcpy(drv + 1, devpath, len); + drv->driver.name = (FAR const char *)(drv + 1); + drv->driver.filter.mode.flag = + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE; + +# ifdef CONFIG_SMP + drv->driver.filter.mode.cpuset = + CONFIG_SCHED_INSTRUMENTATION_CPUSET; +# endif + +#endif drv->driver.ops = &g_noteram_ops; drv->ni_bufsize = bufsize; - drv->ni_buffer = (FAR uint8_t *)(drv + 1); + drv->ni_buffer = (FAR uint8_t *)(drv + 1) + len; drv->ni_overwrite = overwrite; drv->ni_head = 0; drv->ni_tail = 0; diff --git a/drivers/note/noterpmsg_driver.c b/drivers/note/noterpmsg_driver.c index d1029ec7b5b..e0519f0da2d 100644 --- a/drivers/note/noterpmsg_driver.c +++ b/drivers/note/noterpmsg_driver.c @@ -67,7 +67,20 @@ static const struct note_driver_ops_s g_noterpmsg_ops = struct noterpmsg_driver_s g_noterpmsg_driver = { - {&g_noterpmsg_ops}, + { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "rpmsg", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif + &g_noterpmsg_ops + }, }; /**************************************************************************** diff --git a/drivers/note/notesnap_driver.c b/drivers/note/notesnap_driver.c index e762b672256..2ab4dcfef69 100644 --- a/drivers/note/notesnap_driver.c +++ b/drivers/note/notesnap_driver.c @@ -150,7 +150,20 @@ static const struct note_driver_ops_s g_notesnap_ops = static struct notesnap_s g_notesnap = { - {&g_notesnap_ops} + { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "snap", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif + &g_notesnap_ops + } }; static FAR const char *g_notesnap_type[] = diff --git a/drivers/note/notestream_driver.c b/drivers/note/notestream_driver.c index 2b945281775..b84436218e1 100644 --- a/drivers/note/notestream_driver.c +++ b/drivers/note/notestream_driver.c @@ -65,6 +65,17 @@ static const struct note_driver_ops_s g_notestream_ops = struct notestream_driver_s g_notestream_lowerout = { { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "lowerout", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif &g_notestream_ops }, &g_lowoutstream @@ -91,14 +102,32 @@ static void notestream_add(FAR struct note_driver_s *drv, int notefile_register(FAR const char *filename) { FAR struct notestream_file_s *notefile; +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + size_t len = strlen(filename) + 1; +#else + size_t len = 0; +#endif int ret; - notefile = kmm_zalloc(sizeof(struct notestream_file_s)); + notefile = kmm_zalloc(sizeof(struct notestream_file_s) + len); if (notefile == NULL) { return -ENOMEM; } +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + memcpy(notefile + 1, filename, len); + notefile->driver.driver.name = (FAR const char *)(notefile + 1); + notefile->driver.driver.filter.mode.flag = + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE; + +# ifdef CONFIG_SMP + notefile->driver.driver.filter.mode.cpuset = + CONFIG_SCHED_INSTRUMENTATION_CPUSET; +# endif + +#endif + notefile->driver.stream = ¬efile->filestream.common; ret = file_open(¬efile->file, filename, O_WRONLY); if (ret < 0) diff --git a/drivers/segger/note_rtt.c b/drivers/segger/note_rtt.c index 2ad8bc8bfc1..c97e056dc4b 100644 --- a/drivers/segger/note_rtt.c +++ b/drivers/segger/note_rtt.c @@ -55,6 +55,17 @@ static const struct note_driver_ops_s g_notertt_ops = struct notertt_s g_notertt = { { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "rtt", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif &g_notertt_ops } }; diff --git a/drivers/segger/note_sysview.c b/drivers/segger/note_sysview.c index 548b3c3b33e..9814c7575f7 100644 --- a/drivers/segger/note_sysview.c +++ b/drivers/segger/note_sysview.c @@ -45,9 +45,6 @@ struct note_sysview_driver_s { struct note_driver_s driver; unsigned int irq[CONFIG_SMP_NCPUS]; -#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL - struct note_filter_syscall_s syscall_marker; -#endif }; /**************************************************************************** @@ -144,6 +141,17 @@ static const struct note_driver_ops_s g_note_sysview_ops = static struct note_sysview_driver_s g_note_sysview_driver = { { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + "sysview", + { + { + CONFIG_SCHED_INSTRUMENTATION_FILTER_DEFAULT_MODE, +# ifdef CONFIG_SMP + CONFIG_SCHED_INSTRUMENTATION_CPUSET +# endif + }, + }, +#endif &g_note_sysview_ops } }; @@ -307,7 +315,8 @@ static void note_sysview_syscall_enter(FAR struct note_driver_s *drv, int nr, /* Set the name marker if the current syscall nr is not active */ - if (NOTE_FILTER_SYSCALLMASK_ISSET(nr, &driver->syscall_marker) == 0) + if (NOTE_FILTER_SYSCALLMASK_ISSET(nr, + &driver->driver.filter.syscall_mask) == 0) { /* Set the name marker */ @@ -315,16 +324,18 @@ static void note_sysview_syscall_enter(FAR struct note_driver_s *drv, int nr, /* Mark the syscall active */ - NOTE_FILTER_SYSCALLMASK_SET(nr, &driver->syscall_marker); + NOTE_FILTER_SYSCALLMASK_SET(nr, &driver->driver.filter.syscall_mask); /* Use the Syscall "0" to identify whether the syscall is enabled, * if the host tool is closed abnormally, use this bit to clear * the active set. */ - if (NOTE_FILTER_SYSCALLMASK_ISSET(0, &driver->syscall_marker) == 0) + if (NOTE_FILTER_SYSCALLMASK_ISSET(0, + &driver->driver.filter.syscall_mask) == 0) { - NOTE_FILTER_SYSCALLMASK_SET(0, &driver->syscall_marker); + NOTE_FILTER_SYSCALLMASK_SET(0, + &driver->driver.filter.syscall_mask); } } @@ -338,7 +349,7 @@ static void note_sysview_syscall_leave(FAR struct note_driver_s *drv, (FAR struct note_sysview_driver_s *)drv; nr -= CONFIG_SYS_RESERVED; - if (NOTE_FILTER_SYSCALLMASK_ISSET(nr, &driver->syscall_marker) != 0) + if (NOTE_FILTER_SYSCALLMASK_ISSET(nr, &driver->driver.filter.syscall_mask)) { SEGGER_SYSVIEW_MarkStop(nr); } diff --git a/include/nuttx/note/note_driver.h b/include/nuttx/note/note_driver.h index 44895c9d6d8..4e103b31fff 100644 --- a/include/nuttx/note/note_driver.h +++ b/include/nuttx/note/note_driver.h @@ -32,6 +32,7 @@ #include #include +#include /**************************************************************************** * Pre-processor Definitions @@ -108,8 +109,28 @@ struct note_driver_ops_s #endif }; +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER +struct note_filter_s +{ + struct note_filter_mode_s mode; +# ifdef CONFIG_SCHED_INSTRUMENTATION_DUMP + struct note_filter_tag_s tag_mask; +# endif +# ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER + struct note_filter_irq_s irq_mask; +# endif +# ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL + struct note_filter_syscall_s syscall_mask; +# endif +}; +#endif + struct note_driver_s { +#ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER + FAR const char *name; + struct note_filter_s filter; +#endif FAR const struct note_driver_ops_s *ops; }; diff --git a/include/nuttx/sched_note.h b/include/nuttx/sched_note.h index 3d755e0abfe..2953eed0e3d 100644 --- a/include/nuttx/sched_note.h +++ b/include/nuttx/sched_note.h @@ -517,6 +517,12 @@ struct note_filter_mode_s #endif }; +struct note_filter_named_mode_s +{ + char name[NAME_MAX]; + struct note_filter_mode_s mode; +}; + /* This is the type of the argument passed to the NOTECTL_GETSYSCALLFILTER * and NOTECTL_SETSYSCALLFILTER ioctls */ @@ -526,6 +532,12 @@ struct note_filter_syscall_s { uint8_t syscall_mask[(SYS_nsyscalls + 7) / 8]; }; + +struct note_filter_named_syscall_s +{ + char name[NAME_MAX]; + struct note_filter_syscall_s syscall_mask; +}; #endif /* This is the type of the argument passed to the NOTECTL_GETIRQFILTER and @@ -537,11 +549,23 @@ struct note_filter_irq_s uint8_t irq_mask[(NR_IRQS + 7) / 8]; }; +struct note_filter_named_irq_s +{ + char name[NAME_MAX]; + struct note_filter_irq_s irq_mask; +}; + struct note_filter_tag_s { uint8_t tag_mask[(NOTE_TAG_MAX + 7) / 8]; }; +struct note_filter_named_tag_s +{ + char name[NAME_MAX]; + struct note_filter_tag_s tag_mask; +}; + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ @@ -682,8 +706,8 @@ void sched_note_printf_ip(uint32_t tag, uintptr_t ip, FAR const char *fmt, ****************************************************************************/ #ifdef CONFIG_SCHED_INSTRUMENTATION_FILTER -void sched_note_filter_mode(FAR struct note_filter_mode_s *oldm, - FAR struct note_filter_mode_s *newm); +void sched_note_filter_mode(FAR struct note_filter_named_mode_s *oldm, + FAR struct note_filter_named_mode_s *newm); #endif /**************************************************************************** @@ -708,8 +732,8 @@ void sched_note_filter_mode(FAR struct note_filter_mode_s *oldm, #if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) && \ defined(CONFIG_SCHED_INSTRUMENTATION_SYSCALL) -void sched_note_filter_syscall(FAR struct note_filter_syscall_s *oldf, - FAR struct note_filter_syscall_s *newf); +void sched_note_filter_syscall(FAR struct note_filter_named_syscall_s *oldf, + FAR struct note_filter_named_syscall_s *newf); #endif /**************************************************************************** @@ -734,14 +758,14 @@ void sched_note_filter_syscall(FAR struct note_filter_syscall_s *oldf, #if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) && \ defined(CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER) -void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf, - FAR struct note_filter_irq_s *newf); +void sched_note_filter_irq(FAR struct note_filter_named_irq_s *oldf, + FAR struct note_filter_named_irq_s *newf); #endif #if defined(CONFIG_SCHED_INSTRUMENTATION_FILTER) && \ defined(CONFIG_SCHED_INSTRUMENTATION_DUMP) -void sched_note_filter_tag(FAR struct note_filter_tag_s *oldf, - FAR struct note_filter_tag_s *newf); +void sched_note_filter_tag(FAR struct note_filter_named_tag_s *oldf, + FAR struct note_filter_named_tag_s *newf); #endif #endif /* defined(__KERNEL__) || defined(CONFIG_BUILD_FLAT) */