| /* |
| * Copyright (c) 2020 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #ifndef ZEPHYR_INCLUDE_SYS_INTERNAL_KOBJECT_INTERNAL_H |
| #define ZEPHYR_INCLUDE_SYS_INTERNAL_KOBJECT_INTERNAL_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @defgroup usermode_internal_apis User Mode Internal APIs |
| * @ingroup internal_api |
| * @{ |
| */ |
| |
| #if defined(CONFIG_USERSPACE) || defined(__DOXYGEN__) |
| #if defined(CONFIG_GEN_PRIV_STACKS) || defined(__DOXYGEN__) |
| /* Metadata struct for K_OBJ_THREAD_STACK_ELEMENT */ |
| struct z_stack_data { |
| /* Size of the entire stack object, including reserved areas */ |
| size_t size; |
| |
| /* Stack buffer for privilege mode elevations */ |
| uint8_t *priv; |
| }; |
| #endif /* CONFIG_GEN_PRIV_STACKS */ |
| |
| /* Object extra data. Only some objects use this, determined by object type */ |
| union k_object_data { |
| /* Backing mutex for K_OBJ_SYS_MUTEX */ |
| struct k_mutex *mutex; |
| |
| /* Numerical thread ID for K_OBJ_THREAD */ |
| unsigned int thread_id; |
| |
| #if defined(CONFIG_GEN_PRIV_STACKS) || defined(__DOXYGEN__) |
| /* Metadata for K_OBJ_THREAD_STACK_ELEMENT */ |
| const struct z_stack_data *stack_data; |
| #else |
| /* Stack buffer size for K_OBJ_THREAD_STACK_ELEMENT */ |
| size_t stack_size; |
| #endif /* CONFIG_GEN_PRIV_STACKS */ |
| |
| /* Futex wait queue and spinlock for K_OBJ_FUTEX */ |
| struct z_futex_data *futex_data; |
| |
| /* All other objects */ |
| int unused; |
| }; |
| |
| /** |
| * @brief Table generated by gperf, these objects are retrieved via |
| * k_object_find(). |
| * |
| * @note This is an internal API. Do not use unless you are extending |
| * functionality in the Zephyr tree. |
| */ |
| struct k_object { |
| void *name; |
| uint8_t perms[CONFIG_MAX_THREAD_BYTES]; |
| uint8_t type; |
| uint8_t flags; |
| union k_object_data data; |
| } __packed __aligned(4); |
| |
| struct k_object_assignment { |
| struct k_thread *thread; |
| void * const *objects; |
| }; |
| |
| |
| /** |
| * Lookup a kernel object and init its metadata if it exists |
| * |
| * Calling this on an object will make it usable from userspace. |
| * Intended to be called as the last statement in kernel object init |
| * functions. |
| * |
| * @param obj Address of the kernel object |
| * |
| * @note This is an internal API. Do not use unless you are extending |
| * functionality in the Zephyr tree. |
| */ |
| void k_object_init(const void *obj); |
| |
| |
| #else |
| /* LCOV_EXCL_START */ |
| static inline void k_object_init(const void *obj) |
| { |
| ARG_UNUSED(obj); |
| } |
| /* LCOV_EXCL_STOP */ |
| #endif /* !CONFIG_USERSPACE */ |
| |
| #ifdef CONFIG_DYNAMIC_OBJECTS |
| /** |
| * Allocate memory and install as a generic kernel object |
| * |
| * This is a low-level function to allocate some memory, and register that |
| * allocated memory in the kernel object lookup tables with type K_OBJ_ANY. |
| * Initialization state and thread permissions will be cleared. The |
| * returned k_object's data value will be uninitialized. |
| * |
| * Most users will want to use k_object_alloc() instead. |
| * |
| * Memory allocated will be drawn from the calling thread's reasource pool |
| * and may be freed later by passing the actual object pointer (found |
| * in the returned k_object's 'name' member) to k_object_free(). |
| * |
| * @param align Required memory alignment for the allocated object |
| * @param size Size of the allocated object |
| * @return NULL on insufficient memory |
| * @return A pointer to the associated k_object that is installed in the |
| * kernel object tables |
| * |
| * @note This is an internal API. Do not use unless you are extending |
| * functionality in the Zephyr tree. |
| */ |
| struct k_object *k_object_create_dynamic_aligned(size_t align, size_t size); |
| |
| /** |
| * Allocate memory and install as a generic kernel object |
| * |
| * This is a low-level function to allocate some memory, and register that |
| * allocated memory in the kernel object lookup tables with type K_OBJ_ANY. |
| * Initialization state and thread permissions will be cleared. The |
| * returned k_object's data value will be uninitialized. |
| * |
| * Most users will want to use k_object_alloc() instead. |
| * |
| * Memory allocated will be drawn from the calling thread's reasource pool |
| * and may be freed later by passing the actual object pointer (found |
| * in the returned k_object's 'name' member) to k_object_free(). |
| * |
| * @param size Size of the allocated object |
| * @return NULL on insufficient memory |
| * @return A pointer to the associated k_object that is installed in the |
| * kernel object tables |
| * |
| * @note This is an internal API. Do not use unless you are extending |
| * functionality in the Zephyr tree. |
| */ |
| static inline struct k_object *k_object_create_dynamic(size_t size) |
| { |
| return k_object_create_dynamic_aligned(0, size); |
| } |
| |
| #else |
| |
| /* LCOV_EXCL_START */ |
| static inline struct k_object *k_object_create_dynamic_aligned(size_t align, |
| size_t size) |
| { |
| ARG_UNUSED(align); |
| ARG_UNUSED(size); |
| |
| return NULL; |
| } |
| |
| static inline struct k_object *k_object_create_dynamic(size_t size) |
| { |
| ARG_UNUSED(size); |
| |
| return NULL; |
| } |
| |
| /* LCOV_EXCL_STOP */ |
| #endif /* CONFIG_DYNAMIC_OBJECTS */ |
| |
| /** @} */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |