blob: 52a5c47a9b0a326b828a36cd71448823398b5704 [file] [log] [blame]
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <misc/printk.h>
#include <shell/shell.h>
#include <init.h>
#include <debug/object_tracing.h>
#include <misc/reboot.h>
#include <misc/stack.h>
#include <string.h>
#define SHELL_KERNEL "kernel"
static int shell_cmd_version(int argc, char *argv[])
{
u32_t version = sys_kernel_version_get();
ARG_UNUSED(argc);
ARG_UNUSED(argv);
printk("Zephyr version %d.%d.%d\n",
SYS_KERNEL_VER_MAJOR(version),
SYS_KERNEL_VER_MINOR(version),
SYS_KERNEL_VER_PATCHLEVEL(version));
return 0;
}
static int shell_cmd_uptime(int argc, char *argv[])
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
printk("uptime: %u ms\n", k_uptime_get_32());
return 0;
}
static int shell_cmd_cycles(int argc, char *argv[])
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
printk("cycles: %u hw cycles\n", k_cycle_get_32());
return 0;
}
#if defined(CONFIG_OBJECT_TRACING) && defined(CONFIG_THREAD_MONITOR)
static void shell_tdata_dump(const struct k_thread *thread, void *user_data)
{
printk("%s%p: options: 0x%x priority: %d\n",
(thread == k_current_get()) ? "*" : " ",
thread,
thread->base.user_options,
thread->base.prio);
}
static int shell_cmd_threads(int argc, char *argv[])
{
ARG_UNUSED(argc);
ARG_UNUSED(argv);
printk("Threads:\n");
k_thread_foreach(shell_tdata_dump, NULL);
return 0;
}
#endif
#if defined(CONFIG_INIT_STACKS) && defined(CONFIG_THREAD_MONITOR) \
&& defined(CONFIG_THREAD_STACK_INFO)
static void shell_stack_dump(const struct k_thread *thread, void *user_data)
{
stack_analyze((char *)user_data, (char *)thread->stack_info.start,
thread->stack_info.size);
}
static int shell_cmd_stack(int argc, char *argv[])
{
k_thread_foreach(shell_stack_dump, "Shell");
return 0;
}
#endif
#if defined(CONFIG_REBOOT)
static int shell_cmd_reboot(int argc, char *argv[])
{
int type;
if (argc != 2) {
return -EINVAL;
}
if (!strcmp(argv[1], "warm")) {
type = SYS_REBOOT_WARM;
} else if (!strcmp(argv[1], "cold")) {
type = SYS_REBOOT_COLD;
} else {
return -EINVAL;
}
sys_reboot(type);
return 0;
}
#endif
struct shell_cmd kernel_commands[] = {
{ "version", shell_cmd_version, "show kernel version" },
{ "uptime", shell_cmd_uptime, "show system uptime in milliseconds" },
{ "cycles", shell_cmd_cycles, "show system hardware cycles" },
#if defined(CONFIG_OBJECT_TRACING) && defined(CONFIG_THREAD_MONITOR)
{ "threads", shell_cmd_threads, "show running threads" },
#endif
#if defined(CONFIG_INIT_STACKS) && defined(CONFIG_THREAD_MONITOR) \
&& defined(CONFIG_THREAD_STACK_INFO)
{ "stacks", shell_cmd_stack, "show system stacks" },
#endif
#if defined(CONFIG_REBOOT)
{ "reboot", shell_cmd_reboot, "<warm cold>" },
#endif
{ NULL, NULL, NULL }
};
SHELL_REGISTER(SHELL_KERNEL, kernel_commands);