@@ -72,6 +72,9 @@ const char *otype_to_str(enum k_objects otype)
72
72
/* otype-to-str.h is generated automatically during build by
73
73
* gen_kobject_list.py
74
74
*/
75
+ case K_OBJ_ANY :
76
+ ret = "generic" ;
77
+ break ;
75
78
#include <otype-to-str.h>
76
79
default :
77
80
ret = "?" ;
@@ -252,51 +255,81 @@ static void thread_idx_free(uintptr_t tidx)
252
255
sys_bitfield_set_bit ((mem_addr_t )_thread_idx_map , tidx );
253
256
}
254
257
255
- void * z_impl_k_object_alloc ( enum k_objects otype )
258
+ struct z_object * z_dynamic_object_create ( size_t size )
256
259
{
257
260
struct dyn_obj * dyn_obj ;
258
- uintptr_t tidx ;
259
-
260
- /* Stacks are not supported, we don't yet have mem pool APIs
261
- * to request memory that is aligned
262
- */
263
- __ASSERT (otype > K_OBJ_ANY && otype < K_OBJ_LAST &&
264
- otype != K_OBJ_THREAD_STACK_ELEMENT ,
265
- "bad object type requested" );
266
261
267
- dyn_obj = z_thread_malloc (sizeof (* dyn_obj ) + obj_size_get ( otype ) );
262
+ dyn_obj = z_thread_malloc (sizeof (* dyn_obj ) + size );
268
263
if (dyn_obj == NULL ) {
269
- LOG_WRN ("could not allocate kernel object" );
264
+ LOG_ERR ("could not allocate kernel object, out of memory " );
270
265
return NULL ;
271
266
}
272
267
273
- dyn_obj -> kobj .name = ( char * ) & dyn_obj -> data ;
274
- dyn_obj -> kobj .type = otype ;
275
- dyn_obj -> kobj .flags = K_OBJ_FLAG_ALLOC ;
268
+ dyn_obj -> kobj .name = & dyn_obj -> data ;
269
+ dyn_obj -> kobj .type = K_OBJ_ANY ;
270
+ dyn_obj -> kobj .flags = 0 ;
276
271
(void )memset (dyn_obj -> kobj .perms , 0 , CONFIG_MAX_THREAD_BYTES );
277
272
278
- /* Need to grab a new thread index for k_thread */
279
- if (otype == K_OBJ_THREAD ) {
273
+ k_spinlock_key_t key = k_spin_lock (& lists_lock );
274
+
275
+ rb_insert (& obj_rb_tree , & dyn_obj -> node );
276
+ sys_dlist_append (& obj_list , & dyn_obj -> obj_list );
277
+ k_spin_unlock (& lists_lock , key );
278
+
279
+ return & dyn_obj -> kobj ;
280
+ }
281
+
282
+ void * z_impl_k_object_alloc (enum k_objects otype )
283
+ {
284
+ struct z_object * zo ;
285
+ uintptr_t tidx ;
286
+
287
+ if (otype <= K_OBJ_ANY || otype >= K_OBJ_LAST ) {
288
+ LOG_ERR ("bad object type %d requested" , otype );
289
+ return NULL ;
290
+ }
291
+
292
+ switch (otype ) {
293
+ case K_OBJ_THREAD :
280
294
if (!thread_idx_alloc (& tidx )) {
281
- k_free ( dyn_obj );
295
+ LOG_ERR ( "out of free thread indexes" );
282
296
return NULL ;
283
297
}
298
+ break ;
299
+ /* The following are currently not allowed at all */
300
+ case K_OBJ_FUTEX : /* Lives in user memory */
301
+ case K_OBJ_SYS_MUTEX : /* Lives in user memory */
302
+ case K_OBJ_THREAD_STACK_ELEMENT : /* No aligned allocator */
303
+ case K_OBJ_NET_SOCKET : /* Indeterminate size */
304
+ LOG_ERR ("forbidden object type '%s' requested" ,
305
+ otype_to_str (otype ));
306
+ return NULL ;
307
+ default :
308
+ /* Remainder within bounds are permitted */
309
+ break ;
310
+ }
284
311
285
- dyn_obj -> kobj .data .thread_id = tidx ;
312
+ zo = z_dynamic_object_create (obj_size_get (otype ));
313
+ if (zo == NULL ) {
314
+ return NULL ;
315
+ }
316
+ zo -> type = otype ;
317
+
318
+ if (otype == K_OBJ_THREAD ) {
319
+ zo -> data .thread_id = tidx ;
286
320
}
287
321
288
322
/* The allocating thread implicitly gets permission on kernel objects
289
323
* that it allocates
290
324
*/
291
- z_thread_perms_set (& dyn_obj -> kobj , _current );
325
+ z_thread_perms_set (zo , _current );
292
326
293
- k_spinlock_key_t key = k_spin_lock (& lists_lock );
294
-
295
- rb_insert (& obj_rb_tree , & dyn_obj -> node );
296
- sys_dlist_append (& obj_list , & dyn_obj -> obj_list );
297
- k_spin_unlock (& lists_lock , key );
327
+ /* Activates reference counting logic for automatic disposal when
328
+ * all permissions have been revoked
329
+ */
330
+ zo -> flags |= K_OBJ_FLAG_ALLOC ;
298
331
299
- return dyn_obj -> kobj . name ;
332
+ return zo -> name ;
300
333
}
301
334
302
335
void k_object_free (void * obj )
@@ -508,6 +541,12 @@ void z_dump_object_error(int retval, void *obj, struct z_object *ko,
508
541
switch (retval ) {
509
542
case - EBADF :
510
543
LOG_ERR ("%p is not a valid %s" , obj , otype_to_str (otype ));
544
+ if (ko == NULL ) {
545
+ LOG_ERR ("address is not a known kernel object" );
546
+ } else {
547
+ LOG_ERR ("address is actually a %s" ,
548
+ otype_to_str (ko -> type ));
549
+ }
511
550
break ;
512
551
case - EPERM :
513
552
dump_permission_error (ko );
0 commit comments