Commit 996fe061 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'kgdb-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux

Pull kgdb updates from Daniel Thompson:
 "Changes for kgdb/kdb this cycle are dominated by a change from Sumit
  that removes as small (256K) private heap from kdb. This is change
  I've hoped for ever since I discovered how few users of this heap
  remained in the kernel, so many thanks to Sumit for hunting these
  down.

  The other change is an incremental step towards SPDX headers"

* tag 'kgdb-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux:
  kernel: debug: Convert to SPDX identifier
  kdb: Rename members of struct kdbtab_t
  kdb: Simplify kdb_defcmd macro logic
  kdb: Get rid of redundant kdb_register_flags()
  kdb: Rename struct defcmd_set to struct kdb_macro
  kdb: Get rid of custom debug heap allocator
parents 0bcfe68b f8416aa2
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
* Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com> * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com>
*/ */
#include <linux/list.h>
/* Shifted versions of the command enable bits are be used if the command /* Shifted versions of the command enable bits are be used if the command
* has no arguments (see kdb_check_flags). This allows commands, such as * has no arguments (see kdb_check_flags). This allows commands, such as
* go, to have different permissions depending upon whether it is called * go, to have different permissions depending upon whether it is called
...@@ -64,6 +66,17 @@ typedef enum { ...@@ -64,6 +66,17 @@ typedef enum {
typedef int (*kdb_func_t)(int, const char **); typedef int (*kdb_func_t)(int, const char **);
/* The KDB shell command table */
typedef struct _kdbtab {
char *name; /* Command name */
kdb_func_t func; /* Function to execute command */
char *usage; /* Usage String for this command */
char *help; /* Help message for this command */
short minlen; /* Minimum legal # cmd chars required */
kdb_cmdflags_t flags; /* Command behaviour flags */
struct list_head list_node; /* Command list */
} kdbtab_t;
#ifdef CONFIG_KGDB_KDB #ifdef CONFIG_KGDB_KDB
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h> #include <linux/sched.h>
...@@ -193,19 +206,13 @@ static inline const char *kdb_walk_kallsyms(loff_t *pos) ...@@ -193,19 +206,13 @@ static inline const char *kdb_walk_kallsyms(loff_t *pos)
#endif /* ! CONFIG_KALLSYMS */ #endif /* ! CONFIG_KALLSYMS */
/* Dynamic kdb shell command registration */ /* Dynamic kdb shell command registration */
extern int kdb_register(char *, kdb_func_t, char *, char *, short); extern int kdb_register(kdbtab_t *cmd);
extern int kdb_register_flags(char *, kdb_func_t, char *, char *, extern void kdb_unregister(kdbtab_t *cmd);
short, kdb_cmdflags_t);
extern int kdb_unregister(char *);
#else /* ! CONFIG_KGDB_KDB */ #else /* ! CONFIG_KGDB_KDB */
static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; }
static inline void kdb_init(int level) {} static inline void kdb_init(int level) {}
static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, static inline int kdb_register(kdbtab_t *cmd) { return 0; }
char *help, short minlen) { return 0; } static inline void kdb_unregister(kdbtab_t *cmd) {}
static inline int kdb_register_flags(char *cmd, kdb_func_t func, char *usage,
char *help, short minlen,
kdb_cmdflags_t flags) { return 0; }
static inline int kdb_unregister(char *cmd) { return 0; }
#endif /* CONFIG_KGDB_KDB */ #endif /* CONFIG_KGDB_KDB */
enum { enum {
KDB_NOT_INITIALIZED, KDB_NOT_INITIALIZED,
......
// SPDX-License-Identifier: GPL-2.0-only
/* /*
* Kernel Debug Core * Kernel Debug Core
* *
...@@ -22,10 +23,6 @@ ...@@ -22,10 +23,6 @@
* *
* Original KGDB stub: David Grothe <dave@gcom.com>, * Original KGDB stub: David Grothe <dave@gcom.com>,
* Tigran Aivazian <tigran@sco.com> * Tigran Aivazian <tigran@sco.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/ */
#define pr_fmt(fmt) "KGDB: " fmt #define pr_fmt(fmt) "KGDB: " fmt
......
// SPDX-License-Identifier: GPL-2.0-only
/* /*
* Kernel Debug Core * Kernel Debug Core
* *
...@@ -22,10 +23,6 @@ ...@@ -22,10 +23,6 @@
* *
* Original KGDB stub: David Grothe <dave@gcom.com>, * Original KGDB stub: David Grothe <dave@gcom.com>,
* Tigran Aivazian <tigran@sco.com> * Tigran Aivazian <tigran@sco.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -523,51 +523,51 @@ static int kdb_ss(int argc, const char **argv) ...@@ -523,51 +523,51 @@ static int kdb_ss(int argc, const char **argv)
} }
static kdbtab_t bptab[] = { static kdbtab_t bptab[] = {
{ .cmd_name = "bp", { .name = "bp",
.cmd_func = kdb_bp, .func = kdb_bp,
.cmd_usage = "[<vaddr>]", .usage = "[<vaddr>]",
.cmd_help = "Set/Display breakpoints", .help = "Set/Display breakpoints",
.cmd_flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS, .flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS,
}, },
{ .cmd_name = "bl", { .name = "bl",
.cmd_func = kdb_bp, .func = kdb_bp,
.cmd_usage = "[<vaddr>]", .usage = "[<vaddr>]",
.cmd_help = "Display breakpoints", .help = "Display breakpoints",
.cmd_flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS, .flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS,
}, },
{ .cmd_name = "bc", { .name = "bc",
.cmd_func = kdb_bc, .func = kdb_bc,
.cmd_usage = "<bpnum>", .usage = "<bpnum>",
.cmd_help = "Clear Breakpoint", .help = "Clear Breakpoint",
.cmd_flags = KDB_ENABLE_FLOW_CTRL, .flags = KDB_ENABLE_FLOW_CTRL,
}, },
{ .cmd_name = "be", { .name = "be",
.cmd_func = kdb_bc, .func = kdb_bc,
.cmd_usage = "<bpnum>", .usage = "<bpnum>",
.cmd_help = "Enable Breakpoint", .help = "Enable Breakpoint",
.cmd_flags = KDB_ENABLE_FLOW_CTRL, .flags = KDB_ENABLE_FLOW_CTRL,
}, },
{ .cmd_name = "bd", { .name = "bd",
.cmd_func = kdb_bc, .func = kdb_bc,
.cmd_usage = "<bpnum>", .usage = "<bpnum>",
.cmd_help = "Disable Breakpoint", .help = "Disable Breakpoint",
.cmd_flags = KDB_ENABLE_FLOW_CTRL, .flags = KDB_ENABLE_FLOW_CTRL,
}, },
{ .cmd_name = "ss", { .name = "ss",
.cmd_func = kdb_ss, .func = kdb_ss,
.cmd_usage = "", .usage = "",
.cmd_help = "Single Step", .help = "Single Step",
.cmd_minlen = 1, .minlen = 1,
.cmd_flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS, .flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS,
}, },
}; };
static kdbtab_t bphcmd = { static kdbtab_t bphcmd = {
.cmd_name = "bph", .name = "bph",
.cmd_func = kdb_bp, .func = kdb_bp,
.cmd_usage = "[<vaddr>]", .usage = "[<vaddr>]",
.cmd_help = "[datar [length]|dataw [length]] Set hw brk", .help = "[datar [length]|dataw [length]] Set hw brk",
.cmd_flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS, .flags = KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS,
}; };
/* Initialize the breakpoint table and register breakpoint commands. */ /* Initialize the breakpoint table and register breakpoint commands. */
......
...@@ -140,7 +140,6 @@ int kdb_stub(struct kgdb_state *ks) ...@@ -140,7 +140,6 @@ int kdb_stub(struct kgdb_state *ks)
*/ */
kdb_common_deinit_state(); kdb_common_deinit_state();
KDB_STATE_CLEAR(PAGER); KDB_STATE_CLEAR(PAGER);
kdbnearsym_cleanup();
if (error == KDB_CMD_KGDB) { if (error == KDB_CMD_KGDB) {
if (KDB_STATE(DOING_KGDB)) if (KDB_STATE(DOING_KGDB))
KDB_STATE_CLEAR(DOING_KGDB); KDB_STATE_CLEAR(DOING_KGDB);
......
This diff is collapsed.
...@@ -109,7 +109,6 @@ extern int kdbgetaddrarg(int, const char **, int*, unsigned long *, ...@@ -109,7 +109,6 @@ extern int kdbgetaddrarg(int, const char **, int*, unsigned long *,
long *, char **); long *, char **);
extern int kdbgetsymval(const char *, kdb_symtab_t *); extern int kdbgetsymval(const char *, kdb_symtab_t *);
extern int kdbnearsym(unsigned long, kdb_symtab_t *); extern int kdbnearsym(unsigned long, kdb_symtab_t *);
extern void kdbnearsym_cleanup(void);
extern char *kdb_strdup(const char *str, gfp_t type); extern char *kdb_strdup(const char *str, gfp_t type);
extern void kdb_symbol_print(unsigned long, const kdb_symtab_t *, unsigned int); extern void kdb_symbol_print(unsigned long, const kdb_symtab_t *, unsigned int);
...@@ -165,19 +164,6 @@ typedef struct _kdb_bp { ...@@ -165,19 +164,6 @@ typedef struct _kdb_bp {
#ifdef CONFIG_KGDB_KDB #ifdef CONFIG_KGDB_KDB
extern kdb_bp_t kdb_breakpoints[/* KDB_MAXBPT */]; extern kdb_bp_t kdb_breakpoints[/* KDB_MAXBPT */];
/* The KDB shell command table */
typedef struct _kdbtab {
char *cmd_name; /* Command name */
kdb_func_t cmd_func; /* Function to execute command */
char *cmd_usage; /* Usage String for this command */
char *cmd_help; /* Help message for this command */
short cmd_minlen; /* Minimum legal # command
* chars required */
kdb_cmdflags_t cmd_flags; /* Command behaviour flags */
struct list_head list_node; /* Command list */
bool is_dynamic; /* Command table allocation type */
} kdbtab_t;
extern void kdb_register_table(kdbtab_t *kp, size_t len); extern void kdb_register_table(kdbtab_t *kp, size_t len);
extern int kdb_bt(int, const char **); /* KDB display back trace */ extern int kdb_bt(int, const char **); /* KDB display back trace */
...@@ -233,10 +219,6 @@ extern struct task_struct *kdb_curr_task(int); ...@@ -233,10 +219,6 @@ extern struct task_struct *kdb_curr_task(int);
#define GFP_KDB (in_dbg_master() ? GFP_ATOMIC : GFP_KERNEL) #define GFP_KDB (in_dbg_master() ? GFP_ATOMIC : GFP_KERNEL)
extern void *debug_kmalloc(size_t size, gfp_t flags);
extern void debug_kfree(void *);
extern void debug_kusage(void);
extern struct task_struct *kdb_current_task; extern struct task_struct *kdb_current_task;
extern struct pt_regs *kdb_current_regs; extern struct pt_regs *kdb_current_regs;
......
This diff is collapsed.
...@@ -147,11 +147,17 @@ static int kdb_ftdump(int argc, const char **argv) ...@@ -147,11 +147,17 @@ static int kdb_ftdump(int argc, const char **argv)
return 0; return 0;
} }
static kdbtab_t ftdump_cmd = {
.name = "ftdump",
.func = kdb_ftdump,
.usage = "[skip_#entries] [cpu]",
.help = "Dump ftrace log; -skip dumps last #entries",
.flags = KDB_ENABLE_ALWAYS_SAFE,
};
static __init int kdb_ftrace_register(void) static __init int kdb_ftrace_register(void)
{ {
kdb_register_flags("ftdump", kdb_ftdump, "[skip_#entries] [cpu]", kdb_register(&ftdump_cmd);
"Dump ftrace log; -skip dumps last #entries", 0,
KDB_ENABLE_ALWAYS_SAFE);
return 0; return 0;
} }
......
...@@ -28,28 +28,26 @@ static int kdb_hello_cmd(int argc, const char **argv) ...@@ -28,28 +28,26 @@ static int kdb_hello_cmd(int argc, const char **argv)
return 0; return 0;
} }
static kdbtab_t hello_cmd = {
.name = "hello",
.func = kdb_hello_cmd,
.usage = "[string]",
.help = "Say Hello World or Hello [string]",
};
static int __init kdb_hello_cmd_init(void) static int __init kdb_hello_cmd_init(void)
{ {
/* /*
* Registration of a dynamically added kdb command is done with * Registration of a dynamically added kdb command is done with
* kdb_register() with the arguments being: * kdb_register().
* 1: The name of the shell command
* 2: The function that processes the command
* 3: Description of the usage of any arguments
* 4: Descriptive text when you run help
* 5: Number of characters to complete the command
* 0 == type the whole command
* 1 == match both "g" and "go" for example
*/ */
kdb_register("hello", kdb_hello_cmd, "[string]", kdb_register(&hello_cmd);
"Say Hello World or Hello [string]", 0);
return 0; return 0;
} }
static void __exit kdb_hello_cmd_exit(void) static void __exit kdb_hello_cmd_exit(void)
{ {
kdb_unregister("hello"); kdb_unregister(&hello_cmd);
} }
module_init(kdb_hello_cmd_init); module_init(kdb_hello_cmd_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment