| ===================== |
| Note Driver Interface |
| ===================== |
| |
| Note driver is the interface to access the instrumentation data. |
| The following devices are provided. |
| |
| - :ref:`notectl` |
| - :ref:`noteram` |
| |
| .. _notectl: |
| |
| Notectl Device (``/dev/notectl``) |
| ================================= |
| |
| ``/dev/notectl`` is the device to control an instrumentation filter in NuttX kernel. |
| The device has only ioctl function to control the filter. |
| |
| ``/dev/notectl`` Header Files |
| ----------------------------- |
| |
| The header file ``include/nuttx/note/notectl_driver.h`` provides the interface definitions of the device. |
| |
| ``/dev/notectl`` Data Structures |
| -------------------------------- |
| |
| .. c:struct:: note_filter_mode_s |
| |
| .. code-block:: c |
| |
| struct note_filter_mode_s |
| { |
| unsigned int flag; /* Filter mode flag */ |
| #ifdef CONFIG_SMP |
| unsigned int cpuset; /* The set of monitored CPUs */ |
| #endif |
| }; |
| |
| - ``flag`` : Filter mode flag. The bitwise OR of the following defines are available. |
| |
| .. c:macro:: NOTE_FILTER_MODE_FLAG_ENABLE |
| |
| Enable instrumentation |
| |
| .. c:macro:: NOTE_FILTER_MODE_FLAG_SYSCALL |
| |
| Enable syscall instrumentation |
| |
| .. c:macro:: NOTE_FILTER_MODE_FLAG_IRQ |
| |
| Enable IRQ instrumentation |
| |
| - ``cpuset`` : (SMP only) Monitor only CPUs in the bitset. Bit 0=CPU0, Bit1=CPU1, etc. |
| |
| .. c:struct:: note_filter_syscall_s |
| |
| .. code-block:: c |
| |
| struct note_filter_syscall_s |
| { |
| uint8_t syscall_mask[]; |
| }; |
| |
| - ``syscall_mask`` : A bitmap array of the syscall filter. If a bit is set, the corresponding syscall is not recorded. |
| The following helper macros are available: |
| |
| .. c:macro:: NOTE_FILTER_SYSCALLMASK_SET(nr, s) |
| |
| Set syscall number `nr` as masked. `s` specifies the variable of `struct note_filter_syscall_s` |
| |
| .. c:macro:: NOTE_FILTER_SYSCALLMASK_CLR(nr, s) |
| |
| Set syscall number `nr` as unmasked. |
| |
| .. c:macro:: NOTE_FILTER_SYSCALLMASK_ISSET(nr, s) |
| |
| Check whether syscall number `nr` is masked or not. True if masked. |
| |
| .. c:macro:: NOTE_FILTER_SYSCALLMASK_ZERO(s) |
| |
| Clear all masks. |
| |
| .. c:struct:: note_filter_irq_s |
| |
| .. code-block:: c |
| |
| struct note_filter_irq_s |
| { |
| uint8_t irq_mask[]; |
| }; |
| |
| - ``irq_mask`` : A bitmap array of the IRQ filter. If a bit is set, the corresponding IRQ is not recorded. |
| The following helper macros are available: |
| |
| .. c:macro:: NOTE_FILTER_IRQMASK_SET(nr, s) |
| |
| Set IRQ number `nr` as masked. `s` specifies the variable of `struct note_filter_irq_s` |
| |
| .. c:macro:: NOTE_FILTER_IRQMASK_CLR(nr, s) |
| |
| Set IRQ number `nr` as unmasked. |
| |
| .. c:macro:: NOTE_FILTER_IRQMASK_ISSET(nr, s) |
| |
| Check whether IRQ number `nr` is masked or not. True if masked. |
| |
| .. c:macro:: NOTE_FILTER_IRQMASK_ZERO(s) |
| |
| Clear all masks. |
| |
| ``/dev/notectl`` Ioctls |
| ----------------------- |
| |
| .. c:macro:: NOTECTL_GETMODE |
| |
| Get note filter mode |
| |
| :argument: A writable pointer to :c:struct:`note_filter_mode_s` |
| |
| :return: If success, 0 (``OK``) is returned and current note filter mode is stored into the given pointer. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTECTL_SETMODE |
| |
| Set note filter mode |
| |
| :argument: A read-only pointer to :c:struct:`note_filter_mode_s` |
| |
| :return: If success, 0 (``OK``) is returned and the given filter mode is set as the current settings. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTECTL_GETSYSCALLFILTER |
| |
| Get syscall filter setting |
| |
| :argument: A writable pointer to :c:struct:`note_filter_syscall_s` |
| |
| :return: If success, 0 (``OK``) is returned and current syscall filter mode is stored into the given pointer. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTECTL_SETSYSCALLFILTER |
| |
| Set syscall filter setting |
| |
| :argument: A read-only pointer to :c:struct:`note_filter_syscall_s` |
| |
| :return: If success, 0 (``OK``) is returned and the given syscall filter mode is set as the current settings. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTECTL_GETIRQFILTER |
| |
| Get IRQ filter setting |
| |
| :argument: A writable pointer to :c:struct:`note_filter_irq_s` |
| |
| :return: If success, 0 (``OK``) is returned and current IRQ filter mode is stored into the given pointer. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTECTL_SETIRQFILTER |
| |
| Set IRQ filter setting |
| |
| :argument: A read-only pointer to :c:struct:`note_filter_irq_s` |
| |
| :return: If success, 0 (``OK``) is returned and the given IRQ filter mode is set as the current settings. |
| If failed, a negated ``errno`` is returned. |
| |
| .. _noteram: |
| |
| Noteram Device (``/dev/note``) |
| ============================== |
| |
| ``/dev/note`` is the device to get the trace (instrumentation) data. |
| The device has read function to get the data and ioctl function to control the buffer mode. |
| |
| ``/dev/note`` Header Files |
| -------------------------- |
| |
| The header file ``include/nuttx/note/noteram_driver.h`` provides the interface definitions of the device. |
| |
| ``/dev/note`` Data Structures |
| -------------------------------- |
| |
| .. c:struct:: noteram_get_taskname_s |
| |
| .. code-block:: c |
| |
| struct noteram_get_taskname_s |
| { |
| pid_t pid; |
| char taskname[CONFIG_TASK_NAME_SIZE + 1]; |
| }; |
| |
| - ``pid`` : Task ID to get the task name. |
| |
| - ``taskname`` : The task name string corresponding to given pid. |
| |
| ``/dev/note`` Ioctls |
| -------------------- |
| |
| .. c:macro:: NOTERAM_CLEAR |
| |
| Clear all contents of the circular buffer |
| |
| :argument: Ignored |
| |
| :return: Always returns 0. |
| |
| .. c:macro:: NOTERAM_GETMODE |
| |
| Get overwrite mode |
| |
| :argument: A writable pointer to ``unsigned int``. |
| The overwrite mode takes one of the following values. |
| |
| .. c:macro:: NOTERAM_MODE_OVERWRITE_DISABLE |
| |
| Overwrite mode is disabled. When the buffer is full, accepting the data will be stopped. |
| |
| .. c:macro:: NOTERAM_MODE_OVERWRITE_ENABLE |
| |
| Overwrite mode is enabled. |
| |
| .. c:macro:: NOTERAM_MODE_OVERWRITE_OVERFLOW |
| |
| Overwrite mode is disabled and the buffer is already full. |
| |
| :return: If success, 0 (``OK``) is returned and current overwrite mode is stored into the given pointer. |
| If failed, a negated ``errno`` is returned. |
| |
| .. c:macro:: NOTERAM_SETMODE |
| |
| Set overwrite mode |
| |
| :argument: A read-only pointer to ``unsigned int``. |
| |
| :return: If success, 0 (``OK``) is returned and the given overwriter mode is set as the current settings. |
| If failed, a negated ``errno`` is returned. |
| |
| Filter control APIs |
| =================== |
| |
| The following APIs are the functions to control note filters directly. |
| These are kernel APIs and application can use them only in FLAT build. |
| |
| The header file ``include/nuttx/sched_note.h`` is needed to use the following APIs. |
| |
| API description |
| --------------- |
| |
| .. c:function:: void sched_note_filter_mode(struct note_filter_mode_s *oldm, struct note_filter_mode_s *newm); |
| |
| Set and get note filter mode. |
| (Same as :c:macro:`NOTECTL_GETMODE` / :c:macro:`NOTECTL_SETMODE` ioctls) |
| |
| :param oldm: A writable pointer to :c:struct:`note_filter_mode_s` to get current filter mode. |
| If 0, no data is written. |
| :param newm: A read-only pointer to :c:struct:`note_filter_mode_s` which holds the new filter mode. |
| If 0, the filter mode is not updated. |
| |
| :return: None |
| |
| .. c:function:: void sched_note_filter_syscall(struct note_filter_syscall_s *oldf, struct note_filter_syscall_s *newf); |
| |
| Set and get syscall filter setting. |
| (Same as :c:macro:`NOTECTL_GETSYSCALLFILTER` / :c:macro:`NOTECTL_SETSYSCALLFILTER` ioctls) |
| |
| :param oldf: A writable pointer to :c:struct:`note_filter_syscall_s` to get current syscall filter setting. |
| If 0, no data is written. |
| :param newf: A read-only pointer to :c:struct:`note_filter_syscall_s` of the new syscall filter setting. |
| If 0, the setting is not updated. |
| |
| :return: None |
| |
| .. c:function:: void sched_note_filter_irq(struct note_filter_irq_s *oldf, struct note_filter_irq_s *newf); |
| |
| Set and get IRQ filter setting. |
| (Same as :c:macro:`NOTECTL_GETIRQFILTER` / :c:macro:`NOTECTL_SETIRQFILTER` ioctls) |
| |
| :param oldf: A writable pointer to :c:struct:`note_filter_irq_s` to get current IRQ filter setting. |
| If 0, no data is written. |
| :param newf: A read-only pointer to :c:struct:`note_filter_irq_s` of the new IRQ filter setting. |
| If 0, the setting is not updated. |
| |
| :return: None |