blob: 0852a537dad4c083d651da7b80d3bbf48f181f61 [file] [log] [blame]
Jason Wessel5d5314d2010-05-20 21:04:20 -05001/*
2 * Kernel Debugger Architecture Independent Main Code
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 *
8 * Copyright (C) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
9 * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
10 * Xscale (R) modifications copyright (C) 2003 Intel Corporation.
11 * Copyright (c) 2009 Wind River Systems, Inc. All Rights Reserved.
12 */
13
14#include <linux/ctype.h>
Anton Vorontsov420c2b12014-11-06 14:36:46 +000015#include <linux/types.h>
Jason Wessel5d5314d2010-05-20 21:04:20 -050016#include <linux/string.h>
17#include <linux/kernel.h>
Anton Vorontsovbc792e62012-07-20 17:27:37 -070018#include <linux/kmsg_dump.h>
Jason Wessel5d5314d2010-05-20 21:04:20 -050019#include <linux/reboot.h>
20#include <linux/sched.h>
Ingo Molnar4f177222017-02-08 08:45:17 +010021#include <linux/sched/loadavg.h>
Ingo Molnar03441a32017-02-08 18:51:35 +010022#include <linux/sched/stat.h>
Ingo Molnarb17b0152017-02-08 18:51:35 +010023#include <linux/sched/debug.h>
Jason Wessel5d5314d2010-05-20 21:04:20 -050024#include <linux/sysrq.h>
25#include <linux/smp.h>
26#include <linux/utsname.h>
27#include <linux/vmalloc.h>
Anton Vorontsovad394f62012-09-24 14:27:51 -070028#include <linux/atomic.h>
Jason Wessel5d5314d2010-05-20 21:04:20 -050029#include <linux/module.h>
Anton Vorontsov420c2b12014-11-06 14:36:46 +000030#include <linux/moduleparam.h>
Jason Wessel5d5314d2010-05-20 21:04:20 -050031#include <linux/mm.h>
32#include <linux/init.h>
33#include <linux/kallsyms.h>
34#include <linux/kgdb.h>
35#include <linux/kdb.h>
36#include <linux/notifier.h>
37#include <linux/interrupt.h>
38#include <linux/delay.h>
39#include <linux/nmi.h>
40#include <linux/time.h>
41#include <linux/ptrace.h>
42#include <linux/sysctl.h>
43#include <linux/cpu.h>
44#include <linux/kdebug.h>
45#include <linux/proc_fs.h>
46#include <linux/uaccess.h>
47#include <linux/slab.h>
48#include "kdb_private.h"
49
Anton Vorontsov420c2b12014-11-06 14:36:46 +000050#undef MODULE_PARAM_PREFIX
51#define MODULE_PARAM_PREFIX "kdb."
52
Daniel Thompsonb8017172014-11-06 14:36:47 +000053static int kdb_cmd_enabled = CONFIG_KDB_DEFAULT_ENABLE;
Anton Vorontsov420c2b12014-11-06 14:36:46 +000054module_param_named(cmd_enable, kdb_cmd_enabled, int, 0600);
55
Daniel Thompsonfb6daa72014-09-11 10:37:10 +010056char kdb_grep_string[KDB_GREP_STRLEN];
Jason Wessel5d5314d2010-05-20 21:04:20 -050057int kdb_grepping_flag;
58EXPORT_SYMBOL(kdb_grepping_flag);
59int kdb_grep_leading;
60int kdb_grep_trailing;
61
62/*
63 * Kernel debugger state flags
64 */
Wei Lic893de12020-05-21 15:21:25 +080065unsigned int kdb_flags;
Jason Wessel5d5314d2010-05-20 21:04:20 -050066
67/*
68 * kdb_lock protects updates to kdb_initial_cpu. Used to
69 * single thread processors through the kernel debugger.
70 */
71int kdb_initial_cpu = -1; /* cpu number that owns kdb */
72int kdb_nextline = 1;
73int kdb_state; /* General KDB state */
74
75struct task_struct *kdb_current_task;
Jason Wessel5d5314d2010-05-20 21:04:20 -050076struct pt_regs *kdb_current_regs;
77
78const char *kdb_diemsg;
79static int kdb_go_count;
80#ifdef CONFIG_KDB_CONTINUE_CATASTROPHIC
81static unsigned int kdb_continue_catastrophic =
82 CONFIG_KDB_CONTINUE_CATASTROPHIC;
83#else
84static unsigned int kdb_continue_catastrophic;
85#endif
86
Sumit Garge4f291b2021-02-24 12:38:27 +053087/* kdb_cmds_head describes the available commands. */
88static LIST_HEAD(kdb_cmds_head);
Jason Wessel5d5314d2010-05-20 21:04:20 -050089
90typedef struct _kdbmsg {
91 int km_diag; /* kdb diagnostic */
92 char *km_msg; /* Corresponding message text */
93} kdbmsg_t;
94
95#define KDBMSG(msgnum, text) \
96 { KDB_##msgnum, text }
97
98static kdbmsg_t kdbmsgs[] = {
99 KDBMSG(NOTFOUND, "Command Not Found"),
100 KDBMSG(ARGCOUNT, "Improper argument count, see usage."),
101 KDBMSG(BADWIDTH, "Illegal value for BYTESPERWORD use 1, 2, 4 or 8, "
102 "8 is only allowed on 64 bit systems"),
103 KDBMSG(BADRADIX, "Illegal value for RADIX use 8, 10 or 16"),
104 KDBMSG(NOTENV, "Cannot find environment variable"),
105 KDBMSG(NOENVVALUE, "Environment variable should have value"),
106 KDBMSG(NOTIMP, "Command not implemented"),
107 KDBMSG(ENVFULL, "Environment full"),
108 KDBMSG(ENVBUFFULL, "Environment buffer full"),
109 KDBMSG(TOOMANYBPT, "Too many breakpoints defined"),
110#ifdef CONFIG_CPU_XSCALE
111 KDBMSG(TOOMANYDBREGS, "More breakpoints than ibcr registers defined"),
112#else
113 KDBMSG(TOOMANYDBREGS, "More breakpoints than db registers defined"),
114#endif
115 KDBMSG(DUPBPT, "Duplicate breakpoint address"),
116 KDBMSG(BPTNOTFOUND, "Breakpoint not found"),
117 KDBMSG(BADMODE, "Invalid IDMODE"),
118 KDBMSG(BADINT, "Illegal numeric value"),
119 KDBMSG(INVADDRFMT, "Invalid symbolic address format"),
120 KDBMSG(BADREG, "Invalid register name"),
121 KDBMSG(BADCPUNUM, "Invalid cpu number"),
122 KDBMSG(BADLENGTH, "Invalid length field"),
123 KDBMSG(NOBP, "No Breakpoint exists"),
124 KDBMSG(BADADDR, "Invalid address"),
Anton Vorontsov420c2b12014-11-06 14:36:46 +0000125 KDBMSG(NOPERM, "Permission denied"),
Jason Wessel5d5314d2010-05-20 21:04:20 -0500126};
127#undef KDBMSG
128
Sasha Levin5f784f72012-12-20 14:11:27 -0500129static const int __nkdb_err = ARRAY_SIZE(kdbmsgs);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500130
131
132/*
133 * Initial environment. This is all kept static and local to
134 * this file. We don't want to rely on the memory allocation
135 * mechanisms in the kernel, so we use a very limited allocate-only
136 * heap for new and altered environment variables. The entire
137 * environment is limited to a fixed number of entries (add more
138 * to __env[] if required) and a fixed amount of heap (add more to
139 * KDB_ENVBUFSIZE if required).
140 */
141
Sumit Garg83fa2d12021-02-08 13:32:22 +0530142static char *__env[31] = {
Jason Wessel5d5314d2010-05-20 21:04:20 -0500143#if defined(CONFIG_SMP)
Sumit Garg83fa2d12021-02-08 13:32:22 +0530144 "PROMPT=[%d]kdb> ",
Jason Wessel5d5314d2010-05-20 21:04:20 -0500145#else
Sumit Garg83fa2d12021-02-08 13:32:22 +0530146 "PROMPT=kdb> ",
Jason Wessel5d5314d2010-05-20 21:04:20 -0500147#endif
Sumit Garg83fa2d12021-02-08 13:32:22 +0530148 "MOREPROMPT=more> ",
149 "RADIX=16",
150 "MDCOUNT=8", /* lines of md output */
151 KDB_PLATFORM_ENV,
152 "DTABCOUNT=30",
153 "NOSECT=1",
Jason Wessel5d5314d2010-05-20 21:04:20 -0500154};
155
Sasha Levin5f784f72012-12-20 14:11:27 -0500156static const int __nenv = ARRAY_SIZE(__env);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500157
158struct task_struct *kdb_curr_task(int cpu)
159{
160 struct task_struct *p = curr_task(cpu);
161#ifdef _TIF_MCA_INIT
162 if ((task_thread_info(p)->flags & _TIF_MCA_INIT) && KDB_TSK(cpu))
163 p = krp->p;
164#endif
165 return p;
166}
167
168/*
Daniel Thompson9452e972014-11-06 14:36:45 +0000169 * Check whether the flags of the current command and the permissions
170 * of the kdb console has allow a command to be run.
171 */
172static inline bool kdb_check_flags(kdb_cmdflags_t flags, int permissions,
173 bool no_args)
174{
175 /* permissions comes from userspace so needs massaging slightly */
176 permissions &= KDB_ENABLE_MASK;
177 permissions |= KDB_ENABLE_ALWAYS_SAFE;
178
179 /* some commands change group when launched with no arguments */
180 if (no_args)
181 permissions |= permissions << KDB_ENABLE_NO_ARGS_SHIFT;
182
183 flags |= KDB_ENABLE_ALL;
184
185 return permissions & flags;
186}
187
188/*
Jason Wessel5d5314d2010-05-20 21:04:20 -0500189 * kdbgetenv - This function will return the character string value of
190 * an environment variable.
191 * Parameters:
192 * match A character string representing an environment variable.
193 * Returns:
194 * NULL No environment variable matches 'match'
195 * char* Pointer to string value of environment variable.
196 */
197char *kdbgetenv(const char *match)
198{
199 char **ep = __env;
200 int matchlen = strlen(match);
201 int i;
202
203 for (i = 0; i < __nenv; i++) {
204 char *e = *ep++;
205
206 if (!e)
207 continue;
208
209 if ((strncmp(match, e, matchlen) == 0)
210 && ((e[matchlen] == '\0')
211 || (e[matchlen] == '='))) {
212 char *cp = strchr(e, '=');
213 return cp ? ++cp : "";
214 }
215 }
216 return NULL;
217}
218
219/*
220 * kdballocenv - This function is used to allocate bytes for
221 * environment entries.
222 * Parameters:
223 * match A character string representing a numeric value
224 * Outputs:
225 * *value the unsigned long representation of the env variable 'match'
226 * Returns:
227 * Zero on success, a kdb diagnostic on failure.
228 * Remarks:
229 * We use a static environment buffer (envbuffer) to hold the values
230 * of dynamically generated environment variables (see kdb_set). Buffer
231 * space once allocated is never free'd, so over time, the amount of space
232 * (currently 512 bytes) will be exhausted if env variables are changed
233 * frequently.
234 */
235static char *kdballocenv(size_t bytes)
236{
237#define KDB_ENVBUFSIZE 512
238 static char envbuffer[KDB_ENVBUFSIZE];
239 static int envbufsize;
240 char *ep = NULL;
241
242 if ((KDB_ENVBUFSIZE - envbufsize) >= bytes) {
243 ep = &envbuffer[envbufsize];
244 envbufsize += bytes;
245 }
246 return ep;
247}
248
249/*
250 * kdbgetulenv - This function will return the value of an unsigned
251 * long-valued environment variable.
252 * Parameters:
253 * match A character string representing a numeric value
254 * Outputs:
Zhen Lei220a31b2021-05-29 19:03:03 +0800255 * *value the unsigned long representation of the env variable 'match'
Jason Wessel5d5314d2010-05-20 21:04:20 -0500256 * Returns:
257 * Zero on success, a kdb diagnostic on failure.
258 */
259static int kdbgetulenv(const char *match, unsigned long *value)
260{
261 char *ep;
262
263 ep = kdbgetenv(match);
264 if (!ep)
265 return KDB_NOTENV;
266 if (strlen(ep) == 0)
267 return KDB_NOENVVALUE;
268
269 *value = simple_strtoul(ep, NULL, 0);
270
271 return 0;
272}
273
274/*
275 * kdbgetintenv - This function will return the value of an
276 * integer-valued environment variable.
277 * Parameters:
278 * match A character string representing an integer-valued env variable
279 * Outputs:
280 * *value the integer representation of the environment variable 'match'
281 * Returns:
282 * Zero on success, a kdb diagnostic on failure.
283 */
284int kdbgetintenv(const char *match, int *value)
285{
286 unsigned long val;
287 int diag;
288
289 diag = kdbgetulenv(match, &val);
290 if (!diag)
291 *value = (int) val;
292 return diag;
293}
294
295/*
Sumit Garg83fa2d12021-02-08 13:32:22 +0530296 * kdb_setenv() - Alter an existing environment variable or create a new one.
297 * @var: Name of the variable
298 * @val: Value of the variable
299 *
300 * Return: Zero on success, a kdb diagnostic on failure.
301 */
302static int kdb_setenv(const char *var, const char *val)
303{
304 int i;
305 char *ep;
306 size_t varlen, vallen;
307
308 varlen = strlen(var);
309 vallen = strlen(val);
310 ep = kdballocenv(varlen + vallen + 2);
311 if (ep == (char *)0)
312 return KDB_ENVBUFFULL;
313
314 sprintf(ep, "%s=%s", var, val);
315
316 for (i = 0; i < __nenv; i++) {
317 if (__env[i]
318 && ((strncmp(__env[i], var, varlen) == 0)
319 && ((__env[i][varlen] == '\0')
320 || (__env[i][varlen] == '=')))) {
321 __env[i] = ep;
322 return 0;
323 }
324 }
325
326 /*
327 * Wasn't existing variable. Fit into slot.
328 */
329 for (i = 0; i < __nenv-1; i++) {
330 if (__env[i] == (char *)0) {
331 __env[i] = ep;
332 return 0;
333 }
334 }
335
336 return KDB_ENVFULL;
337}
338
339/*
340 * kdb_printenv() - Display the current environment variables.
341 */
342static void kdb_printenv(void)
343{
344 int i;
345
346 for (i = 0; i < __nenv; i++) {
347 if (__env[i])
348 kdb_printf("%s\n", __env[i]);
349 }
350}
351
352/*
Jason Wessel5d5314d2010-05-20 21:04:20 -0500353 * kdbgetularg - This function will convert a numeric string into an
354 * unsigned long value.
355 * Parameters:
356 * arg A character string representing a numeric value
357 * Outputs:
Zhen Lei220a31b2021-05-29 19:03:03 +0800358 * *value the unsigned long representation of arg.
Jason Wessel5d5314d2010-05-20 21:04:20 -0500359 * Returns:
360 * Zero on success, a kdb diagnostic on failure.
361 */
362int kdbgetularg(const char *arg, unsigned long *value)
363{
364 char *endp;
365 unsigned long val;
366
367 val = simple_strtoul(arg, &endp, 0);
368
369 if (endp == arg) {
370 /*
Jason Wessel534af102010-08-05 09:22:20 -0500371 * Also try base 16, for us folks too lazy to type the
Jason Wessel5d5314d2010-05-20 21:04:20 -0500372 * leading 0x...
373 */
374 val = simple_strtoul(arg, &endp, 16);
375 if (endp == arg)
376 return KDB_BADINT;
377 }
378
379 *value = val;
380
381 return 0;
382}
383
Jason Wessel534af102010-08-05 09:22:20 -0500384int kdbgetu64arg(const char *arg, u64 *value)
385{
386 char *endp;
387 u64 val;
388
389 val = simple_strtoull(arg, &endp, 0);
390
391 if (endp == arg) {
392
393 val = simple_strtoull(arg, &endp, 16);
394 if (endp == arg)
395 return KDB_BADINT;
396 }
397
398 *value = val;
399
400 return 0;
401}
402
Jason Wessel5d5314d2010-05-20 21:04:20 -0500403/*
404 * kdb_set - This function implements the 'set' command. Alter an
405 * existing environment variable or create a new one.
406 */
407int kdb_set(int argc, const char **argv)
408{
Jason Wessel5d5314d2010-05-20 21:04:20 -0500409 /*
410 * we can be invoked two ways:
411 * set var=value argv[1]="var", argv[2]="value"
412 * set var = value argv[1]="var", argv[2]="=", argv[3]="value"
413 * - if the latter, shift 'em down.
414 */
415 if (argc == 3) {
416 argv[2] = argv[3];
417 argc--;
418 }
419
420 if (argc != 2)
421 return KDB_ARGCOUNT;
422
423 /*
Daniel Thompsonad99b512020-02-13 15:16:40 +0000424 * Censor sensitive variables
425 */
426 if (strcmp(argv[1], "PROMPT") == 0 &&
427 !kdb_check_flags(KDB_ENABLE_MEM_READ, kdb_cmd_enabled, false))
428 return KDB_NOPERM;
429
430 /*
Jason Wessel5d5314d2010-05-20 21:04:20 -0500431 * Check for internal variables
432 */
433 if (strcmp(argv[1], "KDBDEBUG") == 0) {
434 unsigned int debugflags;
435 char *cp;
436
437 debugflags = simple_strtoul(argv[2], &cp, 0);
438 if (cp == argv[2] || debugflags & ~KDB_DEBUG_FLAG_MASK) {
439 kdb_printf("kdb: illegal debug flags '%s'\n",
440 argv[2]);
441 return 0;
442 }
Wei Lic893de12020-05-21 15:21:25 +0800443 kdb_flags = (kdb_flags & ~KDB_DEBUG(MASK))
Jason Wessel5d5314d2010-05-20 21:04:20 -0500444 | (debugflags << KDB_DEBUG_FLAG_SHIFT);
445
446 return 0;
447 }
448
449 /*
450 * Tokenizer squashed the '=' sign. argv[1] is variable
451 * name, argv[2] = value.
452 */
Sumit Garg83fa2d12021-02-08 13:32:22 +0530453 return kdb_setenv(argv[1], argv[2]);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500454}
455
456static int kdb_check_regs(void)
457{
458 if (!kdb_current_regs) {
459 kdb_printf("No current kdb registers."
460 " You may need to select another task\n");
461 return KDB_BADREG;
462 }
463 return 0;
464}
465
466/*
467 * kdbgetaddrarg - This function is responsible for parsing an
468 * address-expression and returning the value of the expression,
469 * symbol name, and offset to the caller.
470 *
471 * The argument may consist of a numeric value (decimal or
Zhen Lei220a31b2021-05-29 19:03:03 +0800472 * hexadecimal), a symbol name, a register name (preceded by the
Jason Wessel5d5314d2010-05-20 21:04:20 -0500473 * percent sign), an environment variable with a numeric value
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300474 * (preceded by a dollar sign) or a simple arithmetic expression
Jason Wessel5d5314d2010-05-20 21:04:20 -0500475 * consisting of a symbol name, +/-, and a numeric constant value
476 * (offset).
477 * Parameters:
478 * argc - count of arguments in argv
479 * argv - argument vector
480 * *nextarg - index to next unparsed argument in argv[]
481 * regs - Register state at time of KDB entry
482 * Outputs:
483 * *value - receives the value of the address-expression
484 * *offset - receives the offset specified, if any
485 * *name - receives the symbol name, if any
486 * *nextarg - index to next unparsed argument in argv[]
487 * Returns:
488 * zero is returned on success, a kdb diagnostic code is
489 * returned on error.
490 */
491int kdbgetaddrarg(int argc, const char **argv, int *nextarg,
492 unsigned long *value, long *offset,
493 char **name)
494{
495 unsigned long addr;
496 unsigned long off = 0;
497 int positive;
498 int diag;
499 int found = 0;
500 char *symname;
501 char symbol = '\0';
502 char *cp;
503 kdb_symtab_t symtab;
504
505 /*
Anton Vorontsov420c2b12014-11-06 14:36:46 +0000506 * If the enable flags prohibit both arbitrary memory access
507 * and flow control then there are no reasonable grounds to
508 * provide symbol lookup.
509 */
510 if (!kdb_check_flags(KDB_ENABLE_MEM_READ | KDB_ENABLE_FLOW_CTRL,
511 kdb_cmd_enabled, false))
512 return KDB_NOPERM;
513
514 /*
Jason Wessel5d5314d2010-05-20 21:04:20 -0500515 * Process arguments which follow the following syntax:
516 *
517 * symbol | numeric-address [+/- numeric-offset]
518 * %register
519 * $environment-variable
520 */
521
522 if (*nextarg > argc)
523 return KDB_ARGCOUNT;
524
525 symname = (char *)argv[*nextarg];
526
527 /*
528 * If there is no whitespace between the symbol
529 * or address and the '+' or '-' symbols, we
530 * remember the character and replace it with a
531 * null so the symbol/value can be properly parsed
532 */
533 cp = strpbrk(symname, "+-");
534 if (cp != NULL) {
535 symbol = *cp;
536 *cp++ = '\0';
537 }
538
539 if (symname[0] == '$') {
540 diag = kdbgetulenv(&symname[1], &addr);
541 if (diag)
542 return diag;
543 } else if (symname[0] == '%') {
Daniel Thompsonfcf27362020-02-06 11:40:09 +0000544 diag = kdb_check_regs();
545 if (diag)
546 return diag;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500547 /* Implement register values with % at a later time as it is
548 * arch optional.
549 */
550 return KDB_NOTIMP;
551 } else {
552 found = kdbgetsymval(symname, &symtab);
553 if (found) {
554 addr = symtab.sym_start;
555 } else {
556 diag = kdbgetularg(argv[*nextarg], &addr);
557 if (diag)
558 return diag;
559 }
560 }
561
562 if (!found)
563 found = kdbnearsym(addr, &symtab);
564
565 (*nextarg)++;
566
567 if (name)
568 *name = symname;
569 if (value)
570 *value = addr;
571 if (offset && name && *name)
572 *offset = addr - symtab.sym_start;
573
574 if ((*nextarg > argc)
575 && (symbol == '\0'))
576 return 0;
577
578 /*
579 * check for +/- and offset
580 */
581
582 if (symbol == '\0') {
583 if ((argv[*nextarg][0] != '+')
584 && (argv[*nextarg][0] != '-')) {
585 /*
586 * Not our argument. Return.
587 */
588 return 0;
589 } else {
590 positive = (argv[*nextarg][0] == '+');
591 (*nextarg)++;
592 }
593 } else
594 positive = (symbol == '+');
595
596 /*
597 * Now there must be an offset!
598 */
599 if ((*nextarg > argc)
600 && (symbol == '\0')) {
601 return KDB_INVADDRFMT;
602 }
603
604 if (!symbol) {
605 cp = (char *)argv[*nextarg];
606 (*nextarg)++;
607 }
608
609 diag = kdbgetularg(cp, &off);
610 if (diag)
611 return diag;
612
613 if (!positive)
614 off = -off;
615
616 if (offset)
617 *offset += off;
618
619 if (value)
620 *value += off;
621
622 return 0;
623}
624
625static void kdb_cmderror(int diag)
626{
627 int i;
628
629 if (diag >= 0) {
630 kdb_printf("no error detected (diagnostic is %d)\n", diag);
631 return;
632 }
633
634 for (i = 0; i < __nkdb_err; i++) {
635 if (kdbmsgs[i].km_diag == diag) {
636 kdb_printf("diag: %d: %s\n", diag, kdbmsgs[i].km_msg);
637 return;
638 }
639 }
640
641 kdb_printf("Unknown diag %d\n", -diag);
642}
643
644/*
645 * kdb_defcmd, kdb_defcmd2 - This function implements the 'defcmd'
646 * command which defines one command as a set of other commands,
647 * terminated by endefcmd. kdb_defcmd processes the initial
648 * 'defcmd' command, kdb_defcmd2 is invoked from kdb_parse for
649 * the following commands until 'endefcmd'.
650 * Inputs:
651 * argc argument count
652 * argv argument vector
653 * Returns:
654 * zero for success, a kdb diagnostic if error
655 */
Sumit Gargb39cded2021-07-12 19:16:17 +0530656struct kdb_macro {
Sumit Garg9a5db532021-07-12 19:16:19 +0530657 kdbtab_t cmd; /* Macro command */
658 struct list_head statements; /* Associated statement list */
Jason Wessel5d5314d2010-05-20 21:04:20 -0500659};
Sumit Garg9a5db532021-07-12 19:16:19 +0530660
661struct kdb_macro_statement {
662 char *statement; /* Statement text */
663 struct list_head list_node; /* Statement list node */
664};
665
Sumit Gargb39cded2021-07-12 19:16:17 +0530666static struct kdb_macro *kdb_macro;
Nicholas Mc Guire7faedcd2018-07-20 11:23:37 +0200667static bool defcmd_in_progress;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500668
669/* Forward references */
670static int kdb_exec_defcmd(int argc, const char **argv);
671
672static int kdb_defcmd2(const char *cmdstr, const char *argv0)
673{
Sumit Garg9a5db532021-07-12 19:16:19 +0530674 struct kdb_macro_statement *kms;
675
676 if (!kdb_macro)
677 return KDB_NOTIMP;
678
Jason Wessel5d5314d2010-05-20 21:04:20 -0500679 if (strcmp(argv0, "endefcmd") == 0) {
Nicholas Mc Guire7faedcd2018-07-20 11:23:37 +0200680 defcmd_in_progress = false;
Sumit Garg9a5db532021-07-12 19:16:19 +0530681 if (!list_empty(&kdb_macro->statements))
682 kdb_register(&kdb_macro->cmd);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500683 return 0;
684 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530685
686 kms = kmalloc(sizeof(*kms), GFP_KDB);
687 if (!kms) {
688 kdb_printf("Could not allocate new kdb macro command: %s\n",
Jason Wessel5d5314d2010-05-20 21:04:20 -0500689 cmdstr);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500690 return KDB_NOTIMP;
691 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530692
693 kms->statement = kdb_strdup(cmdstr, GFP_KDB);
694 list_add_tail(&kms->list_node, &kdb_macro->statements);
695
Jason Wessel5d5314d2010-05-20 21:04:20 -0500696 return 0;
697}
698
699static int kdb_defcmd(int argc, const char **argv)
700{
Sumit Gargc25abcd2021-07-12 19:16:18 +0530701 kdbtab_t *mp;
702
Jason Wessel5d5314d2010-05-20 21:04:20 -0500703 if (defcmd_in_progress) {
704 kdb_printf("kdb: nested defcmd detected, assuming missing "
705 "endefcmd\n");
706 kdb_defcmd2("endefcmd", "endefcmd");
707 }
708 if (argc == 0) {
Sumit Garg9a5db532021-07-12 19:16:19 +0530709 kdbtab_t *kp;
710 struct kdb_macro *kmp;
711 struct kdb_macro_statement *kms;
712
713 list_for_each_entry(kp, &kdb_cmds_head, list_node) {
Sumit Garge868f0a2021-07-12 19:16:20 +0530714 if (kp->func == kdb_exec_defcmd) {
Sumit Garg9a5db532021-07-12 19:16:19 +0530715 kdb_printf("defcmd %s \"%s\" \"%s\"\n",
Sumit Garge868f0a2021-07-12 19:16:20 +0530716 kp->name, kp->usage, kp->help);
Sumit Garg9a5db532021-07-12 19:16:19 +0530717 kmp = container_of(kp, struct kdb_macro, cmd);
718 list_for_each_entry(kms, &kmp->statements,
719 list_node)
720 kdb_printf("%s", kms->statement);
721 kdb_printf("endefcmd\n");
722 }
Jason Wessel5d5314d2010-05-20 21:04:20 -0500723 }
724 return 0;
725 }
726 if (argc != 3)
727 return KDB_ARGCOUNT;
Jason Wessela37372f2013-02-04 10:35:33 -0600728 if (in_dbg_master()) {
729 kdb_printf("Command only available during kdb_init()\n");
730 return KDB_NOTIMP;
731 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530732 kdb_macro = kzalloc(sizeof(*kdb_macro), GFP_KDB);
Sumit Gargb39cded2021-07-12 19:16:17 +0530733 if (!kdb_macro)
Jason Wessel4eb7a662013-02-03 09:32:28 -0600734 goto fail_defcmd;
Sumit Gargc25abcd2021-07-12 19:16:18 +0530735
Sumit Garg9a5db532021-07-12 19:16:19 +0530736 mp = &kdb_macro->cmd;
Sumit Garge868f0a2021-07-12 19:16:20 +0530737 mp->func = kdb_exec_defcmd;
738 mp->minlen = 0;
739 mp->flags = KDB_ENABLE_ALWAYS_SAFE;
740 mp->name = kdb_strdup(argv[1], GFP_KDB);
741 if (!mp->name)
Jason Wessel4eb7a662013-02-03 09:32:28 -0600742 goto fail_name;
Sumit Garge868f0a2021-07-12 19:16:20 +0530743 mp->usage = kdb_strdup(argv[2], GFP_KDB);
744 if (!mp->usage)
Jason Wessel4eb7a662013-02-03 09:32:28 -0600745 goto fail_usage;
Sumit Garge868f0a2021-07-12 19:16:20 +0530746 mp->help = kdb_strdup(argv[3], GFP_KDB);
747 if (!mp->help)
Jason Wessel4eb7a662013-02-03 09:32:28 -0600748 goto fail_help;
Sumit Garge868f0a2021-07-12 19:16:20 +0530749 if (mp->usage[0] == '"') {
750 strcpy(mp->usage, argv[2]+1);
751 mp->usage[strlen(mp->usage)-1] = '\0';
Jason Wessel5d5314d2010-05-20 21:04:20 -0500752 }
Sumit Garge868f0a2021-07-12 19:16:20 +0530753 if (mp->help[0] == '"') {
754 strcpy(mp->help, argv[3]+1);
755 mp->help[strlen(mp->help)-1] = '\0';
Jason Wessel5d5314d2010-05-20 21:04:20 -0500756 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530757
758 INIT_LIST_HEAD(&kdb_macro->statements);
Nicholas Mc Guire7faedcd2018-07-20 11:23:37 +0200759 defcmd_in_progress = true;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500760 return 0;
Jason Wessel4eb7a662013-02-03 09:32:28 -0600761fail_help:
Sumit Garge868f0a2021-07-12 19:16:20 +0530762 kfree(mp->usage);
Jason Wessel4eb7a662013-02-03 09:32:28 -0600763fail_usage:
Sumit Garge868f0a2021-07-12 19:16:20 +0530764 kfree(mp->name);
Jason Wessel4eb7a662013-02-03 09:32:28 -0600765fail_name:
Sumit Gargb39cded2021-07-12 19:16:17 +0530766 kfree(kdb_macro);
Jason Wessel4eb7a662013-02-03 09:32:28 -0600767fail_defcmd:
Sumit Gargb39cded2021-07-12 19:16:17 +0530768 kdb_printf("Could not allocate new kdb_macro entry for %s\n", argv[1]);
Jason Wessel4eb7a662013-02-03 09:32:28 -0600769 return KDB_NOTIMP;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500770}
771
772/*
773 * kdb_exec_defcmd - Execute the set of commands associated with this
774 * defcmd name.
775 * Inputs:
776 * argc argument count
777 * argv argument vector
778 * Returns:
779 * zero for success, a kdb diagnostic if error
780 */
781static int kdb_exec_defcmd(int argc, const char **argv)
782{
Sumit Garg9a5db532021-07-12 19:16:19 +0530783 int ret;
784 kdbtab_t *kp;
785 struct kdb_macro *kmp;
786 struct kdb_macro_statement *kms;
787
Jason Wessel5d5314d2010-05-20 21:04:20 -0500788 if (argc != 0)
789 return KDB_ARGCOUNT;
Sumit Garg9a5db532021-07-12 19:16:19 +0530790
791 list_for_each_entry(kp, &kdb_cmds_head, list_node) {
Sumit Garge868f0a2021-07-12 19:16:20 +0530792 if (strcmp(kp->name, argv[0]) == 0)
Jason Wessel5d5314d2010-05-20 21:04:20 -0500793 break;
794 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530795 if (list_entry_is_head(kp, &kdb_cmds_head, list_node)) {
Jason Wessel5d5314d2010-05-20 21:04:20 -0500796 kdb_printf("kdb_exec_defcmd: could not find commands for %s\n",
797 argv[0]);
798 return KDB_NOTIMP;
799 }
Sumit Garg9a5db532021-07-12 19:16:19 +0530800 kmp = container_of(kp, struct kdb_macro, cmd);
801 list_for_each_entry(kms, &kmp->statements, list_node) {
802 /*
803 * Recursive use of kdb_parse, do not use argv after this point.
804 */
Jason Wessel5d5314d2010-05-20 21:04:20 -0500805 argv = NULL;
Sumit Garge868f0a2021-07-12 19:16:20 +0530806 kdb_printf("[%s]kdb> %s\n", kmp->cmd.name, kms->statement);
Sumit Garg9a5db532021-07-12 19:16:19 +0530807 ret = kdb_parse(kms->statement);
Jason Wessel5d5314d2010-05-20 21:04:20 -0500808 if (ret)
809 return ret;
810 }
811 return 0;
812}
813
814/* Command history */
815#define KDB_CMD_HISTORY_COUNT 32
816#define CMD_BUFLEN 200 /* kdb_printf: max printline
817 * size == 256 */
818static unsigned int cmd_head, cmd_tail;
819static unsigned int cmdptr;
820static char cmd_hist[KDB_CMD_HISTORY_COUNT][CMD_BUFLEN];
821static char cmd_cur[CMD_BUFLEN];
822
823/*
824 * The "str" argument may point to something like | grep xyz
825 */
826static void parse_grep(const char *str)
827{
828 int len;
829 char *cp = (char *)str, *cp2;
830
831 /* sanity check: we should have been called with the \ first */
832 if (*cp != '|')
833 return;
834 cp++;
835 while (isspace(*cp))
836 cp++;
Chuhong Yuan63571432019-07-29 23:13:59 +0800837 if (!str_has_prefix(cp, "grep ")) {
Jason Wessel5d5314d2010-05-20 21:04:20 -0500838 kdb_printf("invalid 'pipe', see grephelp\n");
839 return;
840 }
841 cp += 5;
842 while (isspace(*cp))
843 cp++;
844 cp2 = strchr(cp, '\n');
845 if (cp2)
846 *cp2 = '\0'; /* remove the trailing newline */
847 len = strlen(cp);
848 if (len == 0) {
849 kdb_printf("invalid 'pipe', see grephelp\n");
850 return;
851 }
852 /* now cp points to a nonzero length search string */
853 if (*cp == '"') {
854 /* allow it be "x y z" by removing the "'s - there must
855 be two of them */
856 cp++;
857 cp2 = strchr(cp, '"');
858 if (!cp2) {
859 kdb_printf("invalid quoted string, see grephelp\n");
860 return;
861 }
862 *cp2 = '\0'; /* end the string where the 2nd " was */
863 }
864 kdb_grep_leading = 0;
865 if (*cp == '^') {
866 kdb_grep_leading = 1;
867 cp++;
868 }
869 len = strlen(cp);
870 kdb_grep_trailing = 0;
871 if (*(cp+len-1) == '$') {
872 kdb_grep_trailing = 1;
873 *(cp+len-1) = '\0';
874 }
875 len = strlen(cp);
876 if (!len)
877 return;
Daniel Thompsonfb6daa72014-09-11 10:37:10 +0100878 if (len >= KDB_GREP_STRLEN) {
Jason Wessel5d5314d2010-05-20 21:04:20 -0500879 kdb_printf("search string too long\n");
880 return;
881 }
882 strcpy(kdb_grep_string, cp);
883 kdb_grepping_flag++;
884 return;
885}
886
887/*
888 * kdb_parse - Parse the command line, search the command table for a
889 * matching command and invoke the command function. This
890 * function may be called recursively, if it is, the second call
891 * will overwrite argv and cbuf. It is the caller's
892 * responsibility to save their argv if they recursively call
893 * kdb_parse().
894 * Parameters:
895 * cmdstr The input command line to be parsed.
896 * regs The registers at the time kdb was entered.
897 * Returns:
898 * Zero for success, a kdb diagnostic if failure.
899 * Remarks:
900 * Limited to 20 tokens.
901 *
902 * Real rudimentary tokenization. Basically only whitespace
Zhen Lei220a31b2021-05-29 19:03:03 +0800903 * is considered a token delimiter (but special consideration
Jason Wessel5d5314d2010-05-20 21:04:20 -0500904 * is taken of the '=' sign as used by the 'set' command).
905 *
906 * The algorithm used to tokenize the input string relies on
907 * there being at least one whitespace (or otherwise useless)
908 * character between tokens as the character immediately following
909 * the token is altered in-place to a null-byte to terminate the
910 * token string.
911 */
912
913#define MAXARGC 20
914
915int kdb_parse(const char *cmdstr)
916{
917 static char *argv[MAXARGC];
918 static int argc;
919 static char cbuf[CMD_BUFLEN+2];
920 char *cp;
921 char *cpp, quoted;
922 kdbtab_t *tp;
Sumit Garge4f291b2021-02-24 12:38:27 +0530923 int escaped, ignore_errors = 0, check_grep = 0;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500924
925 /*
926 * First tokenize the command string.
927 */
928 cp = (char *)cmdstr;
Jason Wessel5d5314d2010-05-20 21:04:20 -0500929
930 if (KDB_FLAG(CMD_INTERRUPT)) {
931 /* Previous command was interrupted, newline must not
932 * repeat the command */
933 KDB_FLAG_CLEAR(CMD_INTERRUPT);
934 KDB_STATE_SET(PAGER);
935 argc = 0; /* no repeat */
936 }
937
938 if (*cp != '\n' && *cp != '\0') {
939 argc = 0;
940 cpp = cbuf;
941 while (*cp) {
942 /* skip whitespace */
943 while (isspace(*cp))
944 cp++;
945 if ((*cp == '\0') || (*cp == '\n') ||
946 (*cp == '#' && !defcmd_in_progress))
947 break;
948 /* special case: check for | grep pattern */
949 if (*cp == '|') {
950 check_grep++;
951 break;
952 }
953 if (cpp >= cbuf + CMD_BUFLEN) {
954 kdb_printf("kdb_parse: command buffer "
955 "overflow, command ignored\n%s\n",
956 cmdstr);
957 return KDB_NOTFOUND;
958 }
959 if (argc >= MAXARGC - 1) {
960 kdb_printf("kdb_parse: too many arguments, "
961 "command ignored\n%s\n", cmdstr);
962 return KDB_NOTFOUND;
963 }
964 argv[argc++] = cpp;
965 escaped = 0;
966 quoted = '\0';
967 /* Copy to next unquoted and unescaped
968 * whitespace or '=' */
969 while (*cp && *cp != '\n' &&
970 (escaped || quoted || !isspace(*cp))) {
971 if (cpp >= cbuf + CMD_BUFLEN)
972 break;
973 if (escaped) {
974 escaped = 0;
975 *cpp++ = *cp++;
976 continue;
977 }
978 if (*cp == '\\') {
979 escaped = 1;
980 ++cp;
981 continue;
982 }
983 if (*cp == quoted)
984 quoted = '\0';
985 else if (*cp == '\'' || *cp == '"')
986 quoted = *cp;
987 *cpp = *cp++;
988 if (*cpp == '=' && !quoted)
989 break;
990 ++cpp;
991 }
992 *cpp++ = '\0'; /* Squash a ws or '=' character */
993 }
994 }
995 if (!argc)
996 return 0;
997 if (check_grep)
998 parse_grep(cp);
999 if (defcmd_in_progress) {
1000 int result = kdb_defcmd2(cmdstr, argv[0]);
1001 if (!defcmd_in_progress) {
1002 argc = 0; /* avoid repeat on endefcmd */
1003 *(argv[0]) = '\0';
1004 }
1005 return result;
1006 }
1007 if (argv[0][0] == '-' && argv[0][1] &&
1008 (argv[0][1] < '0' || argv[0][1] > '9')) {
1009 ignore_errors = 1;
1010 ++argv[0];
1011 }
1012
Sumit Garge4f291b2021-02-24 12:38:27 +05301013 list_for_each_entry(tp, &kdb_cmds_head, list_node) {
1014 /*
1015 * If this command is allowed to be abbreviated,
1016 * check to see if this is it.
1017 */
Sumit Garge868f0a2021-07-12 19:16:20 +05301018 if (tp->minlen && (strlen(argv[0]) <= tp->minlen) &&
1019 (strncmp(argv[0], tp->name, tp->minlen) == 0))
Sumit Garge4f291b2021-02-24 12:38:27 +05301020 break;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001021
Sumit Garge868f0a2021-07-12 19:16:20 +05301022 if (strcmp(argv[0], tp->name) == 0)
Sumit Garge4f291b2021-02-24 12:38:27 +05301023 break;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001024 }
1025
1026 /*
1027 * If we don't find a command by this name, see if the first
1028 * few characters of this match any of the known commands.
1029 * e.g., md1c20 should match md.
1030 */
Sumit Garge4f291b2021-02-24 12:38:27 +05301031 if (list_entry_is_head(tp, &kdb_cmds_head, list_node)) {
1032 list_for_each_entry(tp, &kdb_cmds_head, list_node) {
Sumit Garge868f0a2021-07-12 19:16:20 +05301033 if (strncmp(argv[0], tp->name, strlen(tp->name)) == 0)
Sumit Garge4f291b2021-02-24 12:38:27 +05301034 break;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001035 }
1036 }
1037
Sumit Garge4f291b2021-02-24 12:38:27 +05301038 if (!list_entry_is_head(tp, &kdb_cmds_head, list_node)) {
Jason Wessel5d5314d2010-05-20 21:04:20 -05001039 int result;
Anton Vorontsov420c2b12014-11-06 14:36:46 +00001040
Sumit Garge868f0a2021-07-12 19:16:20 +05301041 if (!kdb_check_flags(tp->flags, kdb_cmd_enabled, argc <= 1))
Anton Vorontsov420c2b12014-11-06 14:36:46 +00001042 return KDB_NOPERM;
1043
Jason Wessel5d5314d2010-05-20 21:04:20 -05001044 KDB_STATE_SET(CMD);
Sumit Garge868f0a2021-07-12 19:16:20 +05301045 result = (*tp->func)(argc-1, (const char **)argv);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001046 if (result && ignore_errors && result > KDB_CMD_GO)
1047 result = 0;
1048 KDB_STATE_CLEAR(CMD);
Anton Vorontsov04bb171e2014-11-06 14:36:43 +00001049
Sumit Garge868f0a2021-07-12 19:16:20 +05301050 if (tp->flags & KDB_REPEAT_WITH_ARGS)
Anton Vorontsov04bb171e2014-11-06 14:36:43 +00001051 return result;
1052
Sumit Garge868f0a2021-07-12 19:16:20 +05301053 argc = tp->flags & KDB_REPEAT_NO_ARGS ? 1 : 0;
Anton Vorontsov04bb171e2014-11-06 14:36:43 +00001054 if (argv[argc])
1055 *(argv[argc]) = '\0';
Jason Wessel5d5314d2010-05-20 21:04:20 -05001056 return result;
1057 }
1058
1059 /*
1060 * If the input with which we were presented does not
1061 * map to an existing command, attempt to parse it as an
1062 * address argument and display the result. Useful for
1063 * obtaining the address of a variable, or the nearest symbol
1064 * to an address contained in a register.
1065 */
1066 {
1067 unsigned long value;
1068 char *name = NULL;
1069 long offset;
1070 int nextarg = 0;
1071
1072 if (kdbgetaddrarg(0, (const char **)argv, &nextarg,
1073 &value, &offset, &name)) {
1074 return KDB_NOTFOUND;
1075 }
1076
1077 kdb_printf("%s = ", argv[0]);
1078 kdb_symbol_print(value, NULL, KDB_SP_DEFAULT);
1079 kdb_printf("\n");
1080 return 0;
1081 }
1082}
1083
1084
1085static int handle_ctrl_cmd(char *cmd)
1086{
1087#define CTRL_P 16
1088#define CTRL_N 14
1089
1090 /* initial situation */
1091 if (cmd_head == cmd_tail)
1092 return 0;
1093 switch (*cmd) {
1094 case CTRL_P:
1095 if (cmdptr != cmd_tail)
Douglas Anderson1b310032020-05-07 16:11:46 -07001096 cmdptr = (cmdptr + KDB_CMD_HISTORY_COUNT - 1) %
1097 KDB_CMD_HISTORY_COUNT;
Daniel Thompsond228bee2020-02-13 09:57:24 +00001098 strscpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001099 return 1;
1100 case CTRL_N:
1101 if (cmdptr != cmd_head)
1102 cmdptr = (cmdptr+1) % KDB_CMD_HISTORY_COUNT;
Daniel Thompsond228bee2020-02-13 09:57:24 +00001103 strscpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001104 return 1;
1105 }
1106 return 0;
1107}
1108
1109/*
1110 * kdb_reboot - This function implements the 'reboot' command. Reboot
1111 * the system immediately, or loop for ever on failure.
1112 */
1113static int kdb_reboot(int argc, const char **argv)
1114{
1115 emergency_restart();
1116 kdb_printf("Hmm, kdb_reboot did not reboot, spinning here\n");
1117 while (1)
1118 cpu_relax();
1119 /* NOTREACHED */
1120 return 0;
1121}
1122
1123static void kdb_dumpregs(struct pt_regs *regs)
1124{
1125 int old_lvl = console_loglevel;
Borislav Petkova8fe19e2014-06-04 16:11:46 -07001126 console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH;
Jason Wesseld37d39a2010-05-20 21:04:27 -05001127 kdb_trap_printk++;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001128 show_regs(regs);
Jason Wesseld37d39a2010-05-20 21:04:27 -05001129 kdb_trap_printk--;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001130 kdb_printf("\n");
1131 console_loglevel = old_lvl;
1132}
1133
Douglas Anderson9441d5f2019-11-09 11:16:43 -08001134static void kdb_set_current_task(struct task_struct *p)
Jason Wessel5d5314d2010-05-20 21:04:20 -05001135{
1136 kdb_current_task = p;
1137
1138 if (kdb_task_has_cpu(p)) {
1139 kdb_current_regs = KDB_TSKREGS(kdb_process_cpu(p));
1140 return;
1141 }
1142 kdb_current_regs = NULL;
1143}
1144
Randy Dunlapb0f73bc2017-12-08 10:19:23 -08001145static void drop_newline(char *buf)
1146{
1147 size_t len = strlen(buf);
1148
1149 if (len == 0)
1150 return;
1151 if (*(buf + len - 1) == '\n')
1152 *(buf + len - 1) = '\0';
1153}
1154
Jason Wessel5d5314d2010-05-20 21:04:20 -05001155/*
1156 * kdb_local - The main code for kdb. This routine is invoked on a
1157 * specific processor, it is not global. The main kdb() routine
1158 * ensures that only one processor at a time is in this routine.
1159 * This code is called with the real reason code on the first
1160 * entry to a kdb session, thereafter it is called with reason
1161 * SWITCH, even if the user goes back to the original cpu.
1162 * Inputs:
1163 * reason The reason KDB was invoked
1164 * error The hardware-defined error code
1165 * regs The exception frame at time of fault/breakpoint.
1166 * db_result Result code from the break or debug point.
1167 * Returns:
1168 * 0 KDB was invoked for an event which it wasn't responsible
1169 * 1 KDB handled the event for which it was invoked.
1170 * KDB_CMD_GO User typed 'go'.
1171 * KDB_CMD_CPU User switched to another cpu.
1172 * KDB_CMD_SS Single step.
Jason Wessel5d5314d2010-05-20 21:04:20 -05001173 */
1174static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
1175 kdb_dbtrap_t db_result)
1176{
1177 char *cmdbuf;
1178 int diag;
1179 struct task_struct *kdb_current =
1180 kdb_curr_task(raw_smp_processor_id());
1181
1182 KDB_DEBUG_STATE("kdb_local 1", reason);
1183 kdb_go_count = 0;
1184 if (reason == KDB_REASON_DEBUG) {
1185 /* special case below */
1186 } else {
Christophe Leroy568fb6f2018-09-27 17:17:57 +00001187 kdb_printf("\nEntering kdb (current=0x%px, pid %d) ",
Jason Wessel578bd4d2010-10-29 13:14:41 -05001188 kdb_current, kdb_current ? kdb_current->pid : 0);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001189#if defined(CONFIG_SMP)
1190 kdb_printf("on processor %d ", raw_smp_processor_id());
1191#endif
1192 }
1193
1194 switch (reason) {
1195 case KDB_REASON_DEBUG:
1196 {
1197 /*
1198 * If re-entering kdb after a single step
1199 * command, don't print the message.
1200 */
1201 switch (db_result) {
1202 case KDB_DB_BPT:
Christophe Leroy568fb6f2018-09-27 17:17:57 +00001203 kdb_printf("\nEntering kdb (0x%px, pid %d) ",
Jason Wessel5d5314d2010-05-20 21:04:20 -05001204 kdb_current, kdb_current->pid);
1205#if defined(CONFIG_SMP)
1206 kdb_printf("on processor %d ", raw_smp_processor_id());
1207#endif
1208 kdb_printf("due to Debug @ " kdb_machreg_fmt "\n",
1209 instruction_pointer(regs));
1210 break;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001211 case KDB_DB_SS:
1212 break;
1213 case KDB_DB_SSBPT:
1214 KDB_DEBUG_STATE("kdb_local 4", reason);
1215 return 1; /* kdba_db_trap did the work */
1216 default:
1217 kdb_printf("kdb: Bad result from kdba_db_trap: %d\n",
1218 db_result);
1219 break;
1220 }
1221
1222 }
1223 break;
1224 case KDB_REASON_ENTER:
1225 if (KDB_STATE(KEYBOARD))
1226 kdb_printf("due to Keyboard Entry\n");
1227 else
1228 kdb_printf("due to KDB_ENTER()\n");
1229 break;
1230 case KDB_REASON_KEYBOARD:
1231 KDB_STATE_SET(KEYBOARD);
1232 kdb_printf("due to Keyboard Entry\n");
1233 break;
1234 case KDB_REASON_ENTER_SLAVE:
1235 /* drop through, slaves only get released via cpu switch */
1236 case KDB_REASON_SWITCH:
1237 kdb_printf("due to cpu switch\n");
1238 break;
1239 case KDB_REASON_OOPS:
1240 kdb_printf("Oops: %s\n", kdb_diemsg);
1241 kdb_printf("due to oops @ " kdb_machreg_fmt "\n",
1242 instruction_pointer(regs));
1243 kdb_dumpregs(regs);
1244 break;
Mike Travis8daaa5f2013-10-02 10:14:18 -05001245 case KDB_REASON_SYSTEM_NMI:
1246 kdb_printf("due to System NonMaskable Interrupt\n");
1247 break;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001248 case KDB_REASON_NMI:
1249 kdb_printf("due to NonMaskable Interrupt @ "
1250 kdb_machreg_fmt "\n",
1251 instruction_pointer(regs));
Jason Wessel5d5314d2010-05-20 21:04:20 -05001252 break;
1253 case KDB_REASON_SSTEP:
1254 case KDB_REASON_BREAK:
1255 kdb_printf("due to %s @ " kdb_machreg_fmt "\n",
1256 reason == KDB_REASON_BREAK ?
1257 "Breakpoint" : "SS trap", instruction_pointer(regs));
1258 /*
1259 * Determine if this breakpoint is one that we
1260 * are interested in.
1261 */
1262 if (db_result != KDB_DB_BPT) {
1263 kdb_printf("kdb: error return from kdba_bp_trap: %d\n",
1264 db_result);
1265 KDB_DEBUG_STATE("kdb_local 6", reason);
1266 return 0; /* Not for us, dismiss it */
1267 }
1268 break;
1269 case KDB_REASON_RECURSE:
1270 kdb_printf("due to Recursion @ " kdb_machreg_fmt "\n",
1271 instruction_pointer(regs));
1272 break;
1273 default:
1274 kdb_printf("kdb: unexpected reason code: %d\n", reason);
1275 KDB_DEBUG_STATE("kdb_local 8", reason);
1276 return 0; /* Not for us, dismiss it */
1277 }
1278
1279 while (1) {
1280 /*
1281 * Initialize pager context.
1282 */
1283 kdb_nextline = 1;
1284 KDB_STATE_CLEAR(SUPPRESS);
Daniel Thompsonab08e462014-09-11 09:58:29 +01001285 kdb_grepping_flag = 0;
Daniel Thompsonfb6daa72014-09-11 10:37:10 +01001286 /* ensure the old search does not leak into '/' commands */
1287 kdb_grep_string[0] = '\0';
Jason Wessel5d5314d2010-05-20 21:04:20 -05001288
1289 cmdbuf = cmd_cur;
1290 *cmdbuf = '\0';
1291 *(cmd_hist[cmd_head]) = '\0';
1292
Jason Wessel5d5314d2010-05-20 21:04:20 -05001293do_full_getstr:
Daniel Thompsonad99b512020-02-13 15:16:40 +00001294 /* PROMPT can only be set if we have MEM_READ permission. */
Jason Wessel5d5314d2010-05-20 21:04:20 -05001295 snprintf(kdb_prompt_str, CMD_BUFLEN, kdbgetenv("PROMPT"),
1296 raw_smp_processor_id());
Jason Wessel5d5314d2010-05-20 21:04:20 -05001297 if (defcmd_in_progress)
1298 strncat(kdb_prompt_str, "[defcmd]", CMD_BUFLEN);
1299
1300 /*
1301 * Fetch command from keyboard
1302 */
1303 cmdbuf = kdb_getstr(cmdbuf, CMD_BUFLEN, kdb_prompt_str);
1304 if (*cmdbuf != '\n') {
1305 if (*cmdbuf < 32) {
1306 if (cmdptr == cmd_head) {
Daniel Thompsond228bee2020-02-13 09:57:24 +00001307 strscpy(cmd_hist[cmd_head], cmd_cur,
Jason Wessel5d5314d2010-05-20 21:04:20 -05001308 CMD_BUFLEN);
1309 *(cmd_hist[cmd_head] +
1310 strlen(cmd_hist[cmd_head])-1) = '\0';
1311 }
1312 if (!handle_ctrl_cmd(cmdbuf))
1313 *(cmd_cur+strlen(cmd_cur)-1) = '\0';
1314 cmdbuf = cmd_cur;
1315 goto do_full_getstr;
1316 } else {
Daniel Thompsond228bee2020-02-13 09:57:24 +00001317 strscpy(cmd_hist[cmd_head], cmd_cur,
Jason Wessel5d5314d2010-05-20 21:04:20 -05001318 CMD_BUFLEN);
1319 }
1320
1321 cmd_head = (cmd_head+1) % KDB_CMD_HISTORY_COUNT;
1322 if (cmd_head == cmd_tail)
1323 cmd_tail = (cmd_tail+1) % KDB_CMD_HISTORY_COUNT;
1324 }
1325
1326 cmdptr = cmd_head;
1327 diag = kdb_parse(cmdbuf);
1328 if (diag == KDB_NOTFOUND) {
Randy Dunlapb0f73bc2017-12-08 10:19:23 -08001329 drop_newline(cmdbuf);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001330 kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
1331 diag = 0;
1332 }
1333 if (diag == KDB_CMD_GO
1334 || diag == KDB_CMD_CPU
1335 || diag == KDB_CMD_SS
Jason Wessel5d5314d2010-05-20 21:04:20 -05001336 || diag == KDB_CMD_KGDB)
1337 break;
1338
1339 if (diag)
1340 kdb_cmderror(diag);
1341 }
1342 KDB_DEBUG_STATE("kdb_local 9", diag);
1343 return diag;
1344}
1345
1346
1347/*
1348 * kdb_print_state - Print the state data for the current processor
1349 * for debugging.
1350 * Inputs:
1351 * text Identifies the debug point
1352 * value Any integer value to be printed, e.g. reason code.
1353 */
1354void kdb_print_state(const char *text, int value)
1355{
1356 kdb_printf("state: %s cpu %d value %d initial %d state %x\n",
1357 text, raw_smp_processor_id(), value, kdb_initial_cpu,
1358 kdb_state);
1359}
1360
1361/*
1362 * kdb_main_loop - After initial setup and assignment of the
1363 * controlling cpu, all cpus are in this loop. One cpu is in
1364 * control and will issue the kdb prompt, the others will spin
1365 * until 'go' or cpu switch.
1366 *
1367 * To get a consistent view of the kernel stacks for all
1368 * processes, this routine is invoked from the main kdb code via
1369 * an architecture specific routine. kdba_main_loop is
1370 * responsible for making the kernel stacks consistent for all
1371 * processes, there should be no difference between a blocked
1372 * process and a running process as far as kdb is concerned.
1373 * Inputs:
1374 * reason The reason KDB was invoked
1375 * error The hardware-defined error code
1376 * reason2 kdb's current reason code.
1377 * Initially error but can change
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001378 * according to kdb state.
Jason Wessel5d5314d2010-05-20 21:04:20 -05001379 * db_result Result code from break or debug point.
1380 * regs The exception frame at time of fault/breakpoint.
1381 * should always be valid.
1382 * Returns:
1383 * 0 KDB was invoked for an event which it wasn't responsible
1384 * 1 KDB handled the event for which it was invoked.
1385 */
1386int kdb_main_loop(kdb_reason_t reason, kdb_reason_t reason2, int error,
1387 kdb_dbtrap_t db_result, struct pt_regs *regs)
1388{
1389 int result = 1;
1390 /* Stay in kdb() until 'go', 'ss[b]' or an error */
1391 while (1) {
1392 /*
1393 * All processors except the one that is in control
1394 * will spin here.
1395 */
1396 KDB_DEBUG_STATE("kdb_main_loop 1", reason);
1397 while (KDB_STATE(HOLD_CPU)) {
1398 /* state KDB is turned off by kdb_cpu to see if the
1399 * other cpus are still live, each cpu in this loop
1400 * turns it back on.
1401 */
1402 if (!KDB_STATE(KDB))
1403 KDB_STATE_SET(KDB);
1404 }
1405
1406 KDB_STATE_CLEAR(SUPPRESS);
1407 KDB_DEBUG_STATE("kdb_main_loop 2", reason);
1408 if (KDB_STATE(LEAVING))
1409 break; /* Another cpu said 'go' */
1410 /* Still using kdb, this processor is in control */
1411 result = kdb_local(reason2, error, regs, db_result);
1412 KDB_DEBUG_STATE("kdb_main_loop 3", result);
1413
1414 if (result == KDB_CMD_CPU)
1415 break;
1416
1417 if (result == KDB_CMD_SS) {
1418 KDB_STATE_SET(DOING_SS);
1419 break;
1420 }
1421
Jason Wessel5d5314d2010-05-20 21:04:20 -05001422 if (result == KDB_CMD_KGDB) {
Jason Wesseld613d822011-05-23 13:22:54 -05001423 if (!KDB_STATE(DOING_KGDB))
Jason Wessel5d5314d2010-05-20 21:04:20 -05001424 kdb_printf("Entering please attach debugger "
1425 "or use $D#44+ or $3#33\n");
1426 break;
1427 }
1428 if (result && result != 1 && result != KDB_CMD_GO)
1429 kdb_printf("\nUnexpected kdb_local return code %d\n",
1430 result);
1431 KDB_DEBUG_STATE("kdb_main_loop 4", reason);
1432 break;
1433 }
1434 if (KDB_STATE(DOING_SS))
1435 KDB_STATE_CLEAR(SSBPT);
1436
Andrei Warkentin8f30d412012-02-28 06:55:05 -06001437 /* Clean up any keyboard devices before leaving */
1438 kdb_kbd_cleanup_state();
1439
Jason Wessel5d5314d2010-05-20 21:04:20 -05001440 return result;
1441}
1442
1443/*
1444 * kdb_mdr - This function implements the guts of the 'mdr', memory
1445 * read command.
1446 * mdr <addr arg>,<byte count>
1447 * Inputs:
1448 * addr Start address
1449 * count Number of bytes
1450 * Returns:
1451 * Always 0. Any errors are detected and printed by kdb_getarea.
1452 */
1453static int kdb_mdr(unsigned long addr, unsigned int count)
1454{
1455 unsigned char c;
1456 while (count--) {
1457 if (kdb_getarea(c, addr))
1458 return 0;
1459 kdb_printf("%02x", c);
1460 addr++;
1461 }
1462 kdb_printf("\n");
1463 return 0;
1464}
1465
1466/*
1467 * kdb_md - This function implements the 'md', 'md1', 'md2', 'md4',
1468 * 'md8' 'mdr' and 'mds' commands.
1469 *
1470 * md|mds [<addr arg> [<line count> [<radix>]]]
1471 * mdWcN [<addr arg> [<line count> [<radix>]]]
1472 * where W = is the width (1, 2, 4 or 8) and N is the count.
1473 * for eg., md1c20 reads 20 bytes, 1 at a time.
1474 * mdr <addr arg>,<byte count>
1475 */
1476static void kdb_md_line(const char *fmtstr, unsigned long addr,
1477 int symbolic, int nosect, int bytesperword,
1478 int num, int repeat, int phys)
1479{
1480 /* print just one line of data */
1481 kdb_symtab_t symtab;
1482 char cbuf[32];
1483 char *c = cbuf;
1484 int i;
Gustavo A. R. Silva9eb62f02018-08-16 09:01:41 -05001485 int j;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001486 unsigned long word;
1487
1488 memset(cbuf, '\0', sizeof(cbuf));
1489 if (phys)
1490 kdb_printf("phys " kdb_machreg_fmt0 " ", addr);
1491 else
1492 kdb_printf(kdb_machreg_fmt0 " ", addr);
1493
1494 for (i = 0; i < num && repeat--; i++) {
1495 if (phys) {
1496 if (kdb_getphysword(&word, addr, bytesperword))
1497 break;
1498 } else if (kdb_getword(&word, addr, bytesperword))
1499 break;
1500 kdb_printf(fmtstr, word);
1501 if (symbolic)
1502 kdbnearsym(word, &symtab);
1503 else
1504 memset(&symtab, 0, sizeof(symtab));
1505 if (symtab.sym_name) {
1506 kdb_symbol_print(word, &symtab, 0);
1507 if (!nosect) {
1508 kdb_printf("\n");
1509 kdb_printf(" %s %s "
1510 kdb_machreg_fmt " "
1511 kdb_machreg_fmt " "
1512 kdb_machreg_fmt, symtab.mod_name,
1513 symtab.sec_name, symtab.sec_start,
1514 symtab.sym_start, symtab.sym_end);
1515 }
1516 addr += bytesperword;
1517 } else {
1518 union {
1519 u64 word;
1520 unsigned char c[8];
1521 } wc;
1522 unsigned char *cp;
1523#ifdef __BIG_ENDIAN
1524 cp = wc.c + 8 - bytesperword;
1525#else
1526 cp = wc.c;
1527#endif
1528 wc.word = word;
1529#define printable_char(c) \
1530 ({unsigned char __c = c; isascii(__c) && isprint(__c) ? __c : '.'; })
Gustavo A. R. Silva9eb62f02018-08-16 09:01:41 -05001531 for (j = 0; j < bytesperword; j++)
Jason Wessel5d5314d2010-05-20 21:04:20 -05001532 *c++ = printable_char(*cp++);
Gustavo A. R. Silva9eb62f02018-08-16 09:01:41 -05001533 addr += bytesperword;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001534#undef printable_char
1535 }
1536 }
1537 kdb_printf("%*s %s\n", (int)((num-i)*(2*bytesperword + 1)+1),
1538 " ", cbuf);
1539}
1540
1541static int kdb_md(int argc, const char **argv)
1542{
1543 static unsigned long last_addr;
1544 static int last_radix, last_bytesperword, last_repeat;
1545 int radix = 16, mdcount = 8, bytesperword = KDB_WORD_SIZE, repeat;
1546 int nosect = 0;
1547 char fmtchar, fmtstr[64];
1548 unsigned long addr;
1549 unsigned long word;
1550 long offset = 0;
1551 int symbolic = 0;
1552 int valid = 0;
1553 int phys = 0;
Randy Dunlap1e0ce032017-12-08 10:19:19 -08001554 int raw = 0;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001555
1556 kdbgetintenv("MDCOUNT", &mdcount);
1557 kdbgetintenv("RADIX", &radix);
1558 kdbgetintenv("BYTESPERWORD", &bytesperword);
1559
1560 /* Assume 'md <addr>' and start with environment values */
1561 repeat = mdcount * 16 / bytesperword;
1562
1563 if (strcmp(argv[0], "mdr") == 0) {
Randy Dunlap1e0ce032017-12-08 10:19:19 -08001564 if (argc == 2 || (argc == 0 && last_addr != 0))
1565 valid = raw = 1;
1566 else
Jason Wessel5d5314d2010-05-20 21:04:20 -05001567 return KDB_ARGCOUNT;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001568 } else if (isdigit(argv[0][2])) {
1569 bytesperword = (int)(argv[0][2] - '0');
1570 if (bytesperword == 0) {
1571 bytesperword = last_bytesperword;
1572 if (bytesperword == 0)
1573 bytesperword = 4;
1574 }
1575 last_bytesperword = bytesperword;
1576 repeat = mdcount * 16 / bytesperword;
1577 if (!argv[0][3])
1578 valid = 1;
1579 else if (argv[0][3] == 'c' && argv[0][4]) {
1580 char *p;
1581 repeat = simple_strtoul(argv[0] + 4, &p, 10);
1582 mdcount = ((repeat * bytesperword) + 15) / 16;
1583 valid = !*p;
1584 }
1585 last_repeat = repeat;
1586 } else if (strcmp(argv[0], "md") == 0)
1587 valid = 1;
1588 else if (strcmp(argv[0], "mds") == 0)
1589 valid = 1;
1590 else if (strcmp(argv[0], "mdp") == 0) {
1591 phys = valid = 1;
1592 }
1593 if (!valid)
1594 return KDB_NOTFOUND;
1595
1596 if (argc == 0) {
1597 if (last_addr == 0)
1598 return KDB_ARGCOUNT;
1599 addr = last_addr;
1600 radix = last_radix;
1601 bytesperword = last_bytesperword;
1602 repeat = last_repeat;
Randy Dunlap1e0ce032017-12-08 10:19:19 -08001603 if (raw)
1604 mdcount = repeat;
1605 else
1606 mdcount = ((repeat * bytesperword) + 15) / 16;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001607 }
1608
1609 if (argc) {
1610 unsigned long val;
1611 int diag, nextarg = 1;
1612 diag = kdbgetaddrarg(argc, argv, &nextarg, &addr,
1613 &offset, NULL);
1614 if (diag)
1615 return diag;
1616 if (argc > nextarg+2)
1617 return KDB_ARGCOUNT;
1618
1619 if (argc >= nextarg) {
1620 diag = kdbgetularg(argv[nextarg], &val);
1621 if (!diag) {
1622 mdcount = (int) val;
Randy Dunlap1e0ce032017-12-08 10:19:19 -08001623 if (raw)
1624 repeat = mdcount;
1625 else
1626 repeat = mdcount * 16 / bytesperword;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001627 }
1628 }
1629 if (argc >= nextarg+1) {
1630 diag = kdbgetularg(argv[nextarg+1], &val);
1631 if (!diag)
1632 radix = (int) val;
1633 }
1634 }
1635
Randy Dunlap1e0ce032017-12-08 10:19:19 -08001636 if (strcmp(argv[0], "mdr") == 0) {
1637 int ret;
1638 last_addr = addr;
1639 ret = kdb_mdr(addr, mdcount);
1640 last_addr += mdcount;
1641 last_repeat = mdcount;
1642 last_bytesperword = bytesperword; // to make REPEAT happy
1643 return ret;
1644 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05001645
1646 switch (radix) {
1647 case 10:
1648 fmtchar = 'd';
1649 break;
1650 case 16:
1651 fmtchar = 'x';
1652 break;
1653 case 8:
1654 fmtchar = 'o';
1655 break;
1656 default:
1657 return KDB_BADRADIX;
1658 }
1659
1660 last_radix = radix;
1661
1662 if (bytesperword > KDB_WORD_SIZE)
1663 return KDB_BADWIDTH;
1664
1665 switch (bytesperword) {
1666 case 8:
1667 sprintf(fmtstr, "%%16.16l%c ", fmtchar);
1668 break;
1669 case 4:
1670 sprintf(fmtstr, "%%8.8l%c ", fmtchar);
1671 break;
1672 case 2:
1673 sprintf(fmtstr, "%%4.4l%c ", fmtchar);
1674 break;
1675 case 1:
1676 sprintf(fmtstr, "%%2.2l%c ", fmtchar);
1677 break;
1678 default:
1679 return KDB_BADWIDTH;
1680 }
1681
1682 last_repeat = repeat;
1683 last_bytesperword = bytesperword;
1684
1685 if (strcmp(argv[0], "mds") == 0) {
1686 symbolic = 1;
1687 /* Do not save these changes as last_*, they are temporary mds
1688 * overrides.
1689 */
1690 bytesperword = KDB_WORD_SIZE;
1691 repeat = mdcount;
1692 kdbgetintenv("NOSECT", &nosect);
1693 }
1694
1695 /* Round address down modulo BYTESPERWORD */
1696
1697 addr &= ~(bytesperword-1);
1698
1699 while (repeat > 0) {
1700 unsigned long a;
1701 int n, z, num = (symbolic ? 1 : (16 / bytesperword));
1702
1703 if (KDB_FLAG(CMD_INTERRUPT))
1704 return 0;
1705 for (a = addr, z = 0; z < repeat; a += bytesperword, ++z) {
1706 if (phys) {
1707 if (kdb_getphysword(&word, a, bytesperword)
1708 || word)
1709 break;
1710 } else if (kdb_getword(&word, a, bytesperword) || word)
1711 break;
1712 }
1713 n = min(num, repeat);
1714 kdb_md_line(fmtstr, addr, symbolic, nosect, bytesperword,
1715 num, repeat, phys);
1716 addr += bytesperword * n;
1717 repeat -= n;
1718 z = (z + num - 1) / num;
1719 if (z > 2) {
1720 int s = num * (z-2);
1721 kdb_printf(kdb_machreg_fmt0 "-" kdb_machreg_fmt0
1722 " zero suppressed\n",
1723 addr, addr + bytesperword * s - 1);
1724 addr += bytesperword * s;
1725 repeat -= s;
1726 }
1727 }
1728 last_addr = addr;
1729
1730 return 0;
1731}
1732
1733/*
1734 * kdb_mm - This function implements the 'mm' command.
1735 * mm address-expression new-value
1736 * Remarks:
1737 * mm works on machine words, mmW works on bytes.
1738 */
1739static int kdb_mm(int argc, const char **argv)
1740{
1741 int diag;
1742 unsigned long addr;
1743 long offset = 0;
1744 unsigned long contents;
1745 int nextarg;
1746 int width;
1747
1748 if (argv[0][2] && !isdigit(argv[0][2]))
1749 return KDB_NOTFOUND;
1750
1751 if (argc < 2)
1752 return KDB_ARGCOUNT;
1753
1754 nextarg = 1;
1755 diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
1756 if (diag)
1757 return diag;
1758
1759 if (nextarg > argc)
1760 return KDB_ARGCOUNT;
1761 diag = kdbgetaddrarg(argc, argv, &nextarg, &contents, NULL, NULL);
1762 if (diag)
1763 return diag;
1764
1765 if (nextarg != argc + 1)
1766 return KDB_ARGCOUNT;
1767
1768 width = argv[0][2] ? (argv[0][2] - '0') : (KDB_WORD_SIZE);
1769 diag = kdb_putword(addr, contents, width);
1770 if (diag)
1771 return diag;
1772
1773 kdb_printf(kdb_machreg_fmt " = " kdb_machreg_fmt "\n", addr, contents);
1774
1775 return 0;
1776}
1777
1778/*
1779 * kdb_go - This function implements the 'go' command.
1780 * go [address-expression]
1781 */
1782static int kdb_go(int argc, const char **argv)
1783{
1784 unsigned long addr;
1785 int diag;
1786 int nextarg;
1787 long offset;
1788
Jason Wessel495363d2010-05-21 08:46:00 -05001789 if (raw_smp_processor_id() != kdb_initial_cpu) {
1790 kdb_printf("go must execute on the entry cpu, "
1791 "please use \"cpu %d\" and then execute go\n",
1792 kdb_initial_cpu);
1793 return KDB_BADCPUNUM;
1794 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05001795 if (argc == 1) {
Jason Wessel5d5314d2010-05-20 21:04:20 -05001796 nextarg = 1;
1797 diag = kdbgetaddrarg(argc, argv, &nextarg,
1798 &addr, &offset, NULL);
1799 if (diag)
1800 return diag;
1801 } else if (argc) {
1802 return KDB_ARGCOUNT;
1803 }
1804
1805 diag = KDB_CMD_GO;
1806 if (KDB_FLAG(CATASTROPHIC)) {
1807 kdb_printf("Catastrophic error detected\n");
1808 kdb_printf("kdb_continue_catastrophic=%d, ",
1809 kdb_continue_catastrophic);
1810 if (kdb_continue_catastrophic == 0 && kdb_go_count++ == 0) {
1811 kdb_printf("type go a second time if you really want "
1812 "to continue\n");
1813 return 0;
1814 }
1815 if (kdb_continue_catastrophic == 2) {
1816 kdb_printf("forcing reboot\n");
1817 kdb_reboot(0, NULL);
1818 }
1819 kdb_printf("attempting to continue\n");
1820 }
1821 return diag;
1822}
1823
1824/*
1825 * kdb_rd - This function implements the 'rd' command.
1826 */
1827static int kdb_rd(int argc, const char **argv)
1828{
Daniel Thompsonfcf27362020-02-06 11:40:09 +00001829 int len = kdb_check_regs();
1830#if DBG_MAX_REG_NUM > 0
Jason Wessel534af102010-08-05 09:22:20 -05001831 int i;
1832 char *rname;
1833 int rsize;
1834 u64 reg64;
1835 u32 reg32;
1836 u16 reg16;
1837 u8 reg8;
1838
Daniel Thompsonfcf27362020-02-06 11:40:09 +00001839 if (len)
1840 return len;
Jason Wessel534af102010-08-05 09:22:20 -05001841
1842 for (i = 0; i < DBG_MAX_REG_NUM; i++) {
1843 rsize = dbg_reg_def[i].size * 2;
1844 if (rsize > 16)
1845 rsize = 2;
1846 if (len + strlen(dbg_reg_def[i].name) + 4 + rsize > 80) {
1847 len = 0;
1848 kdb_printf("\n");
1849 }
1850 if (len)
1851 len += kdb_printf(" ");
1852 switch(dbg_reg_def[i].size * 8) {
1853 case 8:
1854 rname = dbg_get_reg(i, &reg8, kdb_current_regs);
1855 if (!rname)
1856 break;
1857 len += kdb_printf("%s: %02x", rname, reg8);
1858 break;
1859 case 16:
1860 rname = dbg_get_reg(i, &reg16, kdb_current_regs);
1861 if (!rname)
1862 break;
1863 len += kdb_printf("%s: %04x", rname, reg16);
1864 break;
1865 case 32:
1866 rname = dbg_get_reg(i, &reg32, kdb_current_regs);
1867 if (!rname)
1868 break;
1869 len += kdb_printf("%s: %08x", rname, reg32);
1870 break;
1871 case 64:
1872 rname = dbg_get_reg(i, &reg64, kdb_current_regs);
1873 if (!rname)
1874 break;
1875 len += kdb_printf("%s: %016llx", rname, reg64);
1876 break;
1877 default:
1878 len += kdb_printf("%s: ??", dbg_reg_def[i].name);
1879 }
1880 }
1881 kdb_printf("\n");
Daniel Thompsonfcf27362020-02-06 11:40:09 +00001882#else
1883 if (len)
1884 return len;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001885
Daniel Thompsonfcf27362020-02-06 11:40:09 +00001886 kdb_dumpregs(kdb_current_regs);
1887#endif
Jason Wessel5d5314d2010-05-20 21:04:20 -05001888 return 0;
1889}
1890
1891/*
1892 * kdb_rm - This function implements the 'rm' (register modify) command.
1893 * rm register-name new-contents
1894 * Remarks:
Jason Wessel534af102010-08-05 09:22:20 -05001895 * Allows register modification with the same restrictions as gdb
Jason Wessel5d5314d2010-05-20 21:04:20 -05001896 */
1897static int kdb_rm(int argc, const char **argv)
1898{
Jason Wessel534af102010-08-05 09:22:20 -05001899#if DBG_MAX_REG_NUM > 0
Jason Wessel5d5314d2010-05-20 21:04:20 -05001900 int diag;
Jason Wessel534af102010-08-05 09:22:20 -05001901 const char *rname;
1902 int i;
1903 u64 reg64;
1904 u32 reg32;
1905 u16 reg16;
1906 u8 reg8;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001907
1908 if (argc != 2)
1909 return KDB_ARGCOUNT;
1910 /*
1911 * Allow presence or absence of leading '%' symbol.
1912 */
Jason Wessel534af102010-08-05 09:22:20 -05001913 rname = argv[1];
1914 if (*rname == '%')
1915 rname++;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001916
Jason Wessel534af102010-08-05 09:22:20 -05001917 diag = kdbgetu64arg(argv[2], &reg64);
Jason Wessel5d5314d2010-05-20 21:04:20 -05001918 if (diag)
1919 return diag;
1920
Daniel Thompsonfcf27362020-02-06 11:40:09 +00001921 diag = kdb_check_regs();
1922 if (diag)
1923 return diag;
Jason Wessel534af102010-08-05 09:22:20 -05001924
1925 diag = KDB_BADREG;
1926 for (i = 0; i < DBG_MAX_REG_NUM; i++) {
1927 if (strcmp(rname, dbg_reg_def[i].name) == 0) {
1928 diag = 0;
1929 break;
1930 }
1931 }
1932 if (!diag) {
1933 switch(dbg_reg_def[i].size * 8) {
1934 case 8:
1935 reg8 = reg64;
1936 dbg_set_reg(i, &reg8, kdb_current_regs);
1937 break;
1938 case 16:
1939 reg16 = reg64;
1940 dbg_set_reg(i, &reg16, kdb_current_regs);
1941 break;
1942 case 32:
1943 reg32 = reg64;
1944 dbg_set_reg(i, &reg32, kdb_current_regs);
1945 break;
1946 case 64:
1947 dbg_set_reg(i, &reg64, kdb_current_regs);
1948 break;
1949 }
1950 }
1951 return diag;
1952#else
Jason Wessel5d5314d2010-05-20 21:04:20 -05001953 kdb_printf("ERROR: Register set currently not implemented\n");
Jason Wessel534af102010-08-05 09:22:20 -05001954 return 0;
1955#endif
Jason Wessel5d5314d2010-05-20 21:04:20 -05001956}
1957
1958#if defined(CONFIG_MAGIC_SYSRQ)
1959/*
1960 * kdb_sr - This function implements the 'sr' (SYSRQ key) command
1961 * which interfaces to the soi-disant MAGIC SYSRQ functionality.
1962 * sr <magic-sysrq-code>
1963 */
1964static int kdb_sr(int argc, const char **argv)
1965{
Anton Vorontsov420c2b12014-11-06 14:36:46 +00001966 bool check_mask =
1967 !kdb_check_flags(KDB_ENABLE_ALL, kdb_cmd_enabled, false);
1968
Jason Wessel5d5314d2010-05-20 21:04:20 -05001969 if (argc != 1)
1970 return KDB_ARGCOUNT;
Anton Vorontsov420c2b12014-11-06 14:36:46 +00001971
Jason Wesseld37d39a2010-05-20 21:04:27 -05001972 kdb_trap_printk++;
Anton Vorontsov420c2b12014-11-06 14:36:46 +00001973 __handle_sysrq(*argv[1], check_mask);
Jason Wesseld37d39a2010-05-20 21:04:27 -05001974 kdb_trap_printk--;
Jason Wessel5d5314d2010-05-20 21:04:20 -05001975
1976 return 0;
1977}
1978#endif /* CONFIG_MAGIC_SYSRQ */
1979
1980/*
1981 * kdb_ef - This function implements the 'regs' (display exception
1982 * frame) command. This command takes an address and expects to
1983 * find an exception frame at that address, formats and prints
1984 * it.
1985 * regs address-expression
1986 * Remarks:
1987 * Not done yet.
1988 */
1989static int kdb_ef(int argc, const char **argv)
1990{
1991 int diag;
1992 unsigned long addr;
1993 long offset;
1994 int nextarg;
1995
1996 if (argc != 1)
1997 return KDB_ARGCOUNT;
1998
1999 nextarg = 1;
2000 diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
2001 if (diag)
2002 return diag;
2003 show_regs((struct pt_regs *)addr);
2004 return 0;
2005}
2006
2007#if defined(CONFIG_MODULES)
Jason Wessel5d5314d2010-05-20 21:04:20 -05002008/*
2009 * kdb_lsmod - This function implements the 'lsmod' command. Lists
2010 * currently loaded kernel modules.
2011 * Mostly taken from userland lsmod.
2012 */
2013static int kdb_lsmod(int argc, const char **argv)
2014{
2015 struct module *mod;
2016
2017 if (argc != 0)
2018 return KDB_ARGCOUNT;
2019
2020 kdb_printf("Module Size modstruct Used by\n");
2021 list_for_each_entry(mod, kdb_modules, list) {
Rusty Russell0d21b0e2013-01-12 11:38:44 +10302022 if (mod->state == MODULE_STATE_UNFORMED)
2023 continue;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002024
Christophe Leroy568fb6f2018-09-27 17:17:57 +00002025 kdb_printf("%-20s%8u 0x%px ", mod->name,
Rusty Russell7523e4d2015-11-26 09:44:08 +10302026 mod->core_layout.size, (void *)mod);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002027#ifdef CONFIG_MODULE_UNLOAD
Rusty Russelld5db1392015-01-22 11:13:14 +10302028 kdb_printf("%4d ", module_refcount(mod));
Jason Wessel5d5314d2010-05-20 21:04:20 -05002029#endif
2030 if (mod->state == MODULE_STATE_GOING)
2031 kdb_printf(" (Unloading)");
2032 else if (mod->state == MODULE_STATE_COMING)
2033 kdb_printf(" (Loading)");
2034 else
2035 kdb_printf(" (Live)");
Christophe Leroy568fb6f2018-09-27 17:17:57 +00002036 kdb_printf(" 0x%px", mod->core_layout.base);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002037
2038#ifdef CONFIG_MODULE_UNLOAD
2039 {
2040 struct module_use *use;
2041 kdb_printf(" [ ");
Rusty Russellc8e21ce2010-06-05 11:17:35 -06002042 list_for_each_entry(use, &mod->source_list,
2043 source_list)
2044 kdb_printf("%s ", use->target->name);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002045 kdb_printf("]\n");
2046 }
2047#endif
2048 }
2049
2050 return 0;
2051}
2052
2053#endif /* CONFIG_MODULES */
2054
2055/*
2056 * kdb_env - This function implements the 'env' command. Display the
2057 * current environment variables.
2058 */
2059
2060static int kdb_env(int argc, const char **argv)
2061{
Sumit Garg83fa2d12021-02-08 13:32:22 +05302062 kdb_printenv();
Jason Wessel5d5314d2010-05-20 21:04:20 -05002063
2064 if (KDB_DEBUG(MASK))
Wei Lic893de12020-05-21 15:21:25 +08002065 kdb_printf("KDBDEBUG=0x%x\n",
2066 (kdb_flags & KDB_DEBUG(MASK)) >> KDB_DEBUG_FLAG_SHIFT);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002067
2068 return 0;
2069}
2070
2071#ifdef CONFIG_PRINTK
2072/*
2073 * kdb_dmesg - This function implements the 'dmesg' command to display
2074 * the contents of the syslog buffer.
2075 * dmesg [lines] [adjust]
2076 */
2077static int kdb_dmesg(int argc, const char **argv)
2078{
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002079 int diag;
2080 int logging;
2081 int lines = 0;
2082 int adjust = 0;
2083 int n = 0;
2084 int skip = 0;
John Ognessf9f3f022021-03-03 11:15:25 +01002085 struct kmsg_dump_iter iter;
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002086 size_t len;
2087 char buf[201];
Jason Wessel5d5314d2010-05-20 21:04:20 -05002088
2089 if (argc > 2)
2090 return KDB_ARGCOUNT;
2091 if (argc) {
2092 char *cp;
2093 lines = simple_strtol(argv[1], &cp, 0);
2094 if (*cp)
2095 lines = 0;
2096 if (argc > 1) {
2097 adjust = simple_strtoul(argv[2], &cp, 0);
2098 if (*cp || adjust < 0)
2099 adjust = 0;
2100 }
2101 }
2102
2103 /* disable LOGGING if set */
2104 diag = kdbgetintenv("LOGGING", &logging);
2105 if (!diag && logging) {
2106 const char *setargs[] = { "set", "LOGGING", "0" };
2107 kdb_set(2, setargs);
2108 }
2109
John Ognessa4f98762021-03-03 11:15:27 +01002110 kmsg_dump_rewind(&iter);
2111 while (kmsg_dump_get_line(&iter, 1, NULL, 0, NULL))
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002112 n++;
2113
Jason Wessel5d5314d2010-05-20 21:04:20 -05002114 if (lines < 0) {
2115 if (adjust >= n)
2116 kdb_printf("buffer only contains %d lines, nothing "
2117 "printed\n", n);
2118 else if (adjust - lines >= n)
2119 kdb_printf("buffer only contains %d lines, last %d "
2120 "lines printed\n", n, n - adjust);
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002121 skip = adjust;
2122 lines = abs(lines);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002123 } else if (lines > 0) {
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002124 skip = n - lines - adjust;
2125 lines = abs(lines);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002126 if (adjust >= n) {
2127 kdb_printf("buffer only contains %d lines, "
2128 "nothing printed\n", n);
2129 skip = n;
2130 } else if (skip < 0) {
2131 lines += skip;
2132 skip = 0;
2133 kdb_printf("buffer only contains %d lines, first "
2134 "%d lines printed\n", n, lines);
2135 }
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002136 } else {
2137 lines = n;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002138 }
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002139
2140 if (skip >= n || skip < 0)
2141 return 0;
2142
John Ognessa4f98762021-03-03 11:15:27 +01002143 kmsg_dump_rewind(&iter);
2144 while (kmsg_dump_get_line(&iter, 1, buf, sizeof(buf), &len)) {
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002145 if (skip) {
2146 skip--;
2147 continue;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002148 }
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002149 if (!lines--)
2150 break;
Jason Wesseld1871b32012-08-26 21:43:12 -05002151 if (KDB_FLAG(CMD_INTERRUPT))
2152 return 0;
Anton Vorontsovbc792e62012-07-20 17:27:37 -07002153
2154 kdb_printf("%.*s\n", (int)len - 1, buf);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002155 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05002156
2157 return 0;
2158}
2159#endif /* CONFIG_PRINTK */
Anton Vorontsovad394f62012-09-24 14:27:51 -07002160
2161/* Make sure we balance enable/disable calls, must disable first. */
2162static atomic_t kdb_nmi_disabled;
2163
2164static int kdb_disable_nmi(int argc, const char *argv[])
2165{
2166 if (atomic_read(&kdb_nmi_disabled))
2167 return 0;
2168 atomic_set(&kdb_nmi_disabled, 1);
2169 arch_kgdb_ops.enable_nmi(0);
2170 return 0;
2171}
2172
2173static int kdb_param_enable_nmi(const char *val, const struct kernel_param *kp)
2174{
2175 if (!atomic_add_unless(&kdb_nmi_disabled, -1, 0))
2176 return -EINVAL;
2177 arch_kgdb_ops.enable_nmi(1);
2178 return 0;
2179}
2180
2181static const struct kernel_param_ops kdb_param_ops_enable_nmi = {
2182 .set = kdb_param_enable_nmi,
2183};
2184module_param_cb(enable_nmi, &kdb_param_ops_enable_nmi, NULL, 0600);
2185
Jason Wessel5d5314d2010-05-20 21:04:20 -05002186/*
2187 * kdb_cpu - This function implements the 'cpu' command.
2188 * cpu [<cpunum>]
2189 * Returns:
2190 * KDB_CMD_CPU for success, a kdb diagnostic if error
2191 */
2192static void kdb_cpu_status(void)
2193{
2194 int i, start_cpu, first_print = 1;
2195 char state, prev_state = '?';
2196
2197 kdb_printf("Currently on cpu %d\n", raw_smp_processor_id());
2198 kdb_printf("Available cpus: ");
2199 for (start_cpu = -1, i = 0; i < NR_CPUS; i++) {
2200 if (!cpu_online(i)) {
2201 state = 'F'; /* cpu is offline */
Daniel Thompsona1465d22014-11-11 09:31:53 -06002202 } else if (!kgdb_info[i].enter_kgdb) {
2203 state = 'D'; /* cpu is online but unresponsive */
Jason Wessel5d5314d2010-05-20 21:04:20 -05002204 } else {
2205 state = ' '; /* cpu is responding to kdb */
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002206 if (kdb_task_state_char(KDB_TSK(i)) == '-')
2207 state = '-'; /* idle task */
Jason Wessel5d5314d2010-05-20 21:04:20 -05002208 }
2209 if (state != prev_state) {
2210 if (prev_state != '?') {
2211 if (!first_print)
2212 kdb_printf(", ");
2213 first_print = 0;
2214 kdb_printf("%d", start_cpu);
2215 if (start_cpu < i-1)
2216 kdb_printf("-%d", i-1);
2217 if (prev_state != ' ')
2218 kdb_printf("(%c)", prev_state);
2219 }
2220 prev_state = state;
2221 start_cpu = i;
2222 }
2223 }
2224 /* print the trailing cpus, ignoring them if they are all offline */
2225 if (prev_state != 'F') {
2226 if (!first_print)
2227 kdb_printf(", ");
2228 kdb_printf("%d", start_cpu);
2229 if (start_cpu < i-1)
2230 kdb_printf("-%d", i-1);
2231 if (prev_state != ' ')
2232 kdb_printf("(%c)", prev_state);
2233 }
2234 kdb_printf("\n");
2235}
2236
2237static int kdb_cpu(int argc, const char **argv)
2238{
2239 unsigned long cpunum;
2240 int diag;
2241
2242 if (argc == 0) {
2243 kdb_cpu_status();
2244 return 0;
2245 }
2246
2247 if (argc != 1)
2248 return KDB_ARGCOUNT;
2249
2250 diag = kdbgetularg(argv[1], &cpunum);
2251 if (diag)
2252 return diag;
2253
2254 /*
2255 * Validate cpunum
2256 */
Jason Wesseldf0036d2015-01-08 15:46:55 -06002257 if ((cpunum >= CONFIG_NR_CPUS) || !kgdb_info[cpunum].enter_kgdb)
Jason Wessel5d5314d2010-05-20 21:04:20 -05002258 return KDB_BADCPUNUM;
2259
2260 dbg_switch_cpu = cpunum;
2261
2262 /*
2263 * Switch to other cpu
2264 */
2265 return KDB_CMD_CPU;
2266}
2267
2268/* The user may not realize that ps/bta with no parameters does not print idle
2269 * or sleeping system daemon processes, so tell them how many were suppressed.
2270 */
2271void kdb_ps_suppressed(void)
2272{
2273 int idle = 0, daemon = 0;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002274 unsigned long cpu;
2275 const struct task_struct *p, *g;
2276 for_each_online_cpu(cpu) {
2277 p = kdb_curr_task(cpu);
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002278 if (kdb_task_state(p, "-"))
Jason Wessel5d5314d2010-05-20 21:04:20 -05002279 ++idle;
2280 }
Davidlohr Buesoece4cea2020-09-07 13:32:06 -07002281 for_each_process_thread(g, p) {
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002282 if (kdb_task_state(p, "ims"))
Jason Wessel5d5314d2010-05-20 21:04:20 -05002283 ++daemon;
Davidlohr Buesoece4cea2020-09-07 13:32:06 -07002284 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05002285 if (idle || daemon) {
2286 if (idle)
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002287 kdb_printf("%d idle process%s (state -)%s\n",
Jason Wessel5d5314d2010-05-20 21:04:20 -05002288 idle, idle == 1 ? "" : "es",
2289 daemon ? " and " : "");
2290 if (daemon)
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002291 kdb_printf("%d sleeping system daemon (state [ims]) "
Jason Wessel5d5314d2010-05-20 21:04:20 -05002292 "process%s", daemon,
2293 daemon == 1 ? "" : "es");
2294 kdb_printf(" suppressed,\nuse 'ps A' to see all.\n");
2295 }
2296}
2297
Jason Wessel5d5314d2010-05-20 21:04:20 -05002298void kdb_ps1(const struct task_struct *p)
2299{
2300 int cpu;
2301 unsigned long tmp;
2302
Christoph Hellwigfe557312020-06-17 09:37:53 +02002303 if (!p ||
2304 copy_from_kernel_nofault(&tmp, (char *)p, sizeof(unsigned long)))
Jason Wessel5d5314d2010-05-20 21:04:20 -05002305 return;
2306
2307 cpu = kdb_process_cpu(p);
Christophe Leroy568fb6f2018-09-27 17:17:57 +00002308 kdb_printf("0x%px %8d %8d %d %4d %c 0x%px %c%s\n",
Jason Wessel5d5314d2010-05-20 21:04:20 -05002309 (void *)p, p->pid, p->parent->pid,
2310 kdb_task_has_cpu(p), kdb_process_cpu(p),
2311 kdb_task_state_char(p),
2312 (void *)(&p->thread),
2313 p == kdb_curr_task(raw_smp_processor_id()) ? '*' : ' ',
2314 p->comm);
2315 if (kdb_task_has_cpu(p)) {
2316 if (!KDB_TSK(cpu)) {
2317 kdb_printf(" Error: no saved data for this cpu\n");
2318 } else {
2319 if (KDB_TSK(cpu) != p)
2320 kdb_printf(" Error: does not match running "
Christophe Leroy568fb6f2018-09-27 17:17:57 +00002321 "process table (0x%px)\n", KDB_TSK(cpu));
Jason Wessel5d5314d2010-05-20 21:04:20 -05002322 }
2323 }
2324}
2325
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002326/*
2327 * kdb_ps - This function implements the 'ps' command which shows a
2328 * list of the active processes.
2329 *
2330 * ps [<state_chars>] Show processes, optionally selecting only those whose
2331 * state character is found in <state_chars>.
2332 */
Jason Wessel5d5314d2010-05-20 21:04:20 -05002333static int kdb_ps(int argc, const char **argv)
2334{
2335 struct task_struct *g, *p;
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002336 const char *mask;
2337 unsigned long cpu;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002338
2339 if (argc == 0)
2340 kdb_ps_suppressed();
2341 kdb_printf("%-*s Pid Parent [*] cpu State %-*s Command\n",
2342 (int)(2*sizeof(void *))+2, "Task Addr",
2343 (int)(2*sizeof(void *))+2, "Thread");
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002344 mask = argc ? argv[1] : kdbgetenv("PS");
Jason Wessel5d5314d2010-05-20 21:04:20 -05002345 /* Run the active tasks first */
2346 for_each_online_cpu(cpu) {
2347 if (KDB_FLAG(CMD_INTERRUPT))
2348 return 0;
2349 p = kdb_curr_task(cpu);
2350 if (kdb_task_state(p, mask))
2351 kdb_ps1(p);
2352 }
2353 kdb_printf("\n");
2354 /* Now the real tasks */
Davidlohr Buesoece4cea2020-09-07 13:32:06 -07002355 for_each_process_thread(g, p) {
Jason Wessel5d5314d2010-05-20 21:04:20 -05002356 if (KDB_FLAG(CMD_INTERRUPT))
2357 return 0;
2358 if (kdb_task_state(p, mask))
2359 kdb_ps1(p);
Davidlohr Buesoece4cea2020-09-07 13:32:06 -07002360 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05002361
2362 return 0;
2363}
2364
2365/*
2366 * kdb_pid - This function implements the 'pid' command which switches
2367 * the currently active process.
2368 * pid [<pid> | R]
2369 */
2370static int kdb_pid(int argc, const char **argv)
2371{
2372 struct task_struct *p;
2373 unsigned long val;
2374 int diag;
2375
2376 if (argc > 1)
2377 return KDB_ARGCOUNT;
2378
2379 if (argc) {
2380 if (strcmp(argv[1], "R") == 0) {
2381 p = KDB_TSK(kdb_initial_cpu);
2382 } else {
2383 diag = kdbgetularg(argv[1], &val);
2384 if (diag)
2385 return KDB_BADINT;
2386
2387 p = find_task_by_pid_ns((pid_t)val, &init_pid_ns);
2388 if (!p) {
2389 kdb_printf("No task with pid=%d\n", (pid_t)val);
2390 return 0;
2391 }
2392 }
2393 kdb_set_current_task(p);
2394 }
2395 kdb_printf("KDB current process is %s(pid=%d)\n",
2396 kdb_current_task->comm,
2397 kdb_current_task->pid);
2398
2399 return 0;
2400}
2401
Jason Wessel5d5314d2010-05-20 21:04:20 -05002402static int kdb_kgdb(int argc, const char **argv)
2403{
2404 return KDB_CMD_KGDB;
2405}
2406
2407/*
2408 * kdb_help - This function implements the 'help' and '?' commands.
2409 */
2410static int kdb_help(int argc, const char **argv)
2411{
2412 kdbtab_t *kt;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002413
2414 kdb_printf("%-15.15s %-20.20s %s\n", "Command", "Usage", "Description");
2415 kdb_printf("-----------------------------"
2416 "-----------------------------\n");
Sumit Garge4f291b2021-02-24 12:38:27 +05302417 list_for_each_entry(kt, &kdb_cmds_head, list_node) {
Jason Wessel074604a2013-02-04 09:52:14 -06002418 char *space = "";
Jason Wessel5d5314d2010-05-20 21:04:20 -05002419 if (KDB_FLAG(CMD_INTERRUPT))
2420 return 0;
Sumit Garge868f0a2021-07-12 19:16:20 +05302421 if (!kdb_check_flags(kt->flags, kdb_cmd_enabled, true))
Anton Vorontsov420c2b12014-11-06 14:36:46 +00002422 continue;
Sumit Garge868f0a2021-07-12 19:16:20 +05302423 if (strlen(kt->usage) > 20)
Jason Wessel074604a2013-02-04 09:52:14 -06002424 space = "\n ";
Sumit Garge868f0a2021-07-12 19:16:20 +05302425 kdb_printf("%-15.15s %-20s%s%s\n", kt->name,
2426 kt->usage, space, kt->help);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002427 }
2428 return 0;
2429}
2430
2431/*
2432 * kdb_kill - This function implements the 'kill' commands.
2433 */
2434static int kdb_kill(int argc, const char **argv)
2435{
2436 long sig, pid;
2437 char *endp;
2438 struct task_struct *p;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002439
2440 if (argc != 2)
2441 return KDB_ARGCOUNT;
2442
2443 sig = simple_strtol(argv[1], &endp, 0);
2444 if (*endp)
2445 return KDB_BADINT;
Eric W. Biederman0b44bf92017-08-17 15:45:38 -05002446 if ((sig >= 0) || !valid_signal(-sig)) {
Jason Wessel5d5314d2010-05-20 21:04:20 -05002447 kdb_printf("Invalid signal parameter.<-signal>\n");
2448 return 0;
2449 }
2450 sig = -sig;
2451
2452 pid = simple_strtol(argv[2], &endp, 0);
2453 if (*endp)
2454 return KDB_BADINT;
2455 if (pid <= 0) {
2456 kdb_printf("Process ID must be large than 0.\n");
2457 return 0;
2458 }
2459
2460 /* Find the process. */
2461 p = find_task_by_pid_ns(pid, &init_pid_ns);
2462 if (!p) {
2463 kdb_printf("The specified process isn't found.\n");
2464 return 0;
2465 }
2466 p = p->group_leader;
Eric W. Biederman0b44bf92017-08-17 15:45:38 -05002467 kdb_send_sig(p, sig);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002468 return 0;
2469}
2470
Jason Wessel5d5314d2010-05-20 21:04:20 -05002471/*
2472 * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
2473 * I cannot call that code directly from kdb, it has an unconditional
2474 * cli()/sti() and calls routines that take locks which can stop the debugger.
2475 */
2476static void kdb_sysinfo(struct sysinfo *val)
2477{
Baolin Wang40b90ef2018-01-29 10:22:51 +08002478 u64 uptime = ktime_get_mono_fast_ns();
2479
Jason Wessel5d5314d2010-05-20 21:04:20 -05002480 memset(val, 0, sizeof(*val));
Baolin Wang40b90ef2018-01-29 10:22:51 +08002481 val->uptime = div_u64(uptime, NSEC_PER_SEC);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002482 val->loads[0] = avenrun[0];
2483 val->loads[1] = avenrun[1];
2484 val->loads[2] = avenrun[2];
2485 val->procs = nr_threads-1;
2486 si_meminfo(val);
2487
2488 return;
2489}
2490
2491/*
2492 * kdb_summary - This function implements the 'summary' command.
2493 */
2494static int kdb_summary(int argc, const char **argv)
2495{
Arnd Bergmann6909e292017-10-12 16:06:11 +02002496 time64_t now;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002497 struct sysinfo val;
2498
2499 if (argc)
2500 return KDB_ARGCOUNT;
2501
2502 kdb_printf("sysname %s\n", init_uts_ns.name.sysname);
2503 kdb_printf("release %s\n", init_uts_ns.name.release);
2504 kdb_printf("version %s\n", init_uts_ns.name.version);
2505 kdb_printf("machine %s\n", init_uts_ns.name.machine);
2506 kdb_printf("nodename %s\n", init_uts_ns.name.nodename);
2507 kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002508
Arnd Bergmann6909e292017-10-12 16:06:11 +02002509 now = __ktime_get_real_seconds();
Andy Shevchenko126ac4d2021-05-11 18:39:56 +03002510 kdb_printf("date %ptTs tz_minuteswest %d\n", &now, sys_tz.tz_minuteswest);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002511 kdb_sysinfo(&val);
2512 kdb_printf("uptime ");
2513 if (val.uptime > (24*60*60)) {
2514 int days = val.uptime / (24*60*60);
2515 val.uptime %= (24*60*60);
2516 kdb_printf("%d day%s ", days, days == 1 ? "" : "s");
2517 }
2518 kdb_printf("%02ld:%02ld\n", val.uptime/(60*60), (val.uptime/60)%60);
2519
Jason Wessel5d5314d2010-05-20 21:04:20 -05002520 kdb_printf("load avg %ld.%02ld %ld.%02ld %ld.%02ld\n",
2521 LOAD_INT(val.loads[0]), LOAD_FRAC(val.loads[0]),
2522 LOAD_INT(val.loads[1]), LOAD_FRAC(val.loads[1]),
2523 LOAD_INT(val.loads[2]), LOAD_FRAC(val.loads[2]));
Johannes Weiner8508cf32018-10-26 15:06:11 -07002524
Jason Wessel5d5314d2010-05-20 21:04:20 -05002525 /* Display in kilobytes */
2526#define K(x) ((x) << (PAGE_SHIFT - 10))
2527 kdb_printf("\nMemTotal: %8lu kB\nMemFree: %8lu kB\n"
2528 "Buffers: %8lu kB\n",
Jay Lan14675592014-09-29 15:36:57 -07002529 K(val.totalram), K(val.freeram), K(val.bufferram));
Jason Wessel5d5314d2010-05-20 21:04:20 -05002530 return 0;
2531}
2532
2533/*
2534 * kdb_per_cpu - This function implements the 'per_cpu' command.
2535 */
2536static int kdb_per_cpu(int argc, const char **argv)
2537{
Jason Wessel931ea242010-10-29 08:04:16 -05002538 char fmtstr[64];
2539 int cpu, diag, nextarg = 1;
2540 unsigned long addr, symaddr, val, bytesperword = 0, whichcpu = ~0UL;
Jason Wessel5d5314d2010-05-20 21:04:20 -05002541
2542 if (argc < 1 || argc > 3)
2543 return KDB_ARGCOUNT;
2544
Jason Wessel931ea242010-10-29 08:04:16 -05002545 diag = kdbgetaddrarg(argc, argv, &nextarg, &symaddr, NULL, NULL);
2546 if (diag)
2547 return diag;
2548
Jason Wessel5d5314d2010-05-20 21:04:20 -05002549 if (argc >= 2) {
2550 diag = kdbgetularg(argv[2], &bytesperword);
2551 if (diag)
2552 return diag;
2553 }
2554 if (!bytesperword)
2555 bytesperword = KDB_WORD_SIZE;
2556 else if (bytesperword > KDB_WORD_SIZE)
2557 return KDB_BADWIDTH;
2558 sprintf(fmtstr, "%%0%dlx ", (int)(2*bytesperword));
2559 if (argc >= 3) {
2560 diag = kdbgetularg(argv[3], &whichcpu);
2561 if (diag)
2562 return diag;
Dan Carpenterb5866272019-05-06 15:50:18 +03002563 if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) {
Jason Wessel5d5314d2010-05-20 21:04:20 -05002564 kdb_printf("cpu %ld is not online\n", whichcpu);
2565 return KDB_BADCPUNUM;
2566 }
2567 }
2568
2569 /* Most architectures use __per_cpu_offset[cpu], some use
2570 * __per_cpu_offset(cpu), smp has no __per_cpu_offset.
2571 */
2572#ifdef __per_cpu_offset
2573#define KDB_PCU(cpu) __per_cpu_offset(cpu)
2574#else
2575#ifdef CONFIG_SMP
2576#define KDB_PCU(cpu) __per_cpu_offset[cpu]
2577#else
2578#define KDB_PCU(cpu) 0
2579#endif
2580#endif
Jason Wessel5d5314d2010-05-20 21:04:20 -05002581 for_each_online_cpu(cpu) {
Jason Wessel931ea242010-10-29 08:04:16 -05002582 if (KDB_FLAG(CMD_INTERRUPT))
2583 return 0;
2584
Jason Wessel5d5314d2010-05-20 21:04:20 -05002585 if (whichcpu != ~0UL && whichcpu != cpu)
2586 continue;
Jason Wessel931ea242010-10-29 08:04:16 -05002587 addr = symaddr + KDB_PCU(cpu);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002588 diag = kdb_getword(&val, addr, bytesperword);
2589 if (diag) {
2590 kdb_printf("%5d " kdb_bfd_vma_fmt0 " - unable to "
2591 "read, diag=%d\n", cpu, addr, diag);
2592 continue;
2593 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05002594 kdb_printf("%5d ", cpu);
2595 kdb_md_line(fmtstr, addr,
2596 bytesperword == KDB_WORD_SIZE,
2597 1, bytesperword, 1, 1, 0);
2598 }
Jason Wessel5d5314d2010-05-20 21:04:20 -05002599#undef KDB_PCU
Jason Wessel5d5314d2010-05-20 21:04:20 -05002600 return 0;
2601}
2602
2603/*
2604 * display help for the use of cmd | grep pattern
2605 */
2606static int kdb_grep_help(int argc, const char **argv)
2607{
2608 kdb_printf("Usage of cmd args | grep pattern:\n");
2609 kdb_printf(" Any command's output may be filtered through an ");
2610 kdb_printf("emulated 'pipe'.\n");
2611 kdb_printf(" 'grep' is just a key word.\n");
2612 kdb_printf(" The pattern may include a very limited set of "
2613 "metacharacters:\n");
2614 kdb_printf(" pattern or ^pattern or pattern$ or ^pattern$\n");
2615 kdb_printf(" And if there are spaces in the pattern, you may "
2616 "quote it:\n");
2617 kdb_printf(" \"pat tern\" or \"^pat tern\" or \"pat tern$\""
2618 " or \"^pat tern$\"\n");
2619 return 0;
2620}
2621
Sumit Gargc25abcd2021-07-12 19:16:18 +05302622/**
2623 * kdb_register() - This function is used to register a kernel debugger
2624 * command.
2625 * @cmd: pointer to kdb command
2626 *
2627 * Note that it's the job of the caller to keep the memory for the cmd
2628 * allocated until unregister is called.
Jason Wessel5d5314d2010-05-20 21:04:20 -05002629 */
Sumit Gargc25abcd2021-07-12 19:16:18 +05302630int kdb_register(kdbtab_t *cmd)
Jason Wessel5d5314d2010-05-20 21:04:20 -05002631{
Jason Wessel5d5314d2010-05-20 21:04:20 -05002632 kdbtab_t *kp;
2633
Sumit Garge4f291b2021-02-24 12:38:27 +05302634 list_for_each_entry(kp, &kdb_cmds_head, list_node) {
Sumit Garge868f0a2021-07-12 19:16:20 +05302635 if (strcmp(kp->name, cmd->name) == 0) {
Sumit Gargc25abcd2021-07-12 19:16:18 +05302636 kdb_printf("Duplicate kdb cmd: %s, func %p help %s\n",
Sumit Garge868f0a2021-07-12 19:16:20 +05302637 cmd->name, cmd->func, cmd->help);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002638 return 1;
2639 }
2640 }
2641
Sumit Gargc25abcd2021-07-12 19:16:18 +05302642 list_add_tail(&cmd->list_node, &kdb_cmds_head);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002643 return 0;
2644}
Sumit Gargc25abcd2021-07-12 19:16:18 +05302645EXPORT_SYMBOL_GPL(kdb_register);
Jason Wesself7030bb2010-10-11 10:20:14 -05002646
Sumit Gargc25abcd2021-07-12 19:16:18 +05302647/**
Sumit Garge4f291b2021-02-24 12:38:27 +05302648 * kdb_register_table() - This function is used to register a kdb command
2649 * table.
2650 * @kp: pointer to kdb command table
2651 * @len: length of kdb command table
2652 */
2653void kdb_register_table(kdbtab_t *kp, size_t len)
2654{
2655 while (len--) {
2656 list_add_tail(&kp->list_node, &kdb_cmds_head);
2657 kp++;
2658 }
2659}
Jason Wessel5d5314d2010-05-20 21:04:20 -05002660
Sumit Gargc25abcd2021-07-12 19:16:18 +05302661/**
2662 * kdb_unregister() - This function is used to unregister a kernel debugger
2663 * command. It is generally called when a module which
2664 * implements kdb command is unloaded.
2665 * @cmd: pointer to kdb command
Jason Wessel5d5314d2010-05-20 21:04:20 -05002666 */
Sumit Gargc25abcd2021-07-12 19:16:18 +05302667void kdb_unregister(kdbtab_t *cmd)
Jason Wessel5d5314d2010-05-20 21:04:20 -05002668{
Sumit Gargc25abcd2021-07-12 19:16:18 +05302669 list_del(&cmd->list_node);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002670}
Jason Wesself7030bb2010-10-11 10:20:14 -05002671EXPORT_SYMBOL_GPL(kdb_unregister);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002672
Sumit Garge4f291b2021-02-24 12:38:27 +05302673static kdbtab_t maintab[] = {
Sumit Garge868f0a2021-07-12 19:16:20 +05302674 { .name = "md",
2675 .func = kdb_md,
2676 .usage = "<vaddr>",
2677 .help = "Display Memory Contents, also mdWcN, e.g. md8c1",
2678 .minlen = 1,
2679 .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302680 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302681 { .name = "mdr",
2682 .func = kdb_md,
2683 .usage = "<vaddr> <bytes>",
2684 .help = "Display Raw Memory",
2685 .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302686 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302687 { .name = "mdp",
2688 .func = kdb_md,
2689 .usage = "<paddr> <bytes>",
2690 .help = "Display Physical Memory",
2691 .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302692 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302693 { .name = "mds",
2694 .func = kdb_md,
2695 .usage = "<vaddr>",
2696 .help = "Display Memory Symbolically",
2697 .flags = KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302698 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302699 { .name = "mm",
2700 .func = kdb_mm,
2701 .usage = "<vaddr> <contents>",
2702 .help = "Modify Memory Contents",
2703 .flags = KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302704 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302705 { .name = "go",
2706 .func = kdb_go,
2707 .usage = "[<vaddr>]",
2708 .help = "Continue Execution",
2709 .minlen = 1,
2710 .flags = KDB_ENABLE_REG_WRITE |
Sumit Garge4f291b2021-02-24 12:38:27 +05302711 KDB_ENABLE_ALWAYS_SAFE_NO_ARGS,
2712 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302713 { .name = "rd",
2714 .func = kdb_rd,
2715 .usage = "",
2716 .help = "Display Registers",
2717 .flags = KDB_ENABLE_REG_READ,
Sumit Garge4f291b2021-02-24 12:38:27 +05302718 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302719 { .name = "rm",
2720 .func = kdb_rm,
2721 .usage = "<reg> <contents>",
2722 .help = "Modify Registers",
2723 .flags = KDB_ENABLE_REG_WRITE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302724 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302725 { .name = "ef",
2726 .func = kdb_ef,
2727 .usage = "<vaddr>",
2728 .help = "Display exception frame",
2729 .flags = KDB_ENABLE_MEM_READ,
Sumit Garge4f291b2021-02-24 12:38:27 +05302730 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302731 { .name = "bt",
2732 .func = kdb_bt,
2733 .usage = "[<vaddr>]",
2734 .help = "Stack traceback",
2735 .minlen = 1,
2736 .flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302737 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302738 { .name = "btp",
2739 .func = kdb_bt,
2740 .usage = "<pid>",
2741 .help = "Display stack for process <pid>",
2742 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302743 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302744 { .name = "bta",
2745 .func = kdb_bt,
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002746 .usage = "[<state_chars>|A]",
2747 .help = "Backtrace all processes whose state matches",
Sumit Garge868f0a2021-07-12 19:16:20 +05302748 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302749 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302750 { .name = "btc",
2751 .func = kdb_bt,
2752 .usage = "",
2753 .help = "Backtrace current process on each cpu",
2754 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302755 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302756 { .name = "btt",
2757 .func = kdb_bt,
2758 .usage = "<vaddr>",
2759 .help = "Backtrace process given its struct task address",
2760 .flags = KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302761 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302762 { .name = "env",
2763 .func = kdb_env,
2764 .usage = "",
2765 .help = "Show environment variables",
2766 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302767 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302768 { .name = "set",
2769 .func = kdb_set,
2770 .usage = "",
2771 .help = "Set environment variables",
2772 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302773 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302774 { .name = "help",
2775 .func = kdb_help,
2776 .usage = "",
2777 .help = "Display Help Message",
2778 .minlen = 1,
2779 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302780 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302781 { .name = "?",
2782 .func = kdb_help,
2783 .usage = "",
2784 .help = "Display Help Message",
2785 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302786 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302787 { .name = "cpu",
2788 .func = kdb_cpu,
2789 .usage = "<cpunum>",
2790 .help = "Switch to new cpu",
2791 .flags = KDB_ENABLE_ALWAYS_SAFE_NO_ARGS,
Sumit Garge4f291b2021-02-24 12:38:27 +05302792 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302793 { .name = "kgdb",
2794 .func = kdb_kgdb,
2795 .usage = "",
2796 .help = "Enter kgdb mode",
2797 .flags = 0,
Sumit Garge4f291b2021-02-24 12:38:27 +05302798 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302799 { .name = "ps",
2800 .func = kdb_ps,
Daniel Thompsonb77dbc82021-11-02 17:31:58 +00002801 .usage = "[<state_chars>|A]",
Sumit Garge868f0a2021-07-12 19:16:20 +05302802 .help = "Display active task list",
2803 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302804 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302805 { .name = "pid",
2806 .func = kdb_pid,
2807 .usage = "<pidnum>",
2808 .help = "Switch to another task",
2809 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302810 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302811 { .name = "reboot",
2812 .func = kdb_reboot,
2813 .usage = "",
2814 .help = "Reboot the machine immediately",
2815 .flags = KDB_ENABLE_REBOOT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302816 },
2817#if defined(CONFIG_MODULES)
Sumit Garge868f0a2021-07-12 19:16:20 +05302818 { .name = "lsmod",
2819 .func = kdb_lsmod,
2820 .usage = "",
2821 .help = "List loaded kernel modules",
2822 .flags = KDB_ENABLE_INSPECT,
Sumit Garge4f291b2021-02-24 12:38:27 +05302823 },
2824#endif
2825#if defined(CONFIG_MAGIC_SYSRQ)
Sumit Garge868f0a2021-07-12 19:16:20 +05302826 { .name = "sr",
2827 .func = kdb_sr,
2828 .usage = "<key>",
2829 .help = "Magic SysRq key",
2830 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302831 },
2832#endif
2833#if defined(CONFIG_PRINTK)
Sumit Garge868f0a2021-07-12 19:16:20 +05302834 { .name = "dmesg",
2835 .func = kdb_dmesg,
2836 .usage = "[lines]",
2837 .help = "Display syslog buffer",
2838 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302839 },
2840#endif
Sumit Garge868f0a2021-07-12 19:16:20 +05302841 { .name = "defcmd",
2842 .func = kdb_defcmd,
2843 .usage = "name \"usage\" \"help\"",
2844 .help = "Define a set of commands, down to endefcmd",
Sumit Gargc25abcd2021-07-12 19:16:18 +05302845 /*
2846 * Macros are always safe because when executed each
2847 * internal command re-enters kdb_parse() and is safety
2848 * checked individually.
2849 */
Sumit Garge868f0a2021-07-12 19:16:20 +05302850 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302851 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302852 { .name = "kill",
2853 .func = kdb_kill,
2854 .usage = "<-signal> <pid>",
2855 .help = "Send a signal to a process",
2856 .flags = KDB_ENABLE_SIGNAL,
Sumit Garge4f291b2021-02-24 12:38:27 +05302857 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302858 { .name = "summary",
2859 .func = kdb_summary,
2860 .usage = "",
2861 .help = "Summarize the system",
2862 .minlen = 4,
2863 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302864 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302865 { .name = "per_cpu",
2866 .func = kdb_per_cpu,
2867 .usage = "<sym> [<bytes>] [<cpu>]",
2868 .help = "Display per_cpu variables",
2869 .minlen = 3,
2870 .flags = KDB_ENABLE_MEM_READ,
Sumit Garge4f291b2021-02-24 12:38:27 +05302871 },
Sumit Garge868f0a2021-07-12 19:16:20 +05302872 { .name = "grephelp",
2873 .func = kdb_grep_help,
2874 .usage = "",
2875 .help = "Display help on | grep",
2876 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302877 },
2878};
2879
2880static kdbtab_t nmicmd = {
Sumit Garge868f0a2021-07-12 19:16:20 +05302881 .name = "disable_nmi",
2882 .func = kdb_disable_nmi,
2883 .usage = "",
2884 .help = "Disable NMI entry to KDB",
2885 .flags = KDB_ENABLE_ALWAYS_SAFE,
Sumit Garge4f291b2021-02-24 12:38:27 +05302886};
2887
Jason Wessel5d5314d2010-05-20 21:04:20 -05002888/* Initialize the kdb command table. */
2889static void __init kdb_inittab(void)
2890{
Sumit Garge4f291b2021-02-24 12:38:27 +05302891 kdb_register_table(maintab, ARRAY_SIZE(maintab));
2892 if (arch_kgdb_ops.enable_nmi)
2893 kdb_register_table(&nmicmd, 1);
Jason Wessel5d5314d2010-05-20 21:04:20 -05002894}
2895
2896/* Execute any commands defined in kdb_cmds. */
2897static void __init kdb_cmd_init(void)
2898{
2899 int i, diag;
2900 for (i = 0; kdb_cmds[i]; ++i) {
2901 diag = kdb_parse(kdb_cmds[i]);
2902 if (diag)
2903 kdb_printf("kdb command %s failed, kdb diag %d\n",
2904 kdb_cmds[i], diag);
2905 }
2906 if (defcmd_in_progress) {
2907 kdb_printf("Incomplete 'defcmd' set, forcing endefcmd\n");
2908 kdb_parse("endefcmd");
2909 }
2910}
2911
Uwe Kleine-Königb5950762010-11-01 15:38:34 -04002912/* Initialize kdb_printf, breakpoint tables and kdb state */
Jason Wessel5d5314d2010-05-20 21:04:20 -05002913void __init kdb_init(int lvl)
2914{
2915 static int kdb_init_lvl = KDB_NOT_INITIALIZED;
2916 int i;
2917
2918 if (kdb_init_lvl == KDB_INIT_FULL || lvl <= kdb_init_lvl)
2919 return;
2920 for (i = kdb_init_lvl; i < lvl; i++) {
2921 switch (i) {
2922 case KDB_NOT_INITIALIZED:
2923 kdb_inittab(); /* Initialize Command Table */
2924 kdb_initbptab(); /* Initialize Breakpoints */
2925 break;
2926 case KDB_INIT_EARLY:
2927 kdb_cmd_init(); /* Build kdb_cmds tables */
2928 break;
2929 }
2930 }
2931 kdb_init_lvl = lvl;
2932}