diff --git a/drivers/note/Kconfig b/drivers/note/Kconfig index 2286d635af..a467d78477 100644 --- a/drivers/note/Kconfig +++ b/drivers/note/Kconfig @@ -55,4 +55,12 @@ config DRIVER_NOTERAM_BUFSIZE ---help--- The size of the in-memory, circular instrumentation buffer (in bytes). +config DRIVER_NOTECTL + bool "Scheduler instrumentation filter control driver" + default n + depends on SCHED_INSTRUMENTATION_FILTER + ---help--- + If this option is selected, the instrumentation filter control device + /dev/notectl is provided. + endif diff --git a/drivers/note/Make.defs b/drivers/note/Make.defs index d978711af7..943e4ff01c 100644 --- a/drivers/note/Make.defs +++ b/drivers/note/Make.defs @@ -26,5 +26,9 @@ ifeq ($(CONFIG_DRIVER_NOTERAM),y) CSRCS += noteram_driver.c endif +ifeq ($(CONFIG_DRIVER_NOTECTL),y) + CSRCS += notectl_driver.c +endif + DEPPATH += --dep-path note VPATH += :note diff --git a/drivers/note/note_driver.c b/drivers/note/note_driver.c index fe104efafe..93c24665cb 100644 --- a/drivers/note/note_driver.c +++ b/drivers/note/note_driver.c @@ -24,6 +24,7 @@ #include #include +#include /**************************************************************************** * Public Functions @@ -56,5 +57,13 @@ int note_register(void) } #endif +#ifdef CONFIG_DRIVER_NOTECTL + ret = notectl_register(); + if (ret < 0) + { + return ret; + } +#endif + return ret; } diff --git a/drivers/note/notectl_driver.c b/drivers/note/notectl_driver.c new file mode 100644 index 0000000000..05ed3babf6 --- /dev/null +++ b/drivers/note/notectl_driver.c @@ -0,0 +1,241 @@ +/**************************************************************************** + * drivers/note/notectl_driver.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct file_operations notectl_fops = +{ + NULL, /* open */ + NULL, /* close */ + NULL, /* read */ + NULL, /* write */ + NULL, /* seek */ + notectl_ioctl, /* ioctl */ + NULL /* poll */ +#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS + , 0 /* unlink */ +#endif +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: notectl_ioctl + ****************************************************************************/ + +static int notectl_ioctl(struct file *filep, int cmd, unsigned long arg) +{ + int ret = -ENOSYS; + + /* Handle the ioctl commands */ + + switch (cmd) + { + /* NOTECTL_GETMODE + * - Get note filter mode + * Argument: A writable pointer to struct note_filter_mode_s + */ + + case NOTECTL_GETMODE: + { + struct note_filter_mode_s *mode = (struct note_filter_mode_s *)arg; + + if (mode == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_mode(mode, NULL); + ret = OK; + } + } + break; + + /* NOTECTL_SETMODE + * - Set note filter mode + * Argument: A read-only pointer to struct note_filter_mode_s + */ + + case NOTECTL_SETMODE: + { + struct note_filter_mode_s *mode = (struct note_filter_mode_s *)arg; + + if (mode == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_mode(NULL, mode); + ret = OK; + } + } + break; + +#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL + /* NOTECTL_GETSYSCALLFILTER + * - Get syscall filter setting + * Argument: A writable pointer to struct note_filter_syscall_s + */ + + case NOTECTL_GETSYSCALLFILTER: + { + struct note_filter_syscall_s *filter; + filter = (struct note_filter_syscall_s *)arg; + + if (filter == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_syscall(filter, NULL); + ret = OK; + } + } + break; + + /* NOTECTL_SETSYSCALLFILTER + * - Set syscall filter setting + * Argument: A read-only pointer to struct note_filter_syscall_s + */ + + case NOTECTL_SETSYSCALLFILTER: + { + struct note_filter_syscall_s *filter; + filter = (struct note_filter_syscall_s *)arg; + + if (filter == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_syscall(NULL, filter); + ret = OK; + } + } + break; +#endif + +#ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER + /* NOTECTL_GETIRQFILTER + * - Get IRQ filter setting + * Argument: A writable pointer to struct note_filter_irq_s + */ + + case NOTECTL_GETIRQFILTER: + { + struct note_filter_irq_s *filter; + filter = (struct note_filter_irq_s *)arg; + + if (filter == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_irq(filter, NULL); + ret = OK; + } + } + break; + + /* NOTECTL_SETIRQFILTER + * - Set IRQ filter setting + * Argument: A read-only pointer to struct + * note_filter_irq_s + */ + + case NOTECTL_SETIRQFILTER: + { + struct note_filter_irq_s *filter; + filter = (struct note_filter_irq_s *)arg; + + if (filter == NULL) + { + ret = -EINVAL; + } + else + { + sched_note_filter_irq(NULL, filter); + ret = OK; + } + } + break; +#endif + + default: + break; + } + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: notectl_register + * + * Description: + * Register a driver at /dev/notectl that can be used by an application to + * control the note filter. + * + * Input Parameters: + * None. + * + * Returned Value: + * Zero on succress. A negated errno value is returned on a failure. + * + ****************************************************************************/ + +int notectl_register(void) +{ + return register_driver("/dev/notectl", ¬ectl_fops, 0666, NULL); +} diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index 7397b96de9..cc61b377b4 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -97,6 +97,7 @@ #define _NXTERMBASE (0x2900) /* NxTerm character driver ioctl commands */ #define _RFIOCBASE (0x2a00) /* RF devices ioctl commands */ #define _RPTUNBASE (0x2b00) /* Remote processor tunnel ioctl commands */ +#define _NOTECTLBASE (0x2c00) /* Note filter control ioctl commands*/ #define _WLIOCBASE (0x8b00) /* Wireless modules ioctl network commands */ /* boardctl() commands share the same number space */ @@ -527,6 +528,11 @@ #define _RPTUNIOCVALID(c) (_IOC_TYPE(c)==_RPTUNBASE) #define _RPTUNIOC(nr) _IOC(_RPTUNBASE,nr) +/* Notectl drivers **********************************************************/ + +#define _NOTECTLIOCVALID(c) (_IOC_TYPE(c) == _NOTECTLBASE) +#define _NOTECTLIOC(nr) _IOC(_NOTECTLBASE, nr) + /* Wireless driver network ioctl definitions ********************************/ /* (see nuttx/include/wireless/wireless.h */ diff --git a/include/nuttx/note/notectl_driver.h b/include/nuttx/note/notectl_driver.h new file mode 100644 index 0000000000..c72e810b02 --- /dev/null +++ b/include/nuttx/note/notectl_driver.h @@ -0,0 +1,116 @@ +/**************************************************************************** + * include/nuttx/note/notectl_driver.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_NOTE_NOTECTL_DRIVER_H +#define __INCLUDE_NUTTX_NOTE_NOTECTL_DRIVER_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#ifdef CONFIG_SCHED_INSTRUMENTATION + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* IOCTL Commands ***********************************************************/ + +/* NOTECTL_GETMODE + * - Get note filter mode + * Argument: A writable pointer to struct note_filter_mode_s + * NOTECTL_SETMODE + * - Set note filter mode + * Argument: A read-only pointer to struct note_filter_mode_s + * NOTECTL_GETSYSCALLFILTER + * - Get syscall filter setting + * Argument: A writable pointer to struct + * note_filter_syscall_s + * NOTECTL_SETSYSCALLFILTER + * - Set syscall filter setting + * Argument: A read-only pointer to struct + * note_filter_syscall_s + * NOTECTL_GETIRQFILTER + * - Get IRQ filter setting + * Argument: A writable pointer to struct + * note_filter_irq_s + * NOTECTL_SETIRQFILTER + * - Set IRQ filter setting + * Argument: A read-only pointer to struct + * note_filter_irq_s + */ + +#ifdef CONFIG_DRIVER_NOTECTL + +#define NOTECTL_GETMODE _NOTECTLIOC(0x01) +#define NOTECTL_SETMODE _NOTECTLIOC(0x02) +#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL +#define NOTECTL_GETSYSCALLFILTER _NOTECTLIOC(0x03) +#define NOTECTL_SETSYSCALLFILTER _NOTECTLIOC(0x04) +#endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER +#define NOTECTL_GETIRQFILTER _NOTECTLIOC(0x05) +#define NOTECTL_SETIRQFILTER _NOTECTLIOC(0x06) +#endif + +#endif + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#if defined(__KERNEL__) || defined(CONFIG_BUILD_FLAT) + +/**************************************************************************** + * Name: notectl_register + * + * Description: + * Register a driver at /dev/notectl that can be used by an application to + * control the note filter. + * + * Input Parameters: + * None. + * + * Returned Value: + * Zero on succress. A negated errno value is returned on a failure. + * + ****************************************************************************/ + +#ifdef CONFIG_DRIVER_NOTECTL +int notectl_register(void); +#endif + +#endif /* defined(__KERNEL__) || defined(CONFIG_BUILD_FLAT) */ + +#endif /* CONFIG_SCHED_INSTRUMENTATION */ + +#endif /* __INCLUDE_NUTTX_NOTE_NOTECTL_DRIVER_H */