blob: ea19d0f9a8daa2874ce5a4f9bcdc26735f34dccc [file] [log] [blame]
/*
* 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