LCOV - code coverage report
Current view: top level - zephyr/sys/internal - kobject_internal.h Coverage Total Hit
Test: new.info Lines: 10.5 % 19 2
Test Date: 2025-09-05 20:47:19

            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_INTERNAL_KOBJECT_INTERNAL_H
       7              : #define ZEPHYR_INCLUDE_SYS_INTERNAL_KOBJECT_INTERNAL_H
       8              : 
       9              : #ifdef __cplusplus
      10              : extern "C" {
      11              : #endif
      12              : 
      13              : /**
      14              :  * @defgroup usermode_internal_apis User Mode Internal APIs
      15              :  * @ingroup internal_api
      16              :  * @{
      17              :  */
      18              : 
      19              : #if defined(CONFIG_USERSPACE) || defined(__DOXYGEN__)
      20              : #if defined(CONFIG_GEN_PRIV_STACKS) || defined(__DOXYGEN__)
      21              : /* Metadata struct for K_OBJ_THREAD_STACK_ELEMENT */
      22              : struct z_stack_data {
      23              :         /* Size of the entire stack object, including reserved areas */
      24              :         size_t size;
      25              : 
      26              :         /* Stack buffer for privilege mode elevations */
      27              :         uint8_t *priv;
      28              : };
      29              : #endif /* CONFIG_GEN_PRIV_STACKS */
      30              : 
      31              : /* Object extra data. Only some objects use this, determined by object type */
      32            0 : union k_object_data {
      33              :         /* Backing mutex for K_OBJ_SYS_MUTEX */
      34            0 :         struct k_mutex *mutex;
      35              : 
      36              :         /* Numerical thread ID for K_OBJ_THREAD */
      37            0 :         unsigned int thread_id;
      38              : 
      39              : #if defined(CONFIG_GEN_PRIV_STACKS) || defined(__DOXYGEN__)
      40              :         /* Metadata for K_OBJ_THREAD_STACK_ELEMENT */
      41            0 :         const struct z_stack_data *stack_data;
      42              : #else
      43              :         /* Stack buffer size for K_OBJ_THREAD_STACK_ELEMENT */
      44              :         size_t stack_size;
      45              : #endif /* CONFIG_GEN_PRIV_STACKS */
      46              : 
      47              :         /* Futex wait queue and spinlock for K_OBJ_FUTEX */
      48            0 :         struct z_futex_data *futex_data;
      49              : 
      50              :         /* All other objects */
      51            0 :         int unused;
      52              : };
      53              : 
      54              : /**
      55              :  * @brief Table generated by gperf, these objects are retrieved via
      56              :  * k_object_find().
      57              :  *
      58              :  * @note This is an internal API. Do not use unless you are extending
      59              :  *       functionality in the Zephyr tree.
      60              :  */
      61            1 : struct k_object {
      62            0 :         void *name;
      63            0 :         uint8_t perms[CONFIG_MAX_THREAD_BYTES];
      64            0 :         uint8_t type;
      65            0 :         uint8_t flags;
      66            0 :         union k_object_data data;
      67              : } __packed __aligned(4);
      68              : 
      69            0 : struct k_object_assignment {
      70            0 :         struct k_thread *thread;
      71            0 :         void * const *objects;
      72              : };
      73              : 
      74              : 
      75              : /**
      76              :  * Lookup a kernel object and init its metadata if it exists
      77              :  *
      78              :  * Calling this on an object will make it usable from userspace.
      79              :  * Intended to be called as the last statement in kernel object init
      80              :  * functions.
      81              :  *
      82              :  * @param obj Address of the kernel object
      83              :  *
      84              :  * @note This is an internal API. Do not use unless you are extending
      85              :  *       functionality in the Zephyr tree.
      86              :  */
      87            1 : void k_object_init(const void *obj);
      88              : 
      89              : 
      90              : #else
      91              : /* LCOV_EXCL_START */
      92              : static inline void k_object_init(const void *obj)
      93              : {
      94              :         ARG_UNUSED(obj);
      95              : }
      96              : /* LCOV_EXCL_STOP */
      97              : #endif /* !CONFIG_USERSPACE */
      98              : 
      99              : #ifdef CONFIG_DYNAMIC_OBJECTS
     100              : /**
     101              :  * Allocate memory and install as a generic kernel object
     102              :  *
     103              :  * This is a low-level function to allocate some memory, and register that
     104              :  * allocated memory in the kernel object lookup tables with type K_OBJ_ANY.
     105              :  * Initialization state and thread permissions will be cleared. The
     106              :  * returned k_object's data value will be uninitialized.
     107              :  *
     108              :  * Most users will want to use k_object_alloc() instead.
     109              :  *
     110              :  * Memory allocated will be drawn from the calling thread's reasource pool
     111              :  * and may be freed later by passing the actual object pointer (found
     112              :  * in the returned k_object's 'name' member) to k_object_free().
     113              :  *
     114              :  * @param align Required memory alignment for the allocated object
     115              :  * @param size Size of the allocated object
     116              :  * @return NULL on insufficient memory
     117              :  * @return A pointer to the associated k_object that is installed in the
     118              :  *      kernel object tables
     119              :  *
     120              :  * @note This is an internal API. Do not use unless you are extending
     121              :  *       functionality in the Zephyr tree.
     122              :  */
     123              : struct k_object *k_object_create_dynamic_aligned(size_t align, size_t size);
     124              : 
     125              : /**
     126              :  * Allocate memory and install as a generic kernel object
     127              :  *
     128              :  * This is a low-level function to allocate some memory, and register that
     129              :  * allocated memory in the kernel object lookup tables with type K_OBJ_ANY.
     130              :  * Initialization state and thread permissions will be cleared. The
     131              :  * returned k_object's data value will be uninitialized.
     132              :  *
     133              :  * Most users will want to use k_object_alloc() instead.
     134              :  *
     135              :  * Memory allocated will be drawn from the calling thread's reasource pool
     136              :  * and may be freed later by passing the actual object pointer (found
     137              :  * in the returned k_object's 'name' member) to k_object_free().
     138              :  *
     139              :  * @param size Size of the allocated object
     140              :  * @return NULL on insufficient memory
     141              :  * @return A pointer to the associated k_object that is installed in the
     142              :  *      kernel object tables
     143              :  *
     144              :  * @note This is an internal API. Do not use unless you are extending
     145              :  *       functionality in the Zephyr tree.
     146              :  */
     147              : static inline struct k_object *k_object_create_dynamic(size_t size)
     148              : {
     149              :         return k_object_create_dynamic_aligned(0, size);
     150              : }
     151              : 
     152              : #else
     153              : 
     154              : /* LCOV_EXCL_START */
     155            0 : static inline struct k_object *k_object_create_dynamic_aligned(size_t align,
     156              :                                                                size_t size)
     157              : {
     158              :         ARG_UNUSED(align);
     159              :         ARG_UNUSED(size);
     160              : 
     161              :         return NULL;
     162              : }
     163              : 
     164            0 : static inline struct k_object *k_object_create_dynamic(size_t size)
     165              : {
     166              :         ARG_UNUSED(size);
     167              : 
     168              :         return NULL;
     169              : }
     170              : 
     171              : /* LCOV_EXCL_STOP */
     172              : #endif /* CONFIG_DYNAMIC_OBJECTS */
     173              : 
     174              : /** @} */
     175              : 
     176              : #ifdef __cplusplus
     177              : }
     178              : #endif
     179              : 
     180              : #endif
        

Generated by: LCOV version 2.0-1