Skip to content

Commit e3c2e84

Browse files
ycsinnashif
authored andcommitted
shell: modules: kernel: group thread-related cmds
`stacks` `threads` & `unwind` are commands related to kernel thread, group them one level inside a main `thread` command, and rename `threads` to `list`: - `kernel threads` -> `kernel thread list` - `kernel stacks` -> `kernel thread stacks` - `kernel unwind` -> `kernel thread unwind` Additionally, rename and mark the `thread_valid()` function as `__maybe_unused` as it might be unused for architectures without stackwalk implementation, and use the locked version of the thread iterator (`k_thread_foreach()`) Signed-off-by: Yong Cong Sin <[email protected]> Signed-off-by: Yong Cong Sin <[email protected]>
1 parent 665da73 commit e3c2e84

File tree

1 file changed

+82
-72
lines changed

1 file changed

+82
-72
lines changed

subsys/shell/modules/kernel_service.c

Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
271210
static 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)
299238
K_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)
343360
extern 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

Comments
 (0)