diff options
Diffstat (limited to 'kernel/debug')
-rw-r--r-- | kernel/debug/kdb/kdb_bp.c | 21 | ||||
-rw-r--r-- | kernel/debug/kdb/kdb_main.c | 120 |
2 files changed, 101 insertions, 40 deletions
diff --git a/kernel/debug/kdb/kdb_bp.c b/kernel/debug/kdb/kdb_bp.c index f8844fb55311..e1dbf4a2c69e 100644 --- a/kernel/debug/kdb/kdb_bp.c +++ b/kernel/debug/kdb/kdb_bp.c | |||
@@ -532,21 +532,28 @@ void __init kdb_initbptab(void) | |||
532 | bp->bp_free = 1; | 532 | bp->bp_free = 1; |
533 | 533 | ||
534 | kdb_register_flags("bp", kdb_bp, "[<vaddr>]", | 534 | kdb_register_flags("bp", kdb_bp, "[<vaddr>]", |
535 | "Set/Display breakpoints", 0, KDB_REPEAT_NO_ARGS); | 535 | "Set/Display breakpoints", 0, |
536 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
536 | kdb_register_flags("bl", kdb_bp, "[<vaddr>]", | 537 | kdb_register_flags("bl", kdb_bp, "[<vaddr>]", |
537 | "Display breakpoints", 0, KDB_REPEAT_NO_ARGS); | 538 | "Display breakpoints", 0, |
539 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
538 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) | 540 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) |
539 | kdb_register_flags("bph", kdb_bp, "[<vaddr>]", | 541 | kdb_register_flags("bph", kdb_bp, "[<vaddr>]", |
540 | "[datar [length]|dataw [length]] Set hw brk", 0, KDB_REPEAT_NO_ARGS); | 542 | "[datar [length]|dataw [length]] Set hw brk", 0, |
543 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
541 | kdb_register_flags("bc", kdb_bc, "<bpnum>", | 544 | kdb_register_flags("bc", kdb_bc, "<bpnum>", |
542 | "Clear Breakpoint", 0, 0); | 545 | "Clear Breakpoint", 0, |
546 | KDB_ENABLE_FLOW_CTRL); | ||
543 | kdb_register_flags("be", kdb_bc, "<bpnum>", | 547 | kdb_register_flags("be", kdb_bc, "<bpnum>", |
544 | "Enable Breakpoint", 0, 0); | 548 | "Enable Breakpoint", 0, |
549 | KDB_ENABLE_FLOW_CTRL); | ||
545 | kdb_register_flags("bd", kdb_bc, "<bpnum>", | 550 | kdb_register_flags("bd", kdb_bc, "<bpnum>", |
546 | "Disable Breakpoint", 0, 0); | 551 | "Disable Breakpoint", 0, |
552 | KDB_ENABLE_FLOW_CTRL); | ||
547 | 553 | ||
548 | kdb_register_flags("ss", kdb_ss, "", | 554 | kdb_register_flags("ss", kdb_ss, "", |
549 | "Single Step", 1, KDB_REPEAT_NO_ARGS); | 555 | "Single Step", 1, |
556 | KDB_ENABLE_FLOW_CTRL | KDB_REPEAT_NO_ARGS); | ||
550 | /* | 557 | /* |
551 | * Architecture dependent initialization. | 558 | * Architecture dependent initialization. |
552 | */ | 559 | */ |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index 538bf1dce26a..fae1fc3962f8 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
@@ -188,6 +188,26 @@ struct task_struct *kdb_curr_task(int cpu) | |||
188 | } | 188 | } |
189 | 189 | ||
190 | /* | 190 | /* |
191 | * Check whether the flags of the current command and the permissions | ||
192 | * of the kdb console has allow a command to be run. | ||
193 | */ | ||
194 | static inline bool kdb_check_flags(kdb_cmdflags_t flags, int permissions, | ||
195 | bool no_args) | ||
196 | { | ||
197 | /* permissions comes from userspace so needs massaging slightly */ | ||
198 | permissions &= KDB_ENABLE_MASK; | ||
199 | permissions |= KDB_ENABLE_ALWAYS_SAFE; | ||
200 | |||
201 | /* some commands change group when launched with no arguments */ | ||
202 | if (no_args) | ||
203 | permissions |= permissions << KDB_ENABLE_NO_ARGS_SHIFT; | ||
204 | |||
205 | flags |= KDB_ENABLE_ALL; | ||
206 | |||
207 | return permissions & flags; | ||
208 | } | ||
209 | |||
210 | /* | ||
191 | * kdbgetenv - This function will return the character string value of | 211 | * kdbgetenv - This function will return the character string value of |
192 | * an environment variable. | 212 | * an environment variable. |
193 | * Parameters: | 213 | * Parameters: |
@@ -641,8 +661,13 @@ static int kdb_defcmd2(const char *cmdstr, const char *argv0) | |||
641 | if (!s->count) | 661 | if (!s->count) |
642 | s->usable = 0; | 662 | s->usable = 0; |
643 | if (s->usable) | 663 | if (s->usable) |
644 | kdb_register(s->name, kdb_exec_defcmd, | 664 | /* macros are always safe because when executed each |
645 | s->usage, s->help, 0); | 665 | * internal command re-enters kdb_parse() and is |
666 | * safety checked individually. | ||
667 | */ | ||
668 | kdb_register_flags(s->name, kdb_exec_defcmd, s->usage, | ||
669 | s->help, 0, | ||
670 | KDB_ENABLE_ALWAYS_SAFE); | ||
646 | return 0; | 671 | return 0; |
647 | } | 672 | } |
648 | if (!s->usable) | 673 | if (!s->usable) |
@@ -2757,78 +2782,107 @@ static void __init kdb_inittab(void) | |||
2757 | 2782 | ||
2758 | kdb_register_flags("md", kdb_md, "<vaddr>", | 2783 | kdb_register_flags("md", kdb_md, "<vaddr>", |
2759 | "Display Memory Contents, also mdWcN, e.g. md8c1", 1, | 2784 | "Display Memory Contents, also mdWcN, e.g. md8c1", 1, |
2760 | KDB_REPEAT_NO_ARGS); | 2785 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); |
2761 | kdb_register_flags("mdr", kdb_md, "<vaddr> <bytes>", | 2786 | kdb_register_flags("mdr", kdb_md, "<vaddr> <bytes>", |
2762 | "Display Raw Memory", 0, KDB_REPEAT_NO_ARGS); | 2787 | "Display Raw Memory", 0, |
2788 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); | ||
2763 | kdb_register_flags("mdp", kdb_md, "<paddr> <bytes>", | 2789 | kdb_register_flags("mdp", kdb_md, "<paddr> <bytes>", |
2764 | "Display Physical Memory", 0, KDB_REPEAT_NO_ARGS); | 2790 | "Display Physical Memory", 0, |
2791 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); | ||
2765 | kdb_register_flags("mds", kdb_md, "<vaddr>", | 2792 | kdb_register_flags("mds", kdb_md, "<vaddr>", |
2766 | "Display Memory Symbolically", 0, KDB_REPEAT_NO_ARGS); | 2793 | "Display Memory Symbolically", 0, |
2794 | KDB_ENABLE_MEM_READ | KDB_REPEAT_NO_ARGS); | ||
2767 | kdb_register_flags("mm", kdb_mm, "<vaddr> <contents>", | 2795 | kdb_register_flags("mm", kdb_mm, "<vaddr> <contents>", |
2768 | "Modify Memory Contents", 0, KDB_REPEAT_NO_ARGS); | 2796 | "Modify Memory Contents", 0, |
2797 | KDB_ENABLE_MEM_WRITE | KDB_REPEAT_NO_ARGS); | ||
2769 | kdb_register_flags("go", kdb_go, "[<vaddr>]", | 2798 | kdb_register_flags("go", kdb_go, "[<vaddr>]", |
2770 | "Continue Execution", 1, 0); | 2799 | "Continue Execution", 1, |
2800 | KDB_ENABLE_REG_WRITE | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS); | ||
2771 | kdb_register_flags("rd", kdb_rd, "", | 2801 | kdb_register_flags("rd", kdb_rd, "", |
2772 | "Display Registers", 0, 0); | 2802 | "Display Registers", 0, |
2803 | KDB_ENABLE_REG_READ); | ||
2773 | kdb_register_flags("rm", kdb_rm, "<reg> <contents>", | 2804 | kdb_register_flags("rm", kdb_rm, "<reg> <contents>", |
2774 | "Modify Registers", 0, 0); | 2805 | "Modify Registers", 0, |
2806 | KDB_ENABLE_REG_WRITE); | ||
2775 | kdb_register_flags("ef", kdb_ef, "<vaddr>", | 2807 | kdb_register_flags("ef", kdb_ef, "<vaddr>", |
2776 | "Display exception frame", 0, 0); | 2808 | "Display exception frame", 0, |
2809 | KDB_ENABLE_MEM_READ); | ||
2777 | kdb_register_flags("bt", kdb_bt, "[<vaddr>]", | 2810 | kdb_register_flags("bt", kdb_bt, "[<vaddr>]", |
2778 | "Stack traceback", 1, 0); | 2811 | "Stack traceback", 1, |
2812 | KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS); | ||
2779 | kdb_register_flags("btp", kdb_bt, "<pid>", | 2813 | kdb_register_flags("btp", kdb_bt, "<pid>", |
2780 | "Display stack for process <pid>", 0, 0); | 2814 | "Display stack for process <pid>", 0, |
2815 | KDB_ENABLE_INSPECT); | ||
2781 | kdb_register_flags("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]", | 2816 | kdb_register_flags("bta", kdb_bt, "[D|R|S|T|C|Z|E|U|I|M|A]", |
2782 | "Backtrace all processes matching state flag", 0, 0); | 2817 | "Backtrace all processes matching state flag", 0, |
2818 | KDB_ENABLE_INSPECT); | ||
2783 | kdb_register_flags("btc", kdb_bt, "", | 2819 | kdb_register_flags("btc", kdb_bt, "", |
2784 | "Backtrace current process on each cpu", 0, 0); | 2820 | "Backtrace current process on each cpu", 0, |
2821 | KDB_ENABLE_INSPECT); | ||
2785 | kdb_register_flags("btt", kdb_bt, "<vaddr>", | 2822 | kdb_register_flags("btt", kdb_bt, "<vaddr>", |
2786 | "Backtrace process given its struct task address", 0, | 2823 | "Backtrace process given its struct task address", 0, |
2787 | 0); | 2824 | KDB_ENABLE_MEM_READ | KDB_ENABLE_INSPECT_NO_ARGS); |
2788 | kdb_register_flags("env", kdb_env, "", | 2825 | kdb_register_flags("env", kdb_env, "", |
2789 | "Show environment variables", 0, 0); | 2826 | "Show environment variables", 0, |
2827 | KDB_ENABLE_ALWAYS_SAFE); | ||
2790 | kdb_register_flags("set", kdb_set, "", | 2828 | kdb_register_flags("set", kdb_set, "", |
2791 | "Set environment variables", 0, 0); | 2829 | "Set environment variables", 0, |
2830 | KDB_ENABLE_ALWAYS_SAFE); | ||
2792 | kdb_register_flags("help", kdb_help, "", | 2831 | kdb_register_flags("help", kdb_help, "", |
2793 | "Display Help Message", 1, 0); | 2832 | "Display Help Message", 1, |
2833 | KDB_ENABLE_ALWAYS_SAFE); | ||
2794 | kdb_register_flags("?", kdb_help, "", | 2834 | kdb_register_flags("?", kdb_help, "", |
2795 | "Display Help Message", 0, 0); | 2835 | "Display Help Message", 0, |
2836 | KDB_ENABLE_ALWAYS_SAFE); | ||
2796 | kdb_register_flags("cpu", kdb_cpu, "<cpunum>", | 2837 | kdb_register_flags("cpu", kdb_cpu, "<cpunum>", |
2797 | "Switch to new cpu", 0, 0); | 2838 | "Switch to new cpu", 0, |
2839 | KDB_ENABLE_ALWAYS_SAFE_NO_ARGS); | ||
2798 | kdb_register_flags("kgdb", kdb_kgdb, "", | 2840 | kdb_register_flags("kgdb", kdb_kgdb, "", |
2799 | "Enter kgdb mode", 0, 0); | 2841 | "Enter kgdb mode", 0, 0); |
2800 | kdb_register_flags("ps", kdb_ps, "[<flags>|A]", | 2842 | kdb_register_flags("ps", kdb_ps, "[<flags>|A]", |
2801 | "Display active task list", 0, 0); | 2843 | "Display active task list", 0, |
2844 | KDB_ENABLE_INSPECT); | ||
2802 | kdb_register_flags("pid", kdb_pid, "<pidnum>", | 2845 | kdb_register_flags("pid", kdb_pid, "<pidnum>", |
2803 | "Switch to another task", 0, 0); | 2846 | "Switch to another task", 0, |
2847 | KDB_ENABLE_INSPECT); | ||
2804 | kdb_register_flags("reboot", kdb_reboot, "", | 2848 | kdb_register_flags("reboot", kdb_reboot, "", |
2805 | "Reboot the machine immediately", 0, 0); | 2849 | "Reboot the machine immediately", 0, |
2850 | KDB_ENABLE_REBOOT); | ||
2806 | #if defined(CONFIG_MODULES) | 2851 | #if defined(CONFIG_MODULES) |
2807 | kdb_register_flags("lsmod", kdb_lsmod, "", | 2852 | kdb_register_flags("lsmod", kdb_lsmod, "", |
2808 | "List loaded kernel modules", 0, 0); | 2853 | "List loaded kernel modules", 0, |
2854 | KDB_ENABLE_INSPECT); | ||
2809 | #endif | 2855 | #endif |
2810 | #if defined(CONFIG_MAGIC_SYSRQ) | 2856 | #if defined(CONFIG_MAGIC_SYSRQ) |
2811 | kdb_register_flags("sr", kdb_sr, "<key>", | 2857 | kdb_register_flags("sr", kdb_sr, "<key>", |
2812 | "Magic SysRq key", 0, 0); | 2858 | "Magic SysRq key", 0, |
2859 | KDB_ENABLE_ALWAYS_SAFE); | ||
2813 | #endif | 2860 | #endif |
2814 | #if defined(CONFIG_PRINTK) | 2861 | #if defined(CONFIG_PRINTK) |
2815 | kdb_register_flags("dmesg", kdb_dmesg, "[lines]", | 2862 | kdb_register_flags("dmesg", kdb_dmesg, "[lines]", |
2816 | "Display syslog buffer", 0, 0); | 2863 | "Display syslog buffer", 0, |
2864 | KDB_ENABLE_ALWAYS_SAFE); | ||
2817 | #endif | 2865 | #endif |
2818 | if (arch_kgdb_ops.enable_nmi) { | 2866 | if (arch_kgdb_ops.enable_nmi) { |
2819 | kdb_register_flags("disable_nmi", kdb_disable_nmi, "", | 2867 | kdb_register_flags("disable_nmi", kdb_disable_nmi, "", |
2820 | "Disable NMI entry to KDB", 0, 0); | 2868 | "Disable NMI entry to KDB", 0, |
2869 | KDB_ENABLE_ALWAYS_SAFE); | ||
2821 | } | 2870 | } |
2822 | kdb_register_flags("defcmd", kdb_defcmd, "name \"usage\" \"help\"", | 2871 | kdb_register_flags("defcmd", kdb_defcmd, "name \"usage\" \"help\"", |
2823 | "Define a set of commands, down to endefcmd", 0, 0); | 2872 | "Define a set of commands, down to endefcmd", 0, |
2873 | KDB_ENABLE_ALWAYS_SAFE); | ||
2824 | kdb_register_flags("kill", kdb_kill, "<-signal> <pid>", | 2874 | kdb_register_flags("kill", kdb_kill, "<-signal> <pid>", |
2825 | "Send a signal to a process", 0, 0); | 2875 | "Send a signal to a process", 0, |
2876 | KDB_ENABLE_SIGNAL); | ||
2826 | kdb_register_flags("summary", kdb_summary, "", | 2877 | kdb_register_flags("summary", kdb_summary, "", |
2827 | "Summarize the system", 4, 0); | 2878 | "Summarize the system", 4, |
2879 | KDB_ENABLE_ALWAYS_SAFE); | ||
2828 | kdb_register_flags("per_cpu", kdb_per_cpu, "<sym> [<bytes>] [<cpu>]", | 2880 | kdb_register_flags("per_cpu", kdb_per_cpu, "<sym> [<bytes>] [<cpu>]", |
2829 | "Display per_cpu variables", 3, 0); | 2881 | "Display per_cpu variables", 3, |
2882 | KDB_ENABLE_MEM_READ); | ||
2830 | kdb_register_flags("grephelp", kdb_grep_help, "", | 2883 | kdb_register_flags("grephelp", kdb_grep_help, "", |
2831 | "Display help on | grep", 0, 0); | 2884 | "Display help on | grep", 0, |
2885 | KDB_ENABLE_ALWAYS_SAFE); | ||
2832 | } | 2886 | } |
2833 | 2887 | ||
2834 | /* Execute any commands defined in kdb_cmds. */ | 2888 | /* Execute any commands defined in kdb_cmds. */ |