@@ -190,8 +190,7 @@ static void shell_tdata_dump(const struct k_thread *cthread, void *user_data)
190190
191191}
192192
193- static int cmd_kernel_threads (const struct shell * sh ,
194- size_t argc , char * * argv )
193+ static int cmd_kernel_thread_list (const struct shell * sh , size_t argc , char * * argv )
195194{
196195 ARG_UNUSED (argc );
197196 ARG_UNUSED (argv );
@@ -208,66 +207,6 @@ static int cmd_kernel_threads(const struct shell *sh,
208207 return 0 ;
209208}
210209
211- #if defined(CONFIG_ARCH_STACKWALK )
212-
213- static bool print_trace_address (void * arg , unsigned long ra )
214- {
215- const struct shell * sh = arg ;
216- #ifdef CONFIG_SYMTAB
217- uint32_t offset = 0 ;
218- const char * name = symtab_find_symbol_name (ra , & offset );
219-
220- shell_print (sh , "ra: %p [%s+0x%x]" , (void * )ra , name , offset );
221- #else
222- shell_print (sh , "ra: %p" , (void * )ra );
223- #endif
224-
225- return true;
226- }
227-
228- struct unwind_entry {
229- const struct k_thread * const thread ;
230- bool valid ;
231- };
232-
233- static void is_valid_thread (const struct k_thread * cthread , void * user_data )
234- {
235- struct unwind_entry * entry = user_data ;
236-
237- if (cthread == entry -> thread ) {
238- entry -> valid = true;
239- }
240- }
241-
242- static int cmd_kernel_unwind (const struct shell * sh , size_t argc , char * * argv )
243- {
244- struct k_thread * thread ;
245-
246- if (argc == 1 ) {
247- thread = _current ;
248- } else {
249- thread = UINT_TO_POINTER (strtoll (argv [1 ], NULL , 16 ));
250- struct unwind_entry entry = {
251- .thread = thread ,
252- .valid = false,
253- };
254-
255- k_thread_foreach_unlocked (is_valid_thread , & entry );
256-
257- if (!entry .valid ) {
258- shell_error (sh , "Invalid thread id %p" , (void * )thread );
259- return - EINVAL ;
260- }
261- }
262- shell_print (sh , "Unwinding %p %s" , (void * )thread , thread -> name );
263-
264- arch_stack_walk (print_trace_address , (void * )sh , thread , NULL );
265-
266- return 0 ;
267- }
268-
269- #endif /* CONFIG_ARCH_STACKWALK */
270-
271210static void shell_stack_dump (const struct k_thread * thread , void * user_data )
272211{
273212 const struct shell * sh = (const struct shell * )user_data ;
@@ -299,8 +238,7 @@ static void shell_stack_dump(const struct k_thread *thread, void *user_data)
299238K_KERNEL_STACK_ARRAY_DECLARE (z_interrupt_stacks , CONFIG_MP_MAX_NUM_CPUS ,
300239 CONFIG_ISR_STACK_SIZE );
301240
302- static int cmd_kernel_stacks (const struct shell * sh ,
303- size_t argc , char * * argv )
241+ static int cmd_kernel_thread_stacks (const struct shell * sh , size_t argc , char * * argv )
304242{
305243 ARG_UNUSED (argc );
306244 ARG_UNUSED (argv );
@@ -337,7 +275,86 @@ static int cmd_kernel_stacks(const struct shell *sh,
337275
338276 return 0 ;
339277}
278+ #endif /* CONFIG_INIT_STACKS & CONFIG_THREAD_STACK_INFO & CONFIG_THREAD_MONITOR */
279+
280+ struct thread_entry {
281+ const struct k_thread * const thread ;
282+ bool valid ;
283+ };
284+
285+ static void thread_valid_cb (const struct k_thread * cthread , void * user_data )
286+ {
287+ struct thread_entry * entry = user_data ;
288+
289+ if (cthread == entry -> thread ) {
290+ entry -> valid = true;
291+ }
292+ }
293+
294+ __maybe_unused
295+ static bool thread_is_valid (const struct k_thread * thread )
296+ {
297+ struct thread_entry entry = {
298+ .thread = thread ,
299+ .valid = false,
300+ };
301+
302+ k_thread_foreach (thread_valid_cb , & entry );
303+
304+ return entry .valid ;
305+ }
306+
307+ #if defined(CONFIG_ARCH_STACKWALK )
308+
309+ static bool print_trace_address (void * arg , unsigned long ra )
310+ {
311+ const struct shell * sh = arg ;
312+ #ifdef CONFIG_SYMTAB
313+ uint32_t offset = 0 ;
314+ const char * name = symtab_find_symbol_name (ra , & offset );
315+
316+ shell_print (sh , "ra: %p [%s+0x%x]" , (void * )ra , name , offset );
317+ #else
318+ shell_print (sh , "ra: %p" , (void * )ra );
319+ #endif
320+
321+ return true;
322+ }
323+
324+ static int cmd_kernel_thread_unwind (const struct shell * sh , size_t argc , char * * argv )
325+ {
326+ struct k_thread * thread ;
327+
328+ if (argc == 1 ) {
329+ thread = _current ;
330+ } else {
331+ thread = UINT_TO_POINTER (strtoll (argv [1 ], NULL , 16 ));
332+
333+ if (!thread_is_valid (thread )) {
334+ shell_error (sh , "Invalid thread id %p" , (void * )thread );
335+ return - EINVAL ;
336+ }
337+ }
338+ shell_print (sh , "Unwinding %p %s" , (void * )thread , thread -> name );
339+
340+ arch_stack_walk (print_trace_address , (void * )sh , thread , NULL );
341+
342+ return 0 ;
343+ }
344+
345+ #endif /* CONFIG_ARCH_STACKWALK */
346+
347+ SHELL_STATIC_SUBCMD_SET_CREATE (sub_kernel_thread ,
348+ #if defined(CONFIG_INIT_STACKS ) && defined (CONFIG_THREAD_STACK_INFO ) && \
349+ defined (CONFIG_THREAD_MONITOR )
350+ SHELL_CMD (stacks , NULL , "List threads stack usage." , cmd_kernel_thread_stacks ),
351+ SHELL_CMD (list , NULL , "List kernel threads." , cmd_kernel_thread_list ),
340352#endif
353+ #if defined(CONFIG_ARCH_STACKWALK )
354+ SHELL_CMD_ARG (unwind , NULL , "Unwind a thread." , cmd_kernel_thread_unwind , 1 , 1 ),
355+ #endif /* CONFIG_ARCH_STACKWALK */
356+ SHELL_SUBCMD_SET_END /* Array terminated. */
357+ );
341358
342359#if defined(CONFIG_SYS_HEAP_RUNTIME_STATS ) && (K_HEAP_MEM_POOL_SIZE > 0 )
343360extern struct sys_heap _system_heap ;
@@ -458,14 +475,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_kernel,
458475#if defined(CONFIG_REBOOT )
459476 SHELL_CMD (reboot , & sub_kernel_reboot , "Reboot." , NULL ),
460477#endif
461- #if defined(CONFIG_INIT_STACKS ) && defined(CONFIG_THREAD_STACK_INFO ) && \
462- defined(CONFIG_THREAD_MONITOR )
463- SHELL_CMD (stacks , NULL , "List threads stack usage." , cmd_kernel_stacks ),
464- SHELL_CMD (threads , NULL , "List kernel threads." , cmd_kernel_threads ),
465- #if defined(CONFIG_ARCH_STACKWALK )
466- SHELL_CMD_ARG (unwind , NULL , "Unwind a thread." , cmd_kernel_unwind , 1 , 1 ),
467- #endif /* CONFIG_ARCH_STACKWALK */
468- #endif
478+ SHELL_CMD (thread , & sub_kernel_thread , "Kernel threads." , NULL ),
469479#if defined(CONFIG_SYS_HEAP_RUNTIME_STATS ) && (K_HEAP_MEM_POOL_SIZE > 0 )
470480 SHELL_CMD (heap , NULL , "System heap usage statistics." , cmd_kernel_heap ),
471481#endif
0 commit comments