LCOV - code coverage report
Current view: top level - zephyr/sys/internal - kobject_internal.h Hit Total Coverage
Test: new.info Lines: 2 19 10.5 %
Date: 2024-12-22 00:14:23

          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 1.14