^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Kernel Debugger Architecture Independent Main Code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * License. See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Xscale (R) modifications copyright (C) 2003 Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Copyright (c) 2009 Wind River Systems, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/kmsg_dump.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/reboot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/sched/loadavg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/sched/stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/sched/debug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/sysrq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/smp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/utsname.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/atomic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/moduleparam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/kallsyms.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/kgdb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/kdb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/nmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/sysctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/cpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/kdebug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "kdb_private.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #undef MODULE_PARAM_PREFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define MODULE_PARAM_PREFIX "kdb."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static int kdb_cmd_enabled = CONFIG_KDB_DEFAULT_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) module_param_named(cmd_enable, kdb_cmd_enabled, int, 0600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) char kdb_grep_string[KDB_GREP_STRLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) int kdb_grepping_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) EXPORT_SYMBOL(kdb_grepping_flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) int kdb_grep_leading;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int kdb_grep_trailing;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Kernel debugger state flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) unsigned int kdb_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * kdb_lock protects updates to kdb_initial_cpu. Used to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * single thread processors through the kernel debugger.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int kdb_initial_cpu = -1; /* cpu number that owns kdb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int kdb_nextline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int kdb_state; /* General KDB state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct task_struct *kdb_current_task;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct pt_regs *kdb_current_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) const char *kdb_diemsg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static int kdb_go_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #ifdef CONFIG_KDB_CONTINUE_CATASTROPHIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static unsigned int kdb_continue_catastrophic =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) CONFIG_KDB_CONTINUE_CATASTROPHIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) static unsigned int kdb_continue_catastrophic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* kdb_commands describes the available commands. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) static kdbtab_t *kdb_commands;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define KDB_BASE_CMD_MAX 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static int kdb_max_commands = KDB_BASE_CMD_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static kdbtab_t kdb_base_commands[KDB_BASE_CMD_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define for_each_kdbcmd(cmd, num) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) for ((cmd) = kdb_base_commands, (num) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) num < kdb_max_commands; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) num++, num == KDB_BASE_CMD_MAX ? cmd = kdb_commands : cmd++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) typedef struct _kdbmsg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) int km_diag; /* kdb diagnostic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) char *km_msg; /* Corresponding message text */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) } kdbmsg_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define KDBMSG(msgnum, text) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) { KDB_##msgnum, text }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) static kdbmsg_t kdbmsgs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) KDBMSG(NOTFOUND, "Command Not Found"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) KDBMSG(ARGCOUNT, "Improper argument count, see usage."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) KDBMSG(BADWIDTH, "Illegal value for BYTESPERWORD use 1, 2, 4 or 8, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) "8 is only allowed on 64 bit systems"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) KDBMSG(BADRADIX, "Illegal value for RADIX use 8, 10 or 16"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) KDBMSG(NOTENV, "Cannot find environment variable"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) KDBMSG(NOENVVALUE, "Environment variable should have value"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) KDBMSG(NOTIMP, "Command not implemented"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) KDBMSG(ENVFULL, "Environment full"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) KDBMSG(ENVBUFFULL, "Environment buffer full"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) KDBMSG(TOOMANYBPT, "Too many breakpoints defined"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #ifdef CONFIG_CPU_XSCALE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) KDBMSG(TOOMANYDBREGS, "More breakpoints than ibcr registers defined"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) KDBMSG(TOOMANYDBREGS, "More breakpoints than db registers defined"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) KDBMSG(DUPBPT, "Duplicate breakpoint address"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) KDBMSG(BPTNOTFOUND, "Breakpoint not found"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) KDBMSG(BADMODE, "Invalid IDMODE"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) KDBMSG(BADINT, "Illegal numeric value"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) KDBMSG(INVADDRFMT, "Invalid symbolic address format"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) KDBMSG(BADREG, "Invalid register name"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) KDBMSG(BADCPUNUM, "Invalid cpu number"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) KDBMSG(BADLENGTH, "Invalid length field"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) KDBMSG(NOBP, "No Breakpoint exists"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) KDBMSG(BADADDR, "Invalid address"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) KDBMSG(NOPERM, "Permission denied"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #undef KDBMSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static const int __nkdb_err = ARRAY_SIZE(kdbmsgs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * Initial environment. This is all kept static and local to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * this file. We don't want to rely on the memory allocation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) * mechanisms in the kernel, so we use a very limited allocate-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * heap for new and altered environment variables. The entire
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * environment is limited to a fixed number of entries (add more
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * to __env[] if required) and a fixed amount of heap (add more to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * KDB_ENVBUFSIZE if required).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static char *__env[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #if defined(CONFIG_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) "PROMPT=[%d]kdb> ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) "PROMPT=kdb> ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) "MOREPROMPT=more> ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) "RADIX=16",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) "MDCOUNT=8", /* lines of md output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) KDB_PLATFORM_ENV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) "DTABCOUNT=30",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) "NOSECT=1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) (char *)0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) static const int __nenv = ARRAY_SIZE(__env);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) struct task_struct *kdb_curr_task(int cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) struct task_struct *p = curr_task(cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) #ifdef _TIF_MCA_INIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if ((task_thread_info(p)->flags & _TIF_MCA_INIT) && KDB_TSK(cpu))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) p = krp->p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * Check whether the flags of the current command and the permissions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * of the kdb console has allow a command to be run.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static inline bool kdb_check_flags(kdb_cmdflags_t flags, int permissions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) bool no_args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /* permissions comes from userspace so needs massaging slightly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) permissions &= KDB_ENABLE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) permissions |= KDB_ENABLE_ALWAYS_SAFE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* some commands change group when launched with no arguments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if (no_args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) permissions |= permissions << KDB_ENABLE_NO_ARGS_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) flags |= KDB_ENABLE_ALL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return permissions & flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * kdbgetenv - This function will return the character string value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * an environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * match A character string representing an environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * NULL No environment variable matches 'match'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * char* Pointer to string value of environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) char *kdbgetenv(const char *match)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) char **ep = __env;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) int matchlen = strlen(match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) for (i = 0; i < __nenv; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) char *e = *ep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (!e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) if ((strncmp(match, e, matchlen) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) && ((e[matchlen] == '\0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) || (e[matchlen] == '='))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) char *cp = strchr(e, '=');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) return cp ? ++cp : "";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * kdballocenv - This function is used to allocate bytes for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * environment entries.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * match A character string representing a numeric value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * Outputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * *value the unsigned long representation of the env variable 'match'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) * Zero on success, a kdb diagnostic on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) * Remarks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * We use a static environment buffer (envbuffer) to hold the values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * of dynamically generated environment variables (see kdb_set). Buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * space once allocated is never free'd, so over time, the amount of space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * (currently 512 bytes) will be exhausted if env variables are changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * frequently.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) static char *kdballocenv(size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #define KDB_ENVBUFSIZE 512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) static char envbuffer[KDB_ENVBUFSIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static int envbufsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) char *ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if ((KDB_ENVBUFSIZE - envbufsize) >= bytes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) ep = &envbuffer[envbufsize];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) envbufsize += bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * kdbgetulenv - This function will return the value of an unsigned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * long-valued environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * match A character string representing a numeric value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * Outputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * *value the unsigned long represntation of the env variable 'match'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * Zero on success, a kdb diagnostic on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static int kdbgetulenv(const char *match, unsigned long *value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) char *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) ep = kdbgetenv(match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return KDB_NOTENV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (strlen(ep) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return KDB_NOENVVALUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) *value = simple_strtoul(ep, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * kdbgetintenv - This function will return the value of an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * integer-valued environment variable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) * match A character string representing an integer-valued env variable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * Outputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * *value the integer representation of the environment variable 'match'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * Zero on success, a kdb diagnostic on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) int kdbgetintenv(const char *match, int *value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) diag = kdbgetulenv(match, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (!diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) *value = (int) val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * kdbgetularg - This function will convert a numeric string into an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) * unsigned long value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) * arg A character string representing a numeric value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) * Outputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) * *value the unsigned long represntation of arg.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * Zero on success, a kdb diagnostic on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) int kdbgetularg(const char *arg, unsigned long *value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) char *endp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) val = simple_strtoul(arg, &endp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (endp == arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) * Also try base 16, for us folks too lazy to type the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) * leading 0x...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) val = simple_strtoul(arg, &endp, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) if (endp == arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return KDB_BADINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) *value = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) int kdbgetu64arg(const char *arg, u64 *value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) char *endp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) u64 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) val = simple_strtoull(arg, &endp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) if (endp == arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) val = simple_strtoull(arg, &endp, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (endp == arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) return KDB_BADINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) *value = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * kdb_set - This function implements the 'set' command. Alter an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * existing environment variable or create a new one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) int kdb_set(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) char *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) size_t varlen, vallen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * we can be invoked two ways:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * set var=value argv[1]="var", argv[2]="value"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) * set var = value argv[1]="var", argv[2]="=", argv[3]="value"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) * - if the latter, shift 'em down.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (argc == 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) argv[2] = argv[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) argc--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (argc != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) * Censor sensitive variables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) if (strcmp(argv[1], "PROMPT") == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) !kdb_check_flags(KDB_ENABLE_MEM_READ, kdb_cmd_enabled, false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) return KDB_NOPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * Check for internal variables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (strcmp(argv[1], "KDBDEBUG") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) unsigned int debugflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) char *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) debugflags = simple_strtoul(argv[2], &cp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (cp == argv[2] || debugflags & ~KDB_DEBUG_FLAG_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) kdb_printf("kdb: illegal debug flags '%s'\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) argv[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) kdb_flags = (kdb_flags & ~KDB_DEBUG(MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) | (debugflags << KDB_DEBUG_FLAG_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * Tokenizer squashed the '=' sign. argv[1] is variable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) * name, argv[2] = value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) varlen = strlen(argv[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) vallen = strlen(argv[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) ep = kdballocenv(varlen + vallen + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if (ep == (char *)0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) return KDB_ENVBUFFULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) sprintf(ep, "%s=%s", argv[1], argv[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) ep[varlen+vallen+1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) for (i = 0; i < __nenv; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (__env[i]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) && ((strncmp(__env[i], argv[1], varlen) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) && ((__env[i][varlen] == '\0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) || (__env[i][varlen] == '=')))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) __env[i] = ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * Wasn't existing variable. Fit into slot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) for (i = 0; i < __nenv-1; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) if (__env[i] == (char *)0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) __env[i] = ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) return KDB_ENVFULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static int kdb_check_regs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (!kdb_current_regs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) kdb_printf("No current kdb registers."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) " You may need to select another task\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) return KDB_BADREG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * kdbgetaddrarg - This function is responsible for parsing an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) * address-expression and returning the value of the expression,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) * symbol name, and offset to the caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) * The argument may consist of a numeric value (decimal or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * hexidecimal), a symbol name, a register name (preceded by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) * percent sign), an environment variable with a numeric value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) * (preceded by a dollar sign) or a simple arithmetic expression
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * consisting of a symbol name, +/-, and a numeric constant value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * (offset).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) * argc - count of arguments in argv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) * argv - argument vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * *nextarg - index to next unparsed argument in argv[]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * regs - Register state at time of KDB entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * Outputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * *value - receives the value of the address-expression
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * *offset - receives the offset specified, if any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * *name - receives the symbol name, if any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * *nextarg - index to next unparsed argument in argv[]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) * zero is returned on success, a kdb diagnostic code is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * returned on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) int kdbgetaddrarg(int argc, const char **argv, int *nextarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) unsigned long *value, long *offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) char **name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) unsigned long off = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) int positive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) int found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) char *symname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) char symbol = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) char *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) kdb_symtab_t symtab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) * If the enable flags prohibit both arbitrary memory access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) * and flow control then there are no reasonable grounds to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) * provide symbol lookup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (!kdb_check_flags(KDB_ENABLE_MEM_READ | KDB_ENABLE_FLOW_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) kdb_cmd_enabled, false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) return KDB_NOPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * Process arguments which follow the following syntax:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) * symbol | numeric-address [+/- numeric-offset]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) * %register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) * $environment-variable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) if (*nextarg > argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) symname = (char *)argv[*nextarg];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * If there is no whitespace between the symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) * or address and the '+' or '-' symbols, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * remember the character and replace it with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * null so the symbol/value can be properly parsed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) cp = strpbrk(symname, "+-");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) if (cp != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) symbol = *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) *cp++ = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) if (symname[0] == '$') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) diag = kdbgetulenv(&symname[1], &addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) } else if (symname[0] == '%') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) diag = kdb_check_regs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /* Implement register values with % at a later time as it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) * arch optional.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) found = kdbgetsymval(symname, &symtab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) if (found) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) addr = symtab.sym_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) diag = kdbgetularg(argv[*nextarg], &addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) if (!found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) found = kdbnearsym(addr, &symtab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) (*nextarg)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) if (name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) *name = symname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) *value = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (offset && name && *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) *offset = addr - symtab.sym_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) if ((*nextarg > argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) && (symbol == '\0'))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * check for +/- and offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) if (symbol == '\0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) if ((argv[*nextarg][0] != '+')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) && (argv[*nextarg][0] != '-')) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) * Not our argument. Return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) positive = (argv[*nextarg][0] == '+');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) (*nextarg)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) positive = (symbol == '+');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) * Now there must be an offset!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if ((*nextarg > argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) && (symbol == '\0')) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) return KDB_INVADDRFMT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) if (!symbol) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) cp = (char *)argv[*nextarg];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) (*nextarg)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) diag = kdbgetularg(cp, &off);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (!positive)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) off = -off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) *offset += off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if (value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) *value += off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) static void kdb_cmderror(int diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (diag >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) kdb_printf("no error detected (diagnostic is %d)\n", diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) for (i = 0; i < __nkdb_err; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (kdbmsgs[i].km_diag == diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) kdb_printf("diag: %d: %s\n", diag, kdbmsgs[i].km_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) kdb_printf("Unknown diag %d\n", -diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) * kdb_defcmd, kdb_defcmd2 - This function implements the 'defcmd'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) * command which defines one command as a set of other commands,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) * terminated by endefcmd. kdb_defcmd processes the initial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) * 'defcmd' command, kdb_defcmd2 is invoked from kdb_parse for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * the following commands until 'endefcmd'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * argc argument count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * argv argument vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) * zero for success, a kdb diagnostic if error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct defcmd_set {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) bool usable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) char *usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) char *help;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) char **command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) static struct defcmd_set *defcmd_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) static int defcmd_set_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) static bool defcmd_in_progress;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) /* Forward references */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) static int kdb_exec_defcmd(int argc, const char **argv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) static int kdb_defcmd2(const char *cmdstr, const char *argv0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct defcmd_set *s = defcmd_set + defcmd_set_count - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) char **save_command = s->command;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (strcmp(argv0, "endefcmd") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) defcmd_in_progress = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (!s->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) s->usable = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) if (s->usable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) /* macros are always safe because when executed each
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * internal command re-enters kdb_parse() and is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * safety checked individually.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) kdb_register_flags(s->name, kdb_exec_defcmd, s->usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) s->help, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (!s->usable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) s->command = kcalloc(s->count + 1, sizeof(*(s->command)), GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) if (!s->command) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) kdb_printf("Could not allocate new kdb_defcmd table for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) cmdstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) s->usable = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) memcpy(s->command, save_command, s->count * sizeof(*(s->command)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) s->command[s->count++] = kdb_strdup(cmdstr, GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) kfree(save_command);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) static int kdb_defcmd(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct defcmd_set *save_defcmd_set = defcmd_set, *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) if (defcmd_in_progress) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) kdb_printf("kdb: nested defcmd detected, assuming missing "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) "endefcmd\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) kdb_defcmd2("endefcmd", "endefcmd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) if (argc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) for (s = defcmd_set; s < defcmd_set + defcmd_set_count; ++s) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) kdb_printf("defcmd %s \"%s\" \"%s\"\n", s->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) s->usage, s->help);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) for (i = 0; i < s->count; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) kdb_printf("%s", s->command[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) kdb_printf("endefcmd\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) if (argc != 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) if (in_dbg_master()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) kdb_printf("Command only available during kdb_init()\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) defcmd_set = kmalloc_array(defcmd_set_count + 1, sizeof(*defcmd_set),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (!defcmd_set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) goto fail_defcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) memcpy(defcmd_set, save_defcmd_set,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) defcmd_set_count * sizeof(*defcmd_set));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) s = defcmd_set + defcmd_set_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) memset(s, 0, sizeof(*s));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) s->usable = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) s->name = kdb_strdup(argv[1], GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) if (!s->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) goto fail_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) s->usage = kdb_strdup(argv[2], GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) if (!s->usage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) goto fail_usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) s->help = kdb_strdup(argv[3], GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) if (!s->help)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) goto fail_help;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (s->usage[0] == '"') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) strcpy(s->usage, argv[2]+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) s->usage[strlen(s->usage)-1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) if (s->help[0] == '"') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) strcpy(s->help, argv[3]+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) s->help[strlen(s->help)-1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) ++defcmd_set_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) defcmd_in_progress = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) kfree(save_defcmd_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) fail_help:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) kfree(s->usage);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) fail_usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) kfree(s->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) fail_name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) kfree(defcmd_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) fail_defcmd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) kdb_printf("Could not allocate new defcmd_set entry for %s\n", argv[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) defcmd_set = save_defcmd_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) * kdb_exec_defcmd - Execute the set of commands associated with this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * defcmd name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) * argc argument count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * argv argument vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) * zero for success, a kdb diagnostic if error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) static int kdb_exec_defcmd(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) struct defcmd_set *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) if (argc != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) for (s = defcmd_set, i = 0; i < defcmd_set_count; ++i, ++s) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) if (strcmp(s->name, argv[0]) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) if (i == defcmd_set_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) kdb_printf("kdb_exec_defcmd: could not find commands for %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) argv[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) return KDB_NOTIMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) for (i = 0; i < s->count; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) /* Recursive use of kdb_parse, do not use argv after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) * this point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) argv = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) kdb_printf("[%s]kdb> %s\n", s->name, s->command[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) ret = kdb_parse(s->command[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) /* Command history */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) #define KDB_CMD_HISTORY_COUNT 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) #define CMD_BUFLEN 200 /* kdb_printf: max printline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) * size == 256 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static unsigned int cmd_head, cmd_tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) static unsigned int cmdptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) static char cmd_hist[KDB_CMD_HISTORY_COUNT][CMD_BUFLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) static char cmd_cur[CMD_BUFLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) * The "str" argument may point to something like | grep xyz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static void parse_grep(const char *str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) char *cp = (char *)str, *cp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /* sanity check: we should have been called with the \ first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) if (*cp != '|')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) while (isspace(*cp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) if (!str_has_prefix(cp, "grep ")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) kdb_printf("invalid 'pipe', see grephelp\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) cp += 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) while (isspace(*cp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) cp2 = strchr(cp, '\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) if (cp2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) *cp2 = '\0'; /* remove the trailing newline */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) len = strlen(cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (len == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) kdb_printf("invalid 'pipe', see grephelp\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) /* now cp points to a nonzero length search string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) if (*cp == '"') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) /* allow it be "x y z" by removing the "'s - there must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) be two of them */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) cp2 = strchr(cp, '"');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (!cp2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) kdb_printf("invalid quoted string, see grephelp\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) *cp2 = '\0'; /* end the string where the 2nd " was */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) kdb_grep_leading = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) if (*cp == '^') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) kdb_grep_leading = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) len = strlen(cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) kdb_grep_trailing = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (*(cp+len-1) == '$') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) kdb_grep_trailing = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) *(cp+len-1) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) len = strlen(cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (!len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) if (len >= KDB_GREP_STRLEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) kdb_printf("search string too long\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) strcpy(kdb_grep_string, cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) kdb_grepping_flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) * kdb_parse - Parse the command line, search the command table for a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) * matching command and invoke the command function. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) * function may be called recursively, if it is, the second call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) * will overwrite argv and cbuf. It is the caller's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) * responsibility to save their argv if they recursively call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) * kdb_parse().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) * Parameters:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) * cmdstr The input command line to be parsed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) * regs The registers at the time kdb was entered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) * Zero for success, a kdb diagnostic if failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) * Remarks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) * Limited to 20 tokens.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) * Real rudimentary tokenization. Basically only whitespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) * is considered a token delimeter (but special consideration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) * is taken of the '=' sign as used by the 'set' command).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) * The algorithm used to tokenize the input string relies on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) * there being at least one whitespace (or otherwise useless)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) * character between tokens as the character immediately following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * the token is altered in-place to a null-byte to terminate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) * token string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) #define MAXARGC 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) int kdb_parse(const char *cmdstr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) static char *argv[MAXARGC];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) static int argc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) static char cbuf[CMD_BUFLEN+2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) char *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) char *cpp, quoted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) kdbtab_t *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) int i, escaped, ignore_errors = 0, check_grep = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) * First tokenize the command string.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) cp = (char *)cmdstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (KDB_FLAG(CMD_INTERRUPT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* Previous command was interrupted, newline must not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * repeat the command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) KDB_FLAG_CLEAR(CMD_INTERRUPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) KDB_STATE_SET(PAGER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) argc = 0; /* no repeat */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) if (*cp != '\n' && *cp != '\0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) argc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) cpp = cbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) while (*cp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) /* skip whitespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) while (isspace(*cp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) if ((*cp == '\0') || (*cp == '\n') ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) (*cp == '#' && !defcmd_in_progress))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) /* special case: check for | grep pattern */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) if (*cp == '|') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) check_grep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) if (cpp >= cbuf + CMD_BUFLEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) kdb_printf("kdb_parse: command buffer "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) "overflow, command ignored\n%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) cmdstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) return KDB_NOTFOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) if (argc >= MAXARGC - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) kdb_printf("kdb_parse: too many arguments, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) "command ignored\n%s\n", cmdstr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) return KDB_NOTFOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) argv[argc++] = cpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) escaped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) quoted = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) /* Copy to next unquoted and unescaped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * whitespace or '=' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) while (*cp && *cp != '\n' &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) (escaped || quoted || !isspace(*cp))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (cpp >= cbuf + CMD_BUFLEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) if (escaped) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) escaped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) *cpp++ = *cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (*cp == '\\') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) escaped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) ++cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) if (*cp == quoted)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) quoted = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) else if (*cp == '\'' || *cp == '"')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) quoted = *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) *cpp = *cp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) if (*cpp == '=' && !quoted)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) ++cpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) *cpp++ = '\0'; /* Squash a ws or '=' character */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) if (!argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (check_grep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) parse_grep(cp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) if (defcmd_in_progress) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) int result = kdb_defcmd2(cmdstr, argv[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (!defcmd_in_progress) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) argc = 0; /* avoid repeat on endefcmd */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) *(argv[0]) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) if (argv[0][0] == '-' && argv[0][1] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) (argv[0][1] < '0' || argv[0][1] > '9')) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) ignore_errors = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) ++argv[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) for_each_kdbcmd(tp, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) if (tp->cmd_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) * If this command is allowed to be abbreviated,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) * check to see if this is it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (tp->cmd_minlen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) && (strlen(argv[0]) <= tp->cmd_minlen)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (strncmp(argv[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) tp->cmd_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) tp->cmd_minlen) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (strcmp(argv[0], tp->cmd_name) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) * If we don't find a command by this name, see if the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) * few characters of this match any of the known commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) * e.g., md1c20 should match md.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) if (i == kdb_max_commands) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) for_each_kdbcmd(tp, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (tp->cmd_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) if (strncmp(argv[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) tp->cmd_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) strlen(tp->cmd_name)) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (i < kdb_max_commands) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) if (!kdb_check_flags(tp->cmd_flags, kdb_cmd_enabled, argc <= 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) return KDB_NOPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) KDB_STATE_SET(CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) result = (*tp->cmd_func)(argc-1, (const char **)argv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) if (result && ignore_errors && result > KDB_CMD_GO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) KDB_STATE_CLEAR(CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) if (tp->cmd_flags & KDB_REPEAT_WITH_ARGS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) argc = tp->cmd_flags & KDB_REPEAT_NO_ARGS ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) if (argv[argc])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) *(argv[argc]) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * If the input with which we were presented does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) * map to an existing command, attempt to parse it as an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) * address argument and display the result. Useful for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) * obtaining the address of a variable, or the nearest symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) * to an address contained in a register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) unsigned long value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) char *name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) long offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) int nextarg = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) if (kdbgetaddrarg(0, (const char **)argv, &nextarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) &value, &offset, &name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) return KDB_NOTFOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) kdb_printf("%s = ", argv[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) kdb_symbol_print(value, NULL, KDB_SP_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static int handle_ctrl_cmd(char *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) #define CTRL_P 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) #define CTRL_N 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) /* initial situation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if (cmd_head == cmd_tail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) switch (*cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) case CTRL_P:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) if (cmdptr != cmd_tail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) cmdptr = (cmdptr + KDB_CMD_HISTORY_COUNT - 1) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) KDB_CMD_HISTORY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) strscpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) case CTRL_N:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) if (cmdptr != cmd_head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) cmdptr = (cmdptr+1) % KDB_CMD_HISTORY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) strscpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) * kdb_reboot - This function implements the 'reboot' command. Reboot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * the system immediately, or loop for ever on failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) static int kdb_reboot(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) emergency_restart();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) kdb_printf("Hmm, kdb_reboot did not reboot, spinning here\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) while (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) cpu_relax();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) /* NOTREACHED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) static void kdb_dumpregs(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) int old_lvl = console_loglevel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) kdb_trap_printk++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) show_regs(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) kdb_trap_printk--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) console_loglevel = old_lvl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) static void kdb_set_current_task(struct task_struct *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) kdb_current_task = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) if (kdb_task_has_cpu(p)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) kdb_current_regs = KDB_TSKREGS(kdb_process_cpu(p));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) kdb_current_regs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) static void drop_newline(char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) size_t len = strlen(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (len == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) if (*(buf + len - 1) == '\n')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) *(buf + len - 1) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * kdb_local - The main code for kdb. This routine is invoked on a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) * specific processor, it is not global. The main kdb() routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) * ensures that only one processor at a time is in this routine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * This code is called with the real reason code on the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) * entry to a kdb session, thereafter it is called with reason
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) * SWITCH, even if the user goes back to the original cpu.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) * reason The reason KDB was invoked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) * error The hardware-defined error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) * regs The exception frame at time of fault/breakpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) * db_result Result code from the break or debug point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) * 0 KDB was invoked for an event which it wasn't responsible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) * 1 KDB handled the event for which it was invoked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) * KDB_CMD_GO User typed 'go'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) * KDB_CMD_CPU User switched to another cpu.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * KDB_CMD_SS Single step.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) kdb_dbtrap_t db_result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) char *cmdbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) struct task_struct *kdb_current =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) kdb_curr_task(raw_smp_processor_id());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) KDB_DEBUG_STATE("kdb_local 1", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) kdb_go_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) if (reason == KDB_REASON_DEBUG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) /* special case below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) kdb_printf("\nEntering kdb (current=0x%px, pid %d) ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) kdb_current, kdb_current ? kdb_current->pid : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) #if defined(CONFIG_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) kdb_printf("on processor %d ", raw_smp_processor_id());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) switch (reason) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) case KDB_REASON_DEBUG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) * If re-entering kdb after a single step
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) * command, don't print the message.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) switch (db_result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) case KDB_DB_BPT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) kdb_printf("\nEntering kdb (0x%px, pid %d) ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) kdb_current, kdb_current->pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) #if defined(CONFIG_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) kdb_printf("on processor %d ", raw_smp_processor_id());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) kdb_printf("due to Debug @ " kdb_machreg_fmt "\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) instruction_pointer(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) case KDB_DB_SS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) case KDB_DB_SSBPT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) KDB_DEBUG_STATE("kdb_local 4", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) return 1; /* kdba_db_trap did the work */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) kdb_printf("kdb: Bad result from kdba_db_trap: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) db_result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) case KDB_REASON_ENTER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) if (KDB_STATE(KEYBOARD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) kdb_printf("due to Keyboard Entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) kdb_printf("due to KDB_ENTER()\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) case KDB_REASON_KEYBOARD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) KDB_STATE_SET(KEYBOARD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) kdb_printf("due to Keyboard Entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) case KDB_REASON_ENTER_SLAVE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) /* drop through, slaves only get released via cpu switch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) case KDB_REASON_SWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) kdb_printf("due to cpu switch\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) case KDB_REASON_OOPS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) kdb_printf("Oops: %s\n", kdb_diemsg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) kdb_printf("due to oops @ " kdb_machreg_fmt "\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) instruction_pointer(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) kdb_dumpregs(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) case KDB_REASON_SYSTEM_NMI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) kdb_printf("due to System NonMaskable Interrupt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) case KDB_REASON_NMI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) kdb_printf("due to NonMaskable Interrupt @ "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) kdb_machreg_fmt "\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) instruction_pointer(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) case KDB_REASON_SSTEP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) case KDB_REASON_BREAK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) kdb_printf("due to %s @ " kdb_machreg_fmt "\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) reason == KDB_REASON_BREAK ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) "Breakpoint" : "SS trap", instruction_pointer(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) * Determine if this breakpoint is one that we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) * are interested in.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (db_result != KDB_DB_BPT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) kdb_printf("kdb: error return from kdba_bp_trap: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) db_result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) KDB_DEBUG_STATE("kdb_local 6", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) return 0; /* Not for us, dismiss it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) case KDB_REASON_RECURSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) kdb_printf("due to Recursion @ " kdb_machreg_fmt "\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) instruction_pointer(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) kdb_printf("kdb: unexpected reason code: %d\n", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) KDB_DEBUG_STATE("kdb_local 8", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) return 0; /* Not for us, dismiss it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) * Initialize pager context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) kdb_nextline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) KDB_STATE_CLEAR(SUPPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) kdb_grepping_flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) /* ensure the old search does not leak into '/' commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) kdb_grep_string[0] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) cmdbuf = cmd_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) *cmdbuf = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) *(cmd_hist[cmd_head]) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) do_full_getstr:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) /* PROMPT can only be set if we have MEM_READ permission. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) snprintf(kdb_prompt_str, CMD_BUFLEN, kdbgetenv("PROMPT"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) raw_smp_processor_id());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) if (defcmd_in_progress)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) strncat(kdb_prompt_str, "[defcmd]", CMD_BUFLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) * Fetch command from keyboard
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) cmdbuf = kdb_getstr(cmdbuf, CMD_BUFLEN, kdb_prompt_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (*cmdbuf != '\n') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) if (*cmdbuf < 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) if (cmdptr == cmd_head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) strscpy(cmd_hist[cmd_head], cmd_cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) CMD_BUFLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) *(cmd_hist[cmd_head] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) strlen(cmd_hist[cmd_head])-1) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) if (!handle_ctrl_cmd(cmdbuf))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) *(cmd_cur+strlen(cmd_cur)-1) = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) cmdbuf = cmd_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) goto do_full_getstr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) strscpy(cmd_hist[cmd_head], cmd_cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) CMD_BUFLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) cmd_head = (cmd_head+1) % KDB_CMD_HISTORY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) if (cmd_head == cmd_tail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) cmd_tail = (cmd_tail+1) % KDB_CMD_HISTORY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) cmdptr = cmd_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) diag = kdb_parse(cmdbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (diag == KDB_NOTFOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) drop_newline(cmdbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) diag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) if (diag == KDB_CMD_GO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) || diag == KDB_CMD_CPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) || diag == KDB_CMD_SS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) || diag == KDB_CMD_KGDB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) kdb_cmderror(diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) KDB_DEBUG_STATE("kdb_local 9", diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) * kdb_print_state - Print the state data for the current processor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) * for debugging.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) * text Identifies the debug point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) * value Any integer value to be printed, e.g. reason code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) void kdb_print_state(const char *text, int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) kdb_printf("state: %s cpu %d value %d initial %d state %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) text, raw_smp_processor_id(), value, kdb_initial_cpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) kdb_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * kdb_main_loop - After initial setup and assignment of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * controlling cpu, all cpus are in this loop. One cpu is in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * control and will issue the kdb prompt, the others will spin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * until 'go' or cpu switch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) * To get a consistent view of the kernel stacks for all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) * processes, this routine is invoked from the main kdb code via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) * an architecture specific routine. kdba_main_loop is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) * responsible for making the kernel stacks consistent for all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) * processes, there should be no difference between a blocked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) * process and a running process as far as kdb is concerned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) * reason The reason KDB was invoked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) * error The hardware-defined error code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * reason2 kdb's current reason code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) * Initially error but can change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * according to kdb state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) * db_result Result code from break or debug point.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) * regs The exception frame at time of fault/breakpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * should always be valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * 0 KDB was invoked for an event which it wasn't responsible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) * 1 KDB handled the event for which it was invoked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) int kdb_main_loop(kdb_reason_t reason, kdb_reason_t reason2, int error,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) kdb_dbtrap_t db_result, struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) int result = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) /* Stay in kdb() until 'go', 'ss[b]' or an error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) * All processors except the one that is in control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) * will spin here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) KDB_DEBUG_STATE("kdb_main_loop 1", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) while (KDB_STATE(HOLD_CPU)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) /* state KDB is turned off by kdb_cpu to see if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) * other cpus are still live, each cpu in this loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) * turns it back on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (!KDB_STATE(KDB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) KDB_STATE_SET(KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) KDB_STATE_CLEAR(SUPPRESS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) KDB_DEBUG_STATE("kdb_main_loop 2", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) if (KDB_STATE(LEAVING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) break; /* Another cpu said 'go' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) /* Still using kdb, this processor is in control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) result = kdb_local(reason2, error, regs, db_result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) KDB_DEBUG_STATE("kdb_main_loop 3", result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (result == KDB_CMD_CPU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) if (result == KDB_CMD_SS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) KDB_STATE_SET(DOING_SS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) if (result == KDB_CMD_KGDB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (!KDB_STATE(DOING_KGDB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) kdb_printf("Entering please attach debugger "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) "or use $D#44+ or $3#33\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (result && result != 1 && result != KDB_CMD_GO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) kdb_printf("\nUnexpected kdb_local return code %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) KDB_DEBUG_STATE("kdb_main_loop 4", reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) if (KDB_STATE(DOING_SS))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) KDB_STATE_CLEAR(SSBPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) /* Clean up any keyboard devices before leaving */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) kdb_kbd_cleanup_state();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) * kdb_mdr - This function implements the guts of the 'mdr', memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) * read command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) * mdr <addr arg>,<byte count>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) * addr Start address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) * count Number of bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) * Always 0. Any errors are detected and printed by kdb_getarea.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) static int kdb_mdr(unsigned long addr, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) unsigned char c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) if (kdb_getarea(c, addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) kdb_printf("%02x", c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) addr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) * kdb_md - This function implements the 'md', 'md1', 'md2', 'md4',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) * 'md8' 'mdr' and 'mds' commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) * md|mds [<addr arg> [<line count> [<radix>]]]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) * mdWcN [<addr arg> [<line count> [<radix>]]]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) * where W = is the width (1, 2, 4 or 8) and N is the count.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) * for eg., md1c20 reads 20 bytes, 1 at a time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) * mdr <addr arg>,<byte count>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) static void kdb_md_line(const char *fmtstr, unsigned long addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) int symbolic, int nosect, int bytesperword,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) int num, int repeat, int phys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) /* print just one line of data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) kdb_symtab_t symtab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) char cbuf[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) char *c = cbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) int j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) unsigned long word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) memset(cbuf, '\0', sizeof(cbuf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (phys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) kdb_printf("phys " kdb_machreg_fmt0 " ", addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) kdb_printf(kdb_machreg_fmt0 " ", addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) for (i = 0; i < num && repeat--; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (phys) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) if (kdb_getphysword(&word, addr, bytesperword))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) } else if (kdb_getword(&word, addr, bytesperword))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) kdb_printf(fmtstr, word);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) if (symbolic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) kdbnearsym(word, &symtab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) memset(&symtab, 0, sizeof(symtab));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) if (symtab.sym_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) kdb_symbol_print(word, &symtab, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) if (!nosect) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) kdb_printf(" %s %s "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) kdb_machreg_fmt " "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) kdb_machreg_fmt " "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) kdb_machreg_fmt, symtab.mod_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) symtab.sec_name, symtab.sec_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) symtab.sym_start, symtab.sym_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) addr += bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) u64 word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) unsigned char c[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) } wc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) unsigned char *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) #ifdef __BIG_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) cp = wc.c + 8 - bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) cp = wc.c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) wc.word = word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) #define printable_char(c) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) ({unsigned char __c = c; isascii(__c) && isprint(__c) ? __c : '.'; })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) for (j = 0; j < bytesperword; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) *c++ = printable_char(*cp++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) addr += bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) #undef printable_char
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) kdb_printf("%*s %s\n", (int)((num-i)*(2*bytesperword + 1)+1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) " ", cbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) static int kdb_md(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) static unsigned long last_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) static int last_radix, last_bytesperword, last_repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) int radix = 16, mdcount = 8, bytesperword = KDB_WORD_SIZE, repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) int nosect = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) char fmtchar, fmtstr[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) unsigned long word;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) long offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) int symbolic = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) int valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) int phys = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) int raw = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) kdbgetintenv("MDCOUNT", &mdcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) kdbgetintenv("RADIX", &radix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) kdbgetintenv("BYTESPERWORD", &bytesperword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) /* Assume 'md <addr>' and start with environment values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) repeat = mdcount * 16 / bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (strcmp(argv[0], "mdr") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) if (argc == 2 || (argc == 0 && last_addr != 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) valid = raw = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) } else if (isdigit(argv[0][2])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) bytesperword = (int)(argv[0][2] - '0');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) if (bytesperword == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) bytesperword = last_bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) if (bytesperword == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) bytesperword = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) last_bytesperword = bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) repeat = mdcount * 16 / bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) if (!argv[0][3])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) else if (argv[0][3] == 'c' && argv[0][4]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) char *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) repeat = simple_strtoul(argv[0] + 4, &p, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) mdcount = ((repeat * bytesperword) + 15) / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) valid = !*p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) last_repeat = repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) } else if (strcmp(argv[0], "md") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) else if (strcmp(argv[0], "mds") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) else if (strcmp(argv[0], "mdp") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) phys = valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) if (!valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) return KDB_NOTFOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) if (argc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (last_addr == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) addr = last_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) radix = last_radix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) bytesperword = last_bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) repeat = last_repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (raw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) mdcount = repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) mdcount = ((repeat * bytesperword) + 15) / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) if (argc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) int diag, nextarg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) diag = kdbgetaddrarg(argc, argv, &nextarg, &addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) &offset, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) if (argc > nextarg+2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) if (argc >= nextarg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) diag = kdbgetularg(argv[nextarg], &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) if (!diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) mdcount = (int) val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) if (raw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) repeat = mdcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) repeat = mdcount * 16 / bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) if (argc >= nextarg+1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) diag = kdbgetularg(argv[nextarg+1], &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) if (!diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) radix = (int) val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) if (strcmp(argv[0], "mdr") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) last_addr = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) ret = kdb_mdr(addr, mdcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) last_addr += mdcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) last_repeat = mdcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) last_bytesperword = bytesperword; // to make REPEAT happy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) switch (radix) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) fmtchar = 'd';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) fmtchar = 'x';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) fmtchar = 'o';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) return KDB_BADRADIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) last_radix = radix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) if (bytesperword > KDB_WORD_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) return KDB_BADWIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) switch (bytesperword) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) sprintf(fmtstr, "%%16.16l%c ", fmtchar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) sprintf(fmtstr, "%%8.8l%c ", fmtchar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) sprintf(fmtstr, "%%4.4l%c ", fmtchar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) sprintf(fmtstr, "%%2.2l%c ", fmtchar);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) return KDB_BADWIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) last_repeat = repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) last_bytesperword = bytesperword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (strcmp(argv[0], "mds") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) symbolic = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) /* Do not save these changes as last_*, they are temporary mds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) * overrides.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) bytesperword = KDB_WORD_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) repeat = mdcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) kdbgetintenv("NOSECT", &nosect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) /* Round address down modulo BYTESPERWORD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) addr &= ~(bytesperword-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) while (repeat > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) unsigned long a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) int n, z, num = (symbolic ? 1 : (16 / bytesperword));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) for (a = addr, z = 0; z < repeat; a += bytesperword, ++z) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) if (phys) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) if (kdb_getphysword(&word, a, bytesperword)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) || word)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) } else if (kdb_getword(&word, a, bytesperword) || word)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) n = min(num, repeat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) kdb_md_line(fmtstr, addr, symbolic, nosect, bytesperword,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) num, repeat, phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) addr += bytesperword * n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) repeat -= n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) z = (z + num - 1) / num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (z > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) int s = num * (z-2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) kdb_printf(kdb_machreg_fmt0 "-" kdb_machreg_fmt0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) " zero suppressed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) addr, addr + bytesperword * s - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) addr += bytesperword * s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) repeat -= s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) last_addr = addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) * kdb_mm - This function implements the 'mm' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) * mm address-expression new-value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) * Remarks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) * mm works on machine words, mmW works on bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) static int kdb_mm(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) long offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) unsigned long contents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) int nextarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) int width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) if (argv[0][2] && !isdigit(argv[0][2]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) return KDB_NOTFOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) if (argc < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) nextarg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) if (nextarg > argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) diag = kdbgetaddrarg(argc, argv, &nextarg, &contents, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) if (nextarg != argc + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) width = argv[0][2] ? (argv[0][2] - '0') : (KDB_WORD_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) diag = kdb_putword(addr, contents, width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) kdb_printf(kdb_machreg_fmt " = " kdb_machreg_fmt "\n", addr, contents);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) * kdb_go - This function implements the 'go' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) * go [address-expression]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) static int kdb_go(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) int nextarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) long offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) if (raw_smp_processor_id() != kdb_initial_cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) kdb_printf("go must execute on the entry cpu, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) "please use \"cpu %d\" and then execute go\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) kdb_initial_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) return KDB_BADCPUNUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) if (argc == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) nextarg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) diag = kdbgetaddrarg(argc, argv, &nextarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) &addr, &offset, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) } else if (argc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) diag = KDB_CMD_GO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) if (KDB_FLAG(CATASTROPHIC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) kdb_printf("Catastrophic error detected\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) kdb_printf("kdb_continue_catastrophic=%d, ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) kdb_continue_catastrophic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) if (kdb_continue_catastrophic == 0 && kdb_go_count++ == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) kdb_printf("type go a second time if you really want "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) "to continue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) if (kdb_continue_catastrophic == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) kdb_printf("forcing reboot\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) kdb_reboot(0, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) kdb_printf("attempting to continue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) * kdb_rd - This function implements the 'rd' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) static int kdb_rd(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) int len = kdb_check_regs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) #if DBG_MAX_REG_NUM > 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) char *rname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) int rsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) u64 reg64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) u32 reg32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) u16 reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) u8 reg8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) for (i = 0; i < DBG_MAX_REG_NUM; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) rsize = dbg_reg_def[i].size * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) if (rsize > 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) rsize = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) if (len + strlen(dbg_reg_def[i].name) + 4 + rsize > 80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) len += kdb_printf(" ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) switch(dbg_reg_def[i].size * 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) rname = dbg_get_reg(i, ®8, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) if (!rname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) len += kdb_printf("%s: %02x", rname, reg8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) rname = dbg_get_reg(i, ®16, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) if (!rname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) len += kdb_printf("%s: %04x", rname, reg16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) rname = dbg_get_reg(i, ®32, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) if (!rname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) len += kdb_printf("%s: %08x", rname, reg32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) case 64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) rname = dbg_get_reg(i, ®64, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (!rname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) len += kdb_printf("%s: %016llx", rname, reg64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) len += kdb_printf("%s: ??", dbg_reg_def[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) kdb_dumpregs(kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) * kdb_rm - This function implements the 'rm' (register modify) command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) * rm register-name new-contents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) * Remarks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) * Allows register modification with the same restrictions as gdb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) static int kdb_rm(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) #if DBG_MAX_REG_NUM > 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) const char *rname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) u64 reg64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) u32 reg32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) u16 reg16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) u8 reg8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) if (argc != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) * Allow presence or absence of leading '%' symbol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) rname = argv[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (*rname == '%')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) rname++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) diag = kdbgetu64arg(argv[2], ®64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) diag = kdb_check_regs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) diag = KDB_BADREG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) for (i = 0; i < DBG_MAX_REG_NUM; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) if (strcmp(rname, dbg_reg_def[i].name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) diag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) if (!diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) switch(dbg_reg_def[i].size * 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) reg8 = reg64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) dbg_set_reg(i, ®8, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) reg16 = reg64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) dbg_set_reg(i, ®16, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) reg32 = reg64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) dbg_set_reg(i, ®32, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) case 64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) dbg_set_reg(i, ®64, kdb_current_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) kdb_printf("ERROR: Register set currently not implemented\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) #if defined(CONFIG_MAGIC_SYSRQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) * kdb_sr - This function implements the 'sr' (SYSRQ key) command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) * which interfaces to the soi-disant MAGIC SYSRQ functionality.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) * sr <magic-sysrq-code>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) static int kdb_sr(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) bool check_mask =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) !kdb_check_flags(KDB_ENABLE_ALL, kdb_cmd_enabled, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) if (argc != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) kdb_trap_printk++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) __handle_sysrq(*argv[1], check_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) kdb_trap_printk--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) #endif /* CONFIG_MAGIC_SYSRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) * kdb_ef - This function implements the 'regs' (display exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) * frame) command. This command takes an address and expects to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) * find an exception frame at that address, formats and prints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) * it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) * regs address-expression
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * Remarks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) * Not done yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) static int kdb_ef(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) long offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) int nextarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) if (argc != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) nextarg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) show_regs((struct pt_regs *)addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) #if defined(CONFIG_MODULES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) * kdb_lsmod - This function implements the 'lsmod' command. Lists
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) * currently loaded kernel modules.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) * Mostly taken from userland lsmod.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) static int kdb_lsmod(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) struct module *mod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) if (argc != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) kdb_printf("Module Size modstruct Used by\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) list_for_each_entry(mod, kdb_modules, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) if (mod->state == MODULE_STATE_UNFORMED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) kdb_printf("%-20s%8u 0x%px ", mod->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) mod->core_layout.size, (void *)mod);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) #ifdef CONFIG_MODULE_UNLOAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) kdb_printf("%4d ", module_refcount(mod));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) if (mod->state == MODULE_STATE_GOING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) kdb_printf(" (Unloading)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) else if (mod->state == MODULE_STATE_COMING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) kdb_printf(" (Loading)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) kdb_printf(" (Live)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) kdb_printf(" 0x%px", mod->core_layout.base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) #ifdef CONFIG_MODULE_UNLOAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) struct module_use *use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) kdb_printf(" [ ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) list_for_each_entry(use, &mod->source_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) source_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) kdb_printf("%s ", use->target->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) kdb_printf("]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) #endif /* CONFIG_MODULES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) * kdb_env - This function implements the 'env' command. Display the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) * current environment variables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) static int kdb_env(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) for (i = 0; i < __nenv; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) if (__env[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) kdb_printf("%s\n", __env[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) if (KDB_DEBUG(MASK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) kdb_printf("KDBDEBUG=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) (kdb_flags & KDB_DEBUG(MASK)) >> KDB_DEBUG_FLAG_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) #ifdef CONFIG_PRINTK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) * kdb_dmesg - This function implements the 'dmesg' command to display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) * the contents of the syslog buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) * dmesg [lines] [adjust]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) static int kdb_dmesg(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) int logging;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) int lines = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) int adjust = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) int n = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) int skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) struct kmsg_dumper dumper = { .active = 1 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) char buf[201];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) if (argc > 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) if (argc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) char *cp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) lines = simple_strtol(argv[1], &cp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) if (*cp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) lines = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) if (argc > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) adjust = simple_strtoul(argv[2], &cp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) if (*cp || adjust < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) adjust = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) /* disable LOGGING if set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) diag = kdbgetintenv("LOGGING", &logging);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) if (!diag && logging) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) const char *setargs[] = { "set", "LOGGING", "0" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) kdb_set(2, setargs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) kmsg_dump_rewind_nolock(&dumper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) while (kmsg_dump_get_line_nolock(&dumper, 1, NULL, 0, NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) n++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) if (lines < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) if (adjust >= n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) kdb_printf("buffer only contains %d lines, nothing "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) "printed\n", n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) else if (adjust - lines >= n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) kdb_printf("buffer only contains %d lines, last %d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) "lines printed\n", n, n - adjust);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) skip = adjust;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) lines = abs(lines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) } else if (lines > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) skip = n - lines - adjust;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) lines = abs(lines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) if (adjust >= n) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) kdb_printf("buffer only contains %d lines, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) "nothing printed\n", n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) skip = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) } else if (skip < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) lines += skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) kdb_printf("buffer only contains %d lines, first "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) "%d lines printed\n", n, lines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) lines = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) if (skip >= n || skip < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) kmsg_dump_rewind_nolock(&dumper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) while (kmsg_dump_get_line_nolock(&dumper, 1, buf, sizeof(buf), &len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) if (skip) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) skip--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) if (!lines--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) kdb_printf("%.*s\n", (int)len - 1, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) #endif /* CONFIG_PRINTK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) /* Make sure we balance enable/disable calls, must disable first. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) static atomic_t kdb_nmi_disabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) static int kdb_disable_nmi(int argc, const char *argv[])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (atomic_read(&kdb_nmi_disabled))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) atomic_set(&kdb_nmi_disabled, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) arch_kgdb_ops.enable_nmi(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) static int kdb_param_enable_nmi(const char *val, const struct kernel_param *kp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) if (!atomic_add_unless(&kdb_nmi_disabled, -1, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) arch_kgdb_ops.enable_nmi(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) static const struct kernel_param_ops kdb_param_ops_enable_nmi = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) .set = kdb_param_enable_nmi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) module_param_cb(enable_nmi, &kdb_param_ops_enable_nmi, NULL, 0600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) * kdb_cpu - This function implements the 'cpu' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) * cpu [<cpunum>]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) * KDB_CMD_CPU for success, a kdb diagnostic if error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) static void kdb_cpu_status(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) int i, start_cpu, first_print = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) char state, prev_state = '?';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) kdb_printf("Currently on cpu %d\n", raw_smp_processor_id());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) kdb_printf("Available cpus: ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) for (start_cpu = -1, i = 0; i < NR_CPUS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) if (!cpu_online(i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) state = 'F'; /* cpu is offline */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) } else if (!kgdb_info[i].enter_kgdb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) state = 'D'; /* cpu is online but unresponsive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) state = ' '; /* cpu is responding to kdb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) if (kdb_task_state_char(KDB_TSK(i)) == 'I')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) state = 'I'; /* idle task */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) if (state != prev_state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) if (prev_state != '?') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) if (!first_print)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) kdb_printf(", ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) first_print = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) kdb_printf("%d", start_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) if (start_cpu < i-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) kdb_printf("-%d", i-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) if (prev_state != ' ')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) kdb_printf("(%c)", prev_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) prev_state = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) start_cpu = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) /* print the trailing cpus, ignoring them if they are all offline */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) if (prev_state != 'F') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) if (!first_print)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) kdb_printf(", ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) kdb_printf("%d", start_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) if (start_cpu < i-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) kdb_printf("-%d", i-1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) if (prev_state != ' ')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) kdb_printf("(%c)", prev_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) static int kdb_cpu(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) unsigned long cpunum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) if (argc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) kdb_cpu_status();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) if (argc != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) diag = kdbgetularg(argv[1], &cpunum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) * Validate cpunum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) if ((cpunum >= CONFIG_NR_CPUS) || !kgdb_info[cpunum].enter_kgdb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) return KDB_BADCPUNUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) dbg_switch_cpu = cpunum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) * Switch to other cpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) return KDB_CMD_CPU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) /* The user may not realize that ps/bta with no parameters does not print idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) * or sleeping system daemon processes, so tell them how many were suppressed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) void kdb_ps_suppressed(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) int idle = 0, daemon = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) unsigned long mask_I = kdb_task_state_string("I"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) mask_M = kdb_task_state_string("M");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) unsigned long cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) const struct task_struct *p, *g;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) for_each_online_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) p = kdb_curr_task(cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) if (kdb_task_state(p, mask_I))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) ++idle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) for_each_process_thread(g, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) if (kdb_task_state(p, mask_M))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) ++daemon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) if (idle || daemon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) if (idle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) kdb_printf("%d idle process%s (state I)%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) idle, idle == 1 ? "" : "es",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) daemon ? " and " : "");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) if (daemon)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) kdb_printf("%d sleeping system daemon (state M) "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) "process%s", daemon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) daemon == 1 ? "" : "es");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) kdb_printf(" suppressed,\nuse 'ps A' to see all.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) * kdb_ps - This function implements the 'ps' command which shows a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) * list of the active processes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) * ps [DRSTCZEUIMA] All processes, optionally filtered by state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) void kdb_ps1(const struct task_struct *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) int cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) unsigned long tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) if (!p ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) copy_from_kernel_nofault(&tmp, (char *)p, sizeof(unsigned long)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) cpu = kdb_process_cpu(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) kdb_printf("0x%px %8d %8d %d %4d %c 0x%px %c%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) (void *)p, p->pid, p->parent->pid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) kdb_task_has_cpu(p), kdb_process_cpu(p),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) kdb_task_state_char(p),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) (void *)(&p->thread),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) p == kdb_curr_task(raw_smp_processor_id()) ? '*' : ' ',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) p->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) if (kdb_task_has_cpu(p)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) if (!KDB_TSK(cpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) kdb_printf(" Error: no saved data for this cpu\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) if (KDB_TSK(cpu) != p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) kdb_printf(" Error: does not match running "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) "process table (0x%px)\n", KDB_TSK(cpu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) static int kdb_ps(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) struct task_struct *g, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) unsigned long mask, cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) if (argc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) kdb_ps_suppressed();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) kdb_printf("%-*s Pid Parent [*] cpu State %-*s Command\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) (int)(2*sizeof(void *))+2, "Task Addr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) (int)(2*sizeof(void *))+2, "Thread");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) mask = kdb_task_state_string(argc ? argv[1] : NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) /* Run the active tasks first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) for_each_online_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) p = kdb_curr_task(cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) if (kdb_task_state(p, mask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) kdb_ps1(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) kdb_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) /* Now the real tasks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) for_each_process_thread(g, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) if (kdb_task_state(p, mask))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) kdb_ps1(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) * kdb_pid - This function implements the 'pid' command which switches
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) * the currently active process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) * pid [<pid> | R]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) static int kdb_pid(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) struct task_struct *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) int diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) if (argc > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) if (argc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) if (strcmp(argv[1], "R") == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) p = KDB_TSK(kdb_initial_cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) diag = kdbgetularg(argv[1], &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) return KDB_BADINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) p = find_task_by_pid_ns((pid_t)val, &init_pid_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) if (!p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) kdb_printf("No task with pid=%d\n", (pid_t)val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) kdb_set_current_task(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) kdb_printf("KDB current process is %s(pid=%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) kdb_current_task->comm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) kdb_current_task->pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) static int kdb_kgdb(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) return KDB_CMD_KGDB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) * kdb_help - This function implements the 'help' and '?' commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) static int kdb_help(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) kdbtab_t *kt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) kdb_printf("%-15.15s %-20.20s %s\n", "Command", "Usage", "Description");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) kdb_printf("-----------------------------"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) "-----------------------------\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) for_each_kdbcmd(kt, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) char *space = "";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) if (!kt->cmd_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) if (!kdb_check_flags(kt->cmd_flags, kdb_cmd_enabled, true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) if (strlen(kt->cmd_usage) > 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) space = "\n ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) kdb_printf("%-15.15s %-20s%s%s\n", kt->cmd_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) kt->cmd_usage, space, kt->cmd_help);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) * kdb_kill - This function implements the 'kill' commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) static int kdb_kill(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) long sig, pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) char *endp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) struct task_struct *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) if (argc != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) sig = simple_strtol(argv[1], &endp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) if (*endp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) return KDB_BADINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) if ((sig >= 0) || !valid_signal(-sig)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) kdb_printf("Invalid signal parameter.<-signal>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) sig = -sig;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) pid = simple_strtol(argv[2], &endp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) if (*endp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) return KDB_BADINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) if (pid <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) kdb_printf("Process ID must be large than 0.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) /* Find the process. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) p = find_task_by_pid_ns(pid, &init_pid_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) if (!p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) kdb_printf("The specified process isn't found.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) p = p->group_leader;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) kdb_send_sig(p, sig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) * I cannot call that code directly from kdb, it has an unconditional
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) * cli()/sti() and calls routines that take locks which can stop the debugger.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) static void kdb_sysinfo(struct sysinfo *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) u64 uptime = ktime_get_mono_fast_ns();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) memset(val, 0, sizeof(*val));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) val->uptime = div_u64(uptime, NSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) val->loads[0] = avenrun[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) val->loads[1] = avenrun[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) val->loads[2] = avenrun[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) val->procs = nr_threads-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) si_meminfo(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) * kdb_summary - This function implements the 'summary' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) static int kdb_summary(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) time64_t now;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) struct tm tm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) struct sysinfo val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) if (argc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) kdb_printf("sysname %s\n", init_uts_ns.name.sysname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) kdb_printf("release %s\n", init_uts_ns.name.release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) kdb_printf("version %s\n", init_uts_ns.name.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) kdb_printf("machine %s\n", init_uts_ns.name.machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) kdb_printf("nodename %s\n", init_uts_ns.name.nodename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) now = __ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) time64_to_tm(now, 0, &tm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) "tz_minuteswest %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) tm.tm_hour, tm.tm_min, tm.tm_sec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) sys_tz.tz_minuteswest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) kdb_sysinfo(&val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) kdb_printf("uptime ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) if (val.uptime > (24*60*60)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) int days = val.uptime / (24*60*60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) val.uptime %= (24*60*60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) kdb_printf("%d day%s ", days, days == 1 ? "" : "s");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) kdb_printf("%02ld:%02ld\n", val.uptime/(60*60), (val.uptime/60)%60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) kdb_printf("load avg %ld.%02ld %ld.%02ld %ld.%02ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) LOAD_INT(val.loads[0]), LOAD_FRAC(val.loads[0]),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) LOAD_INT(val.loads[1]), LOAD_FRAC(val.loads[1]),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) LOAD_INT(val.loads[2]), LOAD_FRAC(val.loads[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) /* Display in kilobytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) #define K(x) ((x) << (PAGE_SHIFT - 10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) kdb_printf("\nMemTotal: %8lu kB\nMemFree: %8lu kB\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) "Buffers: %8lu kB\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) K(val.totalram), K(val.freeram), K(val.bufferram));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) * kdb_per_cpu - This function implements the 'per_cpu' command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) static int kdb_per_cpu(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) char fmtstr[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) int cpu, diag, nextarg = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) unsigned long addr, symaddr, val, bytesperword = 0, whichcpu = ~0UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) if (argc < 1 || argc > 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) return KDB_ARGCOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) diag = kdbgetaddrarg(argc, argv, &nextarg, &symaddr, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) if (argc >= 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) diag = kdbgetularg(argv[2], &bytesperword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) if (!bytesperword)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) bytesperword = KDB_WORD_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) else if (bytesperword > KDB_WORD_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) return KDB_BADWIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) sprintf(fmtstr, "%%0%dlx ", (int)(2*bytesperword));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) if (argc >= 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) diag = kdbgetularg(argv[3], &whichcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) return diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) kdb_printf("cpu %ld is not online\n", whichcpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) return KDB_BADCPUNUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) /* Most architectures use __per_cpu_offset[cpu], some use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) * __per_cpu_offset(cpu), smp has no __per_cpu_offset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) #ifdef __per_cpu_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) #define KDB_PCU(cpu) __per_cpu_offset(cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) #define KDB_PCU(cpu) __per_cpu_offset[cpu]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) #define KDB_PCU(cpu) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) for_each_online_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) if (KDB_FLAG(CMD_INTERRUPT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) if (whichcpu != ~0UL && whichcpu != cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) addr = symaddr + KDB_PCU(cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) diag = kdb_getword(&val, addr, bytesperword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) if (diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) kdb_printf("%5d " kdb_bfd_vma_fmt0 " - unable to "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) "read, diag=%d\n", cpu, addr, diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) kdb_printf("%5d ", cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) kdb_md_line(fmtstr, addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) bytesperword == KDB_WORD_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 1, bytesperword, 1, 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) #undef KDB_PCU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) * display help for the use of cmd | grep pattern
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) static int kdb_grep_help(int argc, const char **argv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) kdb_printf("Usage of cmd args | grep pattern:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) kdb_printf(" Any command's output may be filtered through an ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) kdb_printf("emulated 'pipe'.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) kdb_printf(" 'grep' is just a key word.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) kdb_printf(" The pattern may include a very limited set of "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) "metacharacters:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) kdb_printf(" pattern or ^pattern or pattern$ or ^pattern$\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) kdb_printf(" And if there are spaces in the pattern, you may "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) "quote it:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) kdb_printf(" \"pat tern\" or \"^pat tern\" or \"pat tern$\""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) " or \"^pat tern$\"\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) * kdb_register_flags - This function is used to register a kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) * debugger command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) * cmd Command name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) * func Function to execute the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) * usage A simple usage string showing arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) * help A simple help string describing command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) * repeat Does the command auto repeat on enter?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) * zero for success, one if a duplicate command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) #define kdb_command_extend 50 /* arbitrary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) int kdb_register_flags(char *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) kdb_func_t func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) char *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) char *help,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) short minlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) kdb_cmdflags_t flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) kdbtab_t *kp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) * Brute force method to determine duplicates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) for_each_kdbcmd(kp, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) if (kp->cmd_name && (strcmp(kp->cmd_name, cmd) == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) kdb_printf("Duplicate kdb command registered: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) "%s, func %px help %s\n", cmd, func, help);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) * Insert command into first available location in table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) for_each_kdbcmd(kp, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) if (kp->cmd_name == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) if (i >= kdb_max_commands) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) kdbtab_t *new = kmalloc_array(kdb_max_commands -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) KDB_BASE_CMD_MAX +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) kdb_command_extend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) sizeof(*new),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) GFP_KDB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) if (!new) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) kdb_printf("Could not allocate new kdb_command "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) "table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) if (kdb_commands) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) memcpy(new, kdb_commands,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) (kdb_max_commands - KDB_BASE_CMD_MAX) * sizeof(*new));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) kfree(kdb_commands);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) memset(new + kdb_max_commands - KDB_BASE_CMD_MAX, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) kdb_command_extend * sizeof(*new));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) kdb_commands = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) kp = kdb_commands + kdb_max_commands - KDB_BASE_CMD_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) kdb_max_commands += kdb_command_extend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) kp->cmd_name = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) kp->cmd_func = func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) kp->cmd_usage = usage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) kp->cmd_help = help;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) kp->cmd_minlen = minlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) kp->cmd_flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) EXPORT_SYMBOL_GPL(kdb_register_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) * kdb_register - Compatibility register function for commands that do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) * not need to specify a repeat state. Equivalent to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) * kdb_register_flags with flags set to 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) * cmd Command name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) * func Function to execute the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) * usage A simple usage string showing arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) * help A simple help string describing command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) * zero for success, one if a duplicate command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) int kdb_register(char *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) kdb_func_t func,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) char *usage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) char *help,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) short minlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) return kdb_register_flags(cmd, func, usage, help, minlen, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) EXPORT_SYMBOL_GPL(kdb_register);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) * kdb_unregister - This function is used to unregister a kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) * debugger command. It is generally called when a module which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) * implements kdb commands is unloaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) * Inputs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) * cmd Command name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) * zero for success, one command not registered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) int kdb_unregister(char *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) kdbtab_t *kp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) * find the command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) for_each_kdbcmd(kp, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) if (kp->cmd_name && (strcmp(kp->cmd_name, cmd) == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) kp->cmd_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) /* Couldn't find it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) EXPORT_SYMBOL_GPL(kdb_unregister);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) /* Initialize the kdb command table. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) static void __init kdb_inittab(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) kdbtab_t *kp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) for_each_kdbcmd(kp, i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) kp->cmd_name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) kdb_register_flags("md", kdb_md, "<vaddr>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) "Display Memory Contents, also mdWcN, e.g. md8c1", 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) kdb_register_flags("mdr", kdb_md, "<vaddr> <bytes>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) "Display Raw Memory", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) kdb_register_flags("mdp", kdb_md, "<paddr> <bytes>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) "Display Physical Memory", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) kdb_register_flags("mds", kdb_md, "<vaddr>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) "Display Memory Symbolically", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) kdb_register_flags("mm", kdb_mm, "<vaddr> <contents>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) "Modify Memory Contents", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) kdb_register_flags("go", kdb_go, "[<vaddr>]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) "Continue Execution", 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) KDB_ENABLE_REG_WRITE | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) kdb_register_flags("rd", kdb_rd, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) "Display Registers", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) KDB_ENABLE_REG_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) kdb_register_flags("rm", kdb_rm, "<reg> <contents>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) "Modify Registers", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) KDB_ENABLE_REG_WRITE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) kdb_register_flags("ef", kdb_ef, "<vaddr>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) "Display exception frame", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) KDB_ENABLE_MEM_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) kdb_register_flags("bt", kdb_bt, "[<vaddr>]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) "Stack traceback", 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) kdb_register_flags("btp", kdb_bt, "<pid>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) "Display stack for process <pid>", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) kdb_register_flags("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) "Backtrace all processes matching state flag", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) kdb_register_flags("btc", kdb_bt, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) "Backtrace current process on each cpu", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) kdb_register_flags("btt", kdb_bt, "<vaddr>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) "Backtrace process given its struct task address", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) kdb_register_flags("env", kdb_env, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) "Show environment variables", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) kdb_register_flags("set", kdb_set, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) "Set environment variables", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) kdb_register_flags("help", kdb_help, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) "Display Help Message", 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) kdb_register_flags("?", kdb_help, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) "Display Help Message", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) kdb_register_flags("cpu", kdb_cpu, "<cpunum>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) "Switch to new cpu", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) KDB_ENABLE_ALWAYS_SAFE_NO_ARGS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) kdb_register_flags("kgdb", kdb_kgdb, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) "Enter kgdb mode", 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) kdb_register_flags("ps", kdb_ps, "[<flags>|A]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) "Display active task list", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) kdb_register_flags("pid", kdb_pid, "<pidnum>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) "Switch to another task", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) kdb_register_flags("reboot", kdb_reboot, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) "Reboot the machine immediately", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) KDB_ENABLE_REBOOT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) #if defined(CONFIG_MODULES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) kdb_register_flags("lsmod", kdb_lsmod, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) "List loaded kernel modules", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) KDB_ENABLE_INSPECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) #if defined(CONFIG_MAGIC_SYSRQ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) kdb_register_flags("sr", kdb_sr, "<key>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) "Magic SysRq key", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) #if defined(CONFIG_PRINTK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) kdb_register_flags("dmesg", kdb_dmesg, "[lines]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) "Display syslog buffer", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) if (arch_kgdb_ops.enable_nmi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) kdb_register_flags("disable_nmi", kdb_disable_nmi, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) "Disable NMI entry to KDB", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) kdb_register_flags("defcmd", kdb_defcmd, "name \"usage\" \"help\"",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) "Define a set of commands, down to endefcmd", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) kdb_register_flags("kill", kdb_kill, "<-signal> <pid>",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) "Send a signal to a process", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) KDB_ENABLE_SIGNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) kdb_register_flags("summary", kdb_summary, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) "Summarize the system", 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) kdb_register_flags("per_cpu", kdb_per_cpu, "<sym> [<bytes>] [<cpu>]",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) "Display per_cpu variables", 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) KDB_ENABLE_MEM_READ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) kdb_register_flags("grephelp", kdb_grep_help, "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) "Display help on | grep", 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) KDB_ENABLE_ALWAYS_SAFE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) /* Execute any commands defined in kdb_cmds. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) static void __init kdb_cmd_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) int i, diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) for (i = 0; kdb_cmds[i]; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) diag = kdb_parse(kdb_cmds[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) if (diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) kdb_printf("kdb command %s failed, kdb diag %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) kdb_cmds[i], diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) if (defcmd_in_progress) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) kdb_printf("Incomplete 'defcmd' set, forcing endefcmd\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) kdb_parse("endefcmd");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) /* Initialize kdb_printf, breakpoint tables and kdb state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) void __init kdb_init(int lvl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) static int kdb_init_lvl = KDB_NOT_INITIALIZED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) if (kdb_init_lvl == KDB_INIT_FULL || lvl <= kdb_init_lvl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) for (i = kdb_init_lvl; i < lvl; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) switch (i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) case KDB_NOT_INITIALIZED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) kdb_inittab(); /* Initialize Command Table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) kdb_initbptab(); /* Initialize Breakpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) case KDB_INIT_EARLY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) kdb_cmd_init(); /* Build kdb_cmds tables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) kdb_init_lvl = lvl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) }