Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
obj_core.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023, Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_KERNEL_OBJ_CORE_H_
8#define ZEPHYR_INCLUDE_KERNEL_OBJ_CORE_H_
9
10#include <stddef.h>
11#include <zephyr/sys/slist.h>
13
19
23#define K_OBJ_CORE(kobj) (&((kobj)->obj_core))
24
28#define K_OBJ_TYPE_ID_GEN(s) ((s[0] << 24) | (s[1] << 16) | (s[2] << 8) | (s[3]))
29
30/* Known kernel object types */
31
33#define K_OBJ_TYPE_CONDVAR_ID K_OBJ_TYPE_ID_GEN("COND")
35#define K_OBJ_TYPE_CPU_ID K_OBJ_TYPE_ID_GEN("CPU_")
37#define K_OBJ_TYPE_EVENT_ID K_OBJ_TYPE_ID_GEN("EVNT")
39#define K_OBJ_TYPE_FIFO_ID K_OBJ_TYPE_ID_GEN("FIFO")
41#define K_OBJ_TYPE_KERNEL_ID K_OBJ_TYPE_ID_GEN("KRNL")
43#define K_OBJ_TYPE_LIFO_ID K_OBJ_TYPE_ID_GEN("LIFO")
45#define K_OBJ_TYPE_MEM_BLOCK_ID K_OBJ_TYPE_ID_GEN("MBLK")
47#define K_OBJ_TYPE_MBOX_ID K_OBJ_TYPE_ID_GEN("MBOX")
49#define K_OBJ_TYPE_MEM_SLAB_ID K_OBJ_TYPE_ID_GEN("SLAB")
51#define K_OBJ_TYPE_MSGQ_ID K_OBJ_TYPE_ID_GEN("MSGQ")
53#define K_OBJ_TYPE_MUTEX_ID K_OBJ_TYPE_ID_GEN("MUTX")
55#define K_OBJ_TYPE_PIPE_ID K_OBJ_TYPE_ID_GEN("PIPE")
57#define K_OBJ_TYPE_SEM_ID K_OBJ_TYPE_ID_GEN("SEM4")
59#define K_OBJ_TYPE_STACK_ID K_OBJ_TYPE_ID_GEN("STCK")
61#define K_OBJ_TYPE_THREAD_ID K_OBJ_TYPE_ID_GEN("THRD")
63#define K_OBJ_TYPE_TIMER_ID K_OBJ_TYPE_ID_GEN("TIMR")
64
65struct k_obj_type;
66struct k_obj_core;
67
71
72#ifdef CONFIG_OBJ_CORE
73#define K_OBJ_CORE_INIT(_objp, _obj_type) \
74 extern struct k_obj_type _obj_type; \
75 k_obj_core_init(_objp, &_obj_type)
76
77#define K_OBJ_CORE_LINK(objp) k_obj_core_link(objp)
78#else
79#define K_OBJ_CORE_INIT(objp, type) do { } while (0)
80#define K_OBJ_CORE_LINK(objp) do { } while (0)
81#endif /* CONFIG_OBJ_CORE */
82
86
91extern sys_slist_t z_obj_type_list;
92
95 size_t raw_size;
96 size_t query_size;
97
99 int (*raw)(struct k_obj_core *obj_core, void *stats);
101 int (*query)(struct k_obj_core *obj_core, void *stats);
103 int (*reset)(struct k_obj_core *obj_core);
105 int (*disable)(struct k_obj_core *obj_core);
107 int (*enable)(struct k_obj_core *obj_core);
108};
109
116#ifdef CONFIG_OBJ_CORE_STATS
118 struct k_obj_core_stats_desc *stats_desc;
119#endif /* CONFIG_OBJ_CORE_STATS */
120};
121
125 struct k_obj_type *type;
126#ifdef CONFIG_OBJ_CORE_STATS
127 void *stats;
128#endif /* CONFIG_OBJ_CORE_STATS */
129};
130
134
141struct k_obj_core_desc {
142 struct k_obj_type *type;
143 const void *objs_start;
144 const void *objs_end;
145 size_t obj_core_offset;
146 size_t obj_size;
147 uint32_t type_id;
148#ifdef CONFIG_OBJ_CORE_STATS
149 struct k_obj_core_stats_desc *stats_desc;
150 size_t stats_offset;
151 size_t stats_size;
152#endif /* CONFIG_OBJ_CORE_STATS */
153};
154
155#ifdef CONFIG_OBJ_CORE_STATS
156#define Z_OBJ_CORE_STATS_DESC(_stats, _soff, _ssz) \
157 .stats_desc = (_stats), .stats_offset = (_soff), .stats_size = (_ssz),
158#else
159#define Z_OBJ_CORE_STATS_DESC(_stats, _soff, _ssz)
160#endif /* CONFIG_OBJ_CORE_STATS */
161
162#define Z_K_OBJ_TYPE_DEFINE(_type_var, _struct, _id, _stats, _soff, _ssz) \
163 STRUCT_SECTION_START_EXTERN(_struct); \
164 STRUCT_SECTION_END_EXTERN(_struct); \
165 static const STRUCT_SECTION_ITERABLE(k_obj_core_desc, \
166 _obj_core_desc_##_struct) = { \
167 .type = &(_type_var), \
168 .objs_start = STRUCT_SECTION_START(_struct), \
169 .objs_end = STRUCT_SECTION_END(_struct), \
170 .obj_core_offset = offsetof(struct _struct, obj_core), \
171 .obj_size = sizeof(struct _struct), \
172 .type_id = (_id), \
173 Z_OBJ_CORE_STATS_DESC(_stats, _soff, _ssz) \
174 }
175
189#define K_OBJ_TYPE_DEFINE(_type_var, _struct, _id, _stats) \
190 Z_K_OBJ_TYPE_DEFINE(_type_var, _struct, _id, _stats, 0, 0)
191
204#define K_OBJ_TYPE_DEFINE_STATS(_type_var, _struct, _id, _stats, _member) \
205 Z_K_OBJ_TYPE_DEFINE(_type_var, _struct, _id, _stats, \
206 offsetof(struct _struct, _member), \
207 sizeof(((struct _struct *)0)->_member))
208
222#define K_OBJ_TYPE_DEFINE_TYPE_ONLY(_type_var, _struct, _id, _stats) \
223 static const STRUCT_SECTION_ITERABLE(k_obj_core_desc, \
224 _obj_core_desc_##_struct) = { \
225 .type = &(_type_var), \
226 .objs_start = NULL, \
227 .objs_end = NULL, \
228 .obj_core_offset = offsetof(struct _struct, obj_core), \
229 .obj_size = sizeof(struct _struct), \
230 .type_id = (_id), \
231 Z_OBJ_CORE_STATS_DESC(_stats, 0, 0) \
232 }
233
237
250struct k_obj_type *z_obj_type_init(struct k_obj_type *type,
251 uint32_t id, size_t off);
252
265
284 int (*func)(struct k_obj_core *, void *),
285 void *data);
286
306 int (*func)(struct k_obj_core *, void *),
307 void *data);
308
318void k_obj_core_init(struct k_obj_core *obj_core, struct k_obj_type *type);
319
330void k_obj_core_link(struct k_obj_core *obj_core);
331
342 struct k_obj_type *type);
343
353void k_obj_core_unlink(struct k_obj_core *obj_core);
354
356
362
363#ifdef CONFIG_OBJ_CORE_STATS
372static inline void k_obj_type_stats_init(struct k_obj_type *type,
373 struct k_obj_core_stats_desc *stats_desc)
374{
375 type->stats_desc = stats_desc;
376}
377
387static inline void k_obj_core_stats_init(struct k_obj_core *obj_core,
388 void *stats)
389{
390 obj_core->stats = stats;
391}
392#endif /* CONFIG_OBJ_CORE_STATS */
393
408int k_obj_core_stats_register(struct k_obj_core *obj_core, void *stats,
409 size_t stats_len);
410
424
440int k_obj_core_stats_raw(struct k_obj_core *obj_core, void *stats,
441 size_t stats_len);
442
459int k_obj_core_stats_query(struct k_obj_core *obj_core, void *stats,
460 size_t stats_len);
461
473int k_obj_core_stats_reset(struct k_obj_core *obj_core);
474
488
501
503#endif /* ZEPHYR_INCLUDE_KERNEL_OBJ_CORE_H_ */
int k_obj_type_walk_locked(struct k_obj_type *type, int(*func)(struct k_obj_core *, void *), void *data)
Walk the object type's list of object cores.
struct k_obj_type * k_obj_type_find(uint32_t type_id)
Find a specific object type by ID.
int k_obj_type_walk_unlocked(struct k_obj_type *type, int(*func)(struct k_obj_core *, void *), void *data)
Walk the object type's list of object cores.
void k_obj_core_link(struct k_obj_core *obj_core)
Link the kernel object to the kernel object type list.
void k_obj_core_unlink(struct k_obj_core *obj_core)
Unlink the kernel object from the kernel object type list.
void k_obj_core_init_and_link(struct k_obj_core *obj_core, struct k_obj_type *type)
Automatically link the kernel object after initializing it.
void k_obj_core_init(struct k_obj_core *obj_core, struct k_obj_type *type)
Initialize the core of the kernel object.
int k_obj_core_stats_enable(struct k_obj_core *obj_core)
Reset the stats associated with the kernel object.
int k_obj_core_stats_reset(struct k_obj_core *obj_core)
Reset the stats associated with the kernel object.
int k_obj_core_stats_query(struct k_obj_core *obj_core, void *stats, size_t stats_len)
Retrieve the statistics associated with the kernel object.
int k_obj_core_stats_disable(struct k_obj_core *obj_core)
Stop gathering the stats associated with the kernel object.
int k_obj_core_stats_raw(struct k_obj_core *obj_core, void *stats, size_t stats_len)
Retrieve the raw statistics associated with the kernel object.
int k_obj_core_stats_deregister(struct k_obj_core *obj_core)
Deregister kernel object from gathering statistics.
int k_obj_core_stats_register(struct k_obj_core *obj_core, void *stats, size_t stats_len)
Register kernel object for gathering statistics.
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:52
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:42
Header file for the single-linked list API.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Object core statistics descriptor.
Definition obj_core.h:94
int(* raw)(struct k_obj_core *obj_core, void *stats)
Function pointer to retrieve internal representation of stats.
Definition obj_core.h:99
int(* reset)(struct k_obj_core *obj_core)
Function pointer to reset object's statistics.
Definition obj_core.h:103
size_t raw_size
Internal representation stats buffer size.
Definition obj_core.h:95
int(* query)(struct k_obj_core *obj_core, void *stats)
Function pointer to retrieve reported statistics.
Definition obj_core.h:101
size_t query_size
Stats buffer size used for reporting.
Definition obj_core.h:96
int(* enable)(struct k_obj_core *obj_core)
Function pointer to enable object's statistics gathering.
Definition obj_core.h:107
int(* disable)(struct k_obj_core *obj_core)
Function pointer to disable object's statistics gathering.
Definition obj_core.h:105
Object core structure.
Definition obj_core.h:123
sys_snode_t node
Object node within object type's list.
Definition obj_core.h:124
struct k_obj_type * type
Object type to which object belongs.
Definition obj_core.h:125
Object type structure.
Definition obj_core.h:111
size_t obj_core_offset
Offset to obj_core field.
Definition obj_core.h:115
sys_snode_t node
Node within list of object types.
Definition obj_core.h:112
sys_slist_t list
List of objects of this object type.
Definition obj_core.h:113
uint32_t id
Unique type ID.
Definition obj_core.h:114
Iterable sections helpers.