LCOV - code coverage report
Current view: top level - zephyr/sys - kobject.h Coverage Total Hit
Test: new.info Lines: 86.7 % 15 13
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2020 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_SYS_KOBJECT_H
       7              : #define ZEPHYR_INCLUDE_SYS_KOBJECT_H
       8              : 
       9              : #include <stdint.h>
      10              : #include <stddef.h>
      11              : 
      12              : #include <zephyr/sys/iterable_sections.h>
      13              : #include <zephyr/sys/internal/kobject_internal.h>
      14              : 
      15              : #ifdef __cplusplus
      16              : extern "C" {
      17              : #endif
      18              : 
      19              : struct k_thread;
      20              : struct k_mutex;
      21              : struct z_futex_data;
      22              : 
      23              : /**
      24              :  * @brief Kernel Object Types
      25              :  *
      26              :  * This enumeration needs to be kept in sync with the lists of kernel objects
      27              :  * and subsystems in scripts/build/gen_kobject_list.py, as well as the otype_to_str()
      28              :  * function in kernel/userspace.c
      29              :  */
      30            0 : enum k_objects {
      31              :         K_OBJ_ANY,
      32              : 
      33              :         /** @cond
      34              :          *  Doxygen should ignore this build-time generated include file
      35              :          *  when generating API documentation.  Enumeration values are
      36              :          *  generated during build by gen_kobject_list.py.  It includes
      37              :          *  basic kernel objects (e.g.  pipes and mutexes) and driver types.
      38              :          */
      39              : #include <zephyr/kobj-types-enum.h>
      40              :         /** @endcond
      41              :          */
      42              : 
      43              :         K_OBJ_LAST
      44              : };
      45              : /**
      46              :  * @defgroup usermode_apis User Mode APIs
      47              :  * @ingroup kernel_apis
      48              :  * @{
      49              :  */
      50              : 
      51              : #ifdef CONFIG_USERSPACE
      52              : 
      53              : /**
      54              :  * @brief Grant a static thread access to a list of kernel objects
      55              :  *
      56              :  * For threads declared with K_THREAD_DEFINE(), grant the thread access to
      57              :  * a set of kernel objects. These objects do not need to be in an initialized
      58              :  * state. The permissions will be granted when the threads are initialized
      59              :  * in the early boot sequence.
      60              :  *
      61              :  * All arguments beyond the first must be pointers to kernel objects.
      62              :  *
      63              :  * @param name_ Name of the thread, as passed to K_THREAD_DEFINE()
      64              :  */
      65            1 : #define K_THREAD_ACCESS_GRANT(name_, ...) \
      66              :         static void * const _CONCAT(_object_list_, name_)[] = \
      67              :                 { __VA_ARGS__, NULL }; \
      68              :         static const STRUCT_SECTION_ITERABLE(k_object_assignment, \
      69              :                                         _CONCAT(_object_access_, name_)) = \
      70              :                         { (&_k_thread_obj_ ## name_), \
      71              :                           (_CONCAT(_object_list_, name_)) }
      72              : 
      73              : /** Object initialized */
      74            1 : #define K_OBJ_FLAG_INITIALIZED  BIT(0)
      75              : /** Object is Public */
      76            1 : #define K_OBJ_FLAG_PUBLIC       BIT(1)
      77              : /** Object allocated */
      78            1 : #define K_OBJ_FLAG_ALLOC        BIT(2)
      79              : /** Driver Object */
      80            1 : #define K_OBJ_FLAG_DRIVER       BIT(3)
      81              : 
      82              : /**
      83              :  * Grant a thread access to a kernel object
      84              :  *
      85              :  * The thread will be granted access to the object if the caller is from
      86              :  * supervisor mode, or the caller is from user mode AND has permissions
      87              :  * on both the object and the thread whose access is being granted.
      88              :  *
      89              :  * @param object Address of kernel object
      90              :  * @param thread Thread to grant access to the object
      91              :  */
      92            1 : __syscall void k_object_access_grant(const void *object,
      93              :                                      struct k_thread *thread);
      94              : 
      95              : /**
      96              :  * Revoke a thread's access to a kernel object
      97              :  *
      98              :  * The thread will lose access to the object if the caller is from
      99              :  * supervisor mode, or the caller is from user mode AND has permissions
     100              :  * on both the object and the thread whose access is being revoked.
     101              :  *
     102              :  * @param object Address of kernel object
     103              :  * @param thread Thread to remove access to the object
     104              :  */
     105            1 : void k_object_access_revoke(const void *object, struct k_thread *thread);
     106              : 
     107              : /**
     108              :  * @brief Release an object
     109              :  *
     110              :  * Allows user threads to drop their own permission on an object
     111              :  * Their permissions are automatically cleared when a thread terminates.
     112              :  *
     113              :  * @param object The object to be released
     114              :  *
     115              :  */
     116            1 : __syscall void k_object_release(const void *object);
     117              : 
     118              : /**
     119              :  * Grant all present and future threads access to an object
     120              :  *
     121              :  * If the caller is from supervisor mode, or the caller is from user mode and
     122              :  * have sufficient permissions on the object, then that object will have
     123              :  * permissions granted to it for *all* current and future threads running in
     124              :  * the system, effectively becoming a public kernel object.
     125              :  *
     126              :  * Use of this API should be avoided on systems that are running untrusted code
     127              :  * as it is possible for such code to derive the addresses of kernel objects
     128              :  * and perform unwanted operations on them.
     129              :  *
     130              :  * It is not possible to revoke permissions on public objects; once public,
     131              :  * any thread may use it.
     132              :  *
     133              :  * @param object Address of kernel object
     134              :  */
     135            1 : void k_object_access_all_grant(const void *object);
     136              : 
     137              : /**
     138              :  * Check if a kernel object is of certain type and is valid.
     139              :  *
     140              :  * This checks if the kernel object exists, of certain type,
     141              :  * and has been initialized.
     142              :  *
     143              :  * @param obj Address of the kernel object
     144              :  * @param otype Object type (use K_OBJ_ANY for ignoring type checking)
     145              :  * @return True if kernel object (@a obj) exists, of certain type, and
     146              :  *         has been initialized. False otherwise.
     147              :  */
     148            1 : bool k_object_is_valid(const void *obj, enum k_objects otype);
     149              : 
     150              : #else
     151              : /* LCOV_EXCL_START */
     152              : #define K_THREAD_ACCESS_GRANT(thread, ...)
     153              : 
     154              : /**
     155              :  * @internal
     156              :  */
     157              : static inline void z_impl_k_object_access_grant(const void *object,
     158              :                                                 struct k_thread *thread)
     159              : {
     160              :         ARG_UNUSED(object);
     161              :         ARG_UNUSED(thread);
     162              : }
     163              : 
     164              : /**
     165              :  * @internal
     166              :  */
     167              : static inline void k_object_access_revoke(const void *object,
     168              :                                           struct k_thread *thread)
     169              : {
     170              :         ARG_UNUSED(object);
     171              :         ARG_UNUSED(thread);
     172              : }
     173              : 
     174              : /**
     175              :  * @internal
     176              :  */
     177              : static inline void z_impl_k_object_release(const void *object)
     178              : {
     179              :         ARG_UNUSED(object);
     180              : }
     181              : 
     182              : static inline void k_object_access_all_grant(const void *object)
     183              : {
     184              :         ARG_UNUSED(object);
     185              : }
     186              : 
     187              : static inline bool k_object_is_valid(const void *obj, enum k_objects otype)
     188              : {
     189              :         ARG_UNUSED(obj);
     190              :         ARG_UNUSED(otype);
     191              : 
     192              :         return true;
     193              : }
     194              : 
     195              : /* LCOV_EXCL_STOP */
     196              : #endif /* !CONFIG_USERSPACE */
     197              : 
     198              : #if defined(CONFIG_DYNAMIC_OBJECTS) || defined(__DOXYGEN__)
     199              : /**
     200              :  * Allocate a kernel object of a designated type
     201              :  *
     202              :  * This will instantiate at runtime a kernel object of the specified type,
     203              :  * returning a pointer to it. The object will be returned in an uninitialized
     204              :  * state, with the calling thread being granted permission on it. The memory
     205              :  * for the object will be allocated out of the calling thread's resource pool.
     206              :  *
     207              :  * @note This function is available only if @kconfig{CONFIG_DYNAMIC_OBJECTS}
     208              :  * is selected.
     209              :  *
     210              :  * @note Thread stack object has to use k_object_alloc_size() since stacks may
     211              :  * have different sizes.
     212              :  *
     213              :  * @param otype Requested kernel object type
     214              :  * @return A pointer to the allocated kernel object, or NULL if memory wasn't
     215              :  * available
     216              :  */
     217            1 : __syscall void *k_object_alloc(enum k_objects otype);
     218              : 
     219              : /**
     220              :  * Allocate a kernel object of a designated type and a given size
     221              :  *
     222              :  * This will instantiate at runtime a kernel object of the specified type,
     223              :  * returning a pointer to it. The object will be returned in an uninitialized
     224              :  * state, with the calling thread being granted permission on it. The memory
     225              :  * for the object will be allocated out of the calling thread's resource pool.
     226              :  *
     227              :  * This function is specially helpful for thread stack objects because
     228              :  * their sizes can vary. Other objects should probably look k_object_alloc().
     229              :  *
     230              :  * @note This function is available only if @kconfig{CONFIG_DYNAMIC_OBJECTS}
     231              :  * is selected.
     232              :  *
     233              :  * @param otype Requested kernel object type
     234              :  * @param size Requested kernel object size
     235              :  * @return A pointer to the allocated kernel object, or NULL if memory wasn't
     236              :  * available
     237              :  */
     238            1 : __syscall void *k_object_alloc_size(enum k_objects otype, size_t size);
     239              : 
     240              : /**
     241              :  * Free a kernel object previously allocated with k_object_alloc()
     242              :  *
     243              :  * This will return memory for a kernel object back to resource pool it was
     244              :  * allocated from.  Care must be exercised that the object will not be used
     245              :  * during or after when this call is made.
     246              :  *
     247              :  * @note This function is available only if @kconfig{CONFIG_DYNAMIC_OBJECTS}
     248              :  * is selected.
     249              :  *
     250              :  * @param obj Pointer to the kernel object memory address.
     251              :  */
     252            1 : void k_object_free(void *obj);
     253              : #else
     254              : 
     255              : /* LCOV_EXCL_START */
     256              : static inline void *z_impl_k_object_alloc(enum k_objects otype)
     257              : {
     258              :         ARG_UNUSED(otype);
     259              : 
     260              :         return NULL;
     261              : }
     262              : 
     263              : static inline void *z_impl_k_object_alloc_size(enum k_objects otype,
     264              :                                         size_t size)
     265              : {
     266              :         ARG_UNUSED(otype);
     267              :         ARG_UNUSED(size);
     268              : 
     269              :         return NULL;
     270              : }
     271              : 
     272              : /**
     273              :  * @brief Free an object
     274              :  *
     275              :  * @param obj
     276              :  */
     277              : static inline void k_object_free(void *obj)
     278              : {
     279              :         ARG_UNUSED(obj);
     280              : }
     281              : /* LCOV_EXCL_STOP */
     282              : #endif /* CONFIG_DYNAMIC_OBJECTS */
     283              : 
     284              : /** @} */
     285              : 
     286              : #include <zephyr/syscalls/kobject.h>
     287              : #ifdef __cplusplus
     288              : }
     289              : #endif
     290              : 
     291              : #endif
        

Generated by: LCOV version 2.0-1