Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags   |
^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, &reg8, 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, &reg16, 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, &reg32, 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, &reg64, 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], &reg64);
^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, &reg8, 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, &reg16, 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, &reg32, 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, &reg64, 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) }