diff options
| author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-10-17 08:32:49 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-10-17 08:32:49 -0400 |
| commit | 214e2ca2b82d335935a861c253fe94c61ad77aad (patch) | |
| tree | eee42ff74d10470789d919b8499737ad0e919360 /kernel/debug | |
| parent | 1fdead8ad31d3aa833bc37739273fcde89ace93c (diff) | |
| parent | ddffeb8c4d0331609ef2581d84de4d763607bd37 (diff) | |
Merge tag 'v3.7-rc1' into staging/for_v3.8
Linux 3.7-rc1
* tag 'v3.7-rc1': (9579 commits)
Linux 3.7-rc1
x86, boot: Explicitly include autoconf.h for hostprogs
perf: Fix UAPI fallout
ARM: config: make sure that platforms are ordered by option string
ARM: config: sort select statements alphanumerically
UAPI: (Scripted) Disintegrate include/linux/byteorder
UAPI: (Scripted) Disintegrate include/linux
UAPI: Unexport linux/blk_types.h
UAPI: Unexport part of linux/ppp-comp.h
perf: Handle new rbtree implementation
procfs: don't need a PATH_MAX allocation to hold a string representation of an int
vfs: embed struct filename inside of names_cache allocation if possible
audit: make audit_inode take struct filename
vfs: make path_openat take a struct filename pointer
vfs: turn do_path_lookup into wrapper around struct filename variant
audit: allow audit code to satisfy getname requests from its names_list
vfs: define struct filename and have getname() return it
btrfs: Fix compilation with user namespace support enabled
userns: Fix posix_acl_file_xattr_userns gid conversion
userns: Properly print bluetooth socket uids
...
Diffstat (limited to 'kernel/debug')
| -rw-r--r-- | kernel/debug/debug_core.c | 32 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_bt.c | 2 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_io.c | 33 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_main.c | 33 |
4 files changed, 92 insertions, 8 deletions
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 0557f24c6bca..9a61738cefc8 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c | |||
| @@ -672,6 +672,10 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) | |||
| 672 | { | 672 | { |
| 673 | struct kgdb_state kgdb_var; | 673 | struct kgdb_state kgdb_var; |
| 674 | struct kgdb_state *ks = &kgdb_var; | 674 | struct kgdb_state *ks = &kgdb_var; |
| 675 | int ret = 0; | ||
| 676 | |||
| 677 | if (arch_kgdb_ops.enable_nmi) | ||
| 678 | arch_kgdb_ops.enable_nmi(0); | ||
| 675 | 679 | ||
| 676 | ks->cpu = raw_smp_processor_id(); | 680 | ks->cpu = raw_smp_processor_id(); |
| 677 | ks->ex_vector = evector; | 681 | ks->ex_vector = evector; |
| @@ -681,13 +685,33 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs) | |||
| 681 | ks->linux_regs = regs; | 685 | ks->linux_regs = regs; |
| 682 | 686 | ||
| 683 | if (kgdb_reenter_check(ks)) | 687 | if (kgdb_reenter_check(ks)) |
| 684 | return 0; /* Ouch, double exception ! */ | 688 | goto out; /* Ouch, double exception ! */ |
| 685 | if (kgdb_info[ks->cpu].enter_kgdb != 0) | 689 | if (kgdb_info[ks->cpu].enter_kgdb != 0) |
| 686 | return 0; | 690 | goto out; |
| 687 | 691 | ||
| 688 | return kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER); | 692 | ret = kgdb_cpu_enter(ks, regs, DCPU_WANT_MASTER); |
| 693 | out: | ||
| 694 | if (arch_kgdb_ops.enable_nmi) | ||
| 695 | arch_kgdb_ops.enable_nmi(1); | ||
| 696 | return ret; | ||
| 689 | } | 697 | } |
| 690 | 698 | ||
| 699 | /* | ||
| 700 | * GDB places a breakpoint at this function to know dynamically | ||
| 701 | * loaded objects. It's not defined static so that only one instance with this | ||
| 702 | * name exists in the kernel. | ||
| 703 | */ | ||
| 704 | |||
| 705 | static int module_event(struct notifier_block *self, unsigned long val, | ||
| 706 | void *data) | ||
| 707 | { | ||
| 708 | return 0; | ||
| 709 | } | ||
| 710 | |||
| 711 | static struct notifier_block dbg_module_load_nb = { | ||
| 712 | .notifier_call = module_event, | ||
| 713 | }; | ||
| 714 | |||
| 691 | int kgdb_nmicallback(int cpu, void *regs) | 715 | int kgdb_nmicallback(int cpu, void *regs) |
| 692 | { | 716 | { |
| 693 | #ifdef CONFIG_SMP | 717 | #ifdef CONFIG_SMP |
| @@ -816,6 +840,7 @@ static void kgdb_register_callbacks(void) | |||
| 816 | kgdb_arch_init(); | 840 | kgdb_arch_init(); |
| 817 | if (!dbg_is_early) | 841 | if (!dbg_is_early) |
| 818 | kgdb_arch_late(); | 842 | kgdb_arch_late(); |
| 843 | register_module_notifier(&dbg_module_load_nb); | ||
| 819 | register_reboot_notifier(&dbg_reboot_notifier); | 844 | register_reboot_notifier(&dbg_reboot_notifier); |
| 820 | atomic_notifier_chain_register(&panic_notifier_list, | 845 | atomic_notifier_chain_register(&panic_notifier_list, |
| 821 | &kgdb_panic_event_nb); | 846 | &kgdb_panic_event_nb); |
| @@ -839,6 +864,7 @@ static void kgdb_unregister_callbacks(void) | |||
| 839 | if (kgdb_io_module_registered) { | 864 | if (kgdb_io_module_registered) { |
| 840 | kgdb_io_module_registered = 0; | 865 | kgdb_io_module_registered = 0; |
| 841 | unregister_reboot_notifier(&dbg_reboot_notifier); | 866 | unregister_reboot_notifier(&dbg_reboot_notifier); |
| 867 | unregister_module_notifier(&dbg_module_load_nb); | ||
| 842 | atomic_notifier_chain_unregister(&panic_notifier_list, | 868 | atomic_notifier_chain_unregister(&panic_notifier_list, |
| 843 | &kgdb_panic_event_nb); | 869 | &kgdb_panic_event_nb); |
| 844 | kgdb_arch_exit(); | 870 | kgdb_arch_exit(); |
diff --git a/kernel/debug/kdb/kdb_bt.c b/kernel/debug/kdb/kdb_bt.c index 07c9bbb94a0b..b03e0e814e43 100644 --- a/kernel/debug/kdb/kdb_bt.c +++ b/kernel/debug/kdb/kdb_bt.c | |||
| @@ -129,6 +129,8 @@ kdb_bt(int argc, const char **argv) | |||
| 129 | } | 129 | } |
| 130 | /* Now the inactive tasks */ | 130 | /* Now the inactive tasks */ |
| 131 | kdb_do_each_thread(g, p) { | 131 | kdb_do_each_thread(g, p) { |
| 132 | if (KDB_FLAG(CMD_INTERRUPT)) | ||
| 133 | return 0; | ||
| 132 | if (task_curr(p)) | 134 | if (task_curr(p)) |
| 133 | continue; | 135 | continue; |
| 134 | if (kdb_bt1(p, mask, argcount, btaprompt)) | 136 | if (kdb_bt1(p, mask, argcount, btaprompt)) |
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 0a69d2adc4f3..14ff4849262c 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c | |||
| @@ -552,6 +552,7 @@ int vkdb_printf(const char *fmt, va_list ap) | |||
| 552 | { | 552 | { |
| 553 | int diag; | 553 | int diag; |
| 554 | int linecount; | 554 | int linecount; |
| 555 | int colcount; | ||
| 555 | int logging, saved_loglevel = 0; | 556 | int logging, saved_loglevel = 0; |
| 556 | int saved_trap_printk; | 557 | int saved_trap_printk; |
| 557 | int got_printf_lock = 0; | 558 | int got_printf_lock = 0; |
| @@ -584,6 +585,10 @@ int vkdb_printf(const char *fmt, va_list ap) | |||
| 584 | if (diag || linecount <= 1) | 585 | if (diag || linecount <= 1) |
| 585 | linecount = 24; | 586 | linecount = 24; |
| 586 | 587 | ||
| 588 | diag = kdbgetintenv("COLUMNS", &colcount); | ||
| 589 | if (diag || colcount <= 1) | ||
| 590 | colcount = 80; | ||
| 591 | |||
| 587 | diag = kdbgetintenv("LOGGING", &logging); | 592 | diag = kdbgetintenv("LOGGING", &logging); |
| 588 | if (diag) | 593 | if (diag) |
| 589 | logging = 0; | 594 | logging = 0; |
| @@ -690,7 +695,7 @@ kdb_printit: | |||
| 690 | gdbstub_msg_write(kdb_buffer, retlen); | 695 | gdbstub_msg_write(kdb_buffer, retlen); |
| 691 | } else { | 696 | } else { |
| 692 | if (dbg_io_ops && !dbg_io_ops->is_console) { | 697 | if (dbg_io_ops && !dbg_io_ops->is_console) { |
| 693 | len = strlen(kdb_buffer); | 698 | len = retlen; |
| 694 | cp = kdb_buffer; | 699 | cp = kdb_buffer; |
| 695 | while (len--) { | 700 | while (len--) { |
| 696 | dbg_io_ops->write_char(*cp); | 701 | dbg_io_ops->write_char(*cp); |
| @@ -709,11 +714,29 @@ kdb_printit: | |||
| 709 | printk(KERN_INFO "%s", kdb_buffer); | 714 | printk(KERN_INFO "%s", kdb_buffer); |
| 710 | } | 715 | } |
| 711 | 716 | ||
| 712 | if (KDB_STATE(PAGER) && strchr(kdb_buffer, '\n')) | 717 | if (KDB_STATE(PAGER)) { |
| 713 | kdb_nextline++; | 718 | /* |
| 719 | * Check printed string to decide how to bump the | ||
| 720 | * kdb_nextline to control when the more prompt should | ||
| 721 | * show up. | ||
| 722 | */ | ||
| 723 | int got = 0; | ||
| 724 | len = retlen; | ||
| 725 | while (len--) { | ||
| 726 | if (kdb_buffer[len] == '\n') { | ||
| 727 | kdb_nextline++; | ||
| 728 | got = 0; | ||
| 729 | } else if (kdb_buffer[len] == '\r') { | ||
| 730 | got = 0; | ||
| 731 | } else { | ||
| 732 | got++; | ||
| 733 | } | ||
| 734 | } | ||
| 735 | kdb_nextline += got / (colcount + 1); | ||
| 736 | } | ||
| 714 | 737 | ||
| 715 | /* check for having reached the LINES number of printed lines */ | 738 | /* check for having reached the LINES number of printed lines */ |
| 716 | if (kdb_nextline == linecount) { | 739 | if (kdb_nextline >= linecount) { |
| 717 | char buf1[16] = ""; | 740 | char buf1[16] = ""; |
| 718 | 741 | ||
| 719 | /* Watch out for recursion here. Any routine that calls | 742 | /* Watch out for recursion here. Any routine that calls |
| @@ -765,7 +788,7 @@ kdb_printit: | |||
| 765 | kdb_grepping_flag = 0; | 788 | kdb_grepping_flag = 0; |
| 766 | kdb_printf("\n"); | 789 | kdb_printf("\n"); |
| 767 | } else if (buf1[0] == ' ') { | 790 | } else if (buf1[0] == ' ') { |
| 768 | kdb_printf("\n"); | 791 | kdb_printf("\r"); |
| 769 | suspend_grep = 1; /* for this recursion */ | 792 | suspend_grep = 1; /* for this recursion */ |
| 770 | } else if (buf1[0] == '\n') { | 793 | } else if (buf1[0] == '\n') { |
| 771 | kdb_nextline = linecount - 1; | 794 | kdb_nextline = linecount - 1; |
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index 31df1706b9a9..4d5f8d5612f3 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/smp.h> | 21 | #include <linux/smp.h> |
| 22 | #include <linux/utsname.h> | 22 | #include <linux/utsname.h> |
| 23 | #include <linux/vmalloc.h> | 23 | #include <linux/vmalloc.h> |
| 24 | #include <linux/atomic.h> | ||
| 24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 25 | #include <linux/mm.h> | 26 | #include <linux/mm.h> |
| 26 | #include <linux/init.h> | 27 | #include <linux/init.h> |
| @@ -2100,6 +2101,8 @@ static int kdb_dmesg(int argc, const char **argv) | |||
| 2100 | } | 2101 | } |
| 2101 | if (!lines--) | 2102 | if (!lines--) |
| 2102 | break; | 2103 | break; |
| 2104 | if (KDB_FLAG(CMD_INTERRUPT)) | ||
| 2105 | return 0; | ||
| 2103 | 2106 | ||
| 2104 | kdb_printf("%.*s\n", (int)len - 1, buf); | 2107 | kdb_printf("%.*s\n", (int)len - 1, buf); |
| 2105 | } | 2108 | } |
| @@ -2107,6 +2110,32 @@ static int kdb_dmesg(int argc, const char **argv) | |||
| 2107 | return 0; | 2110 | return 0; |
| 2108 | } | 2111 | } |
| 2109 | #endif /* CONFIG_PRINTK */ | 2112 | #endif /* CONFIG_PRINTK */ |
| 2113 | |||
| 2114 | /* Make sure we balance enable/disable calls, must disable first. */ | ||
| 2115 | static atomic_t kdb_nmi_disabled; | ||
| 2116 | |||
| 2117 | static int kdb_disable_nmi(int argc, const char *argv[]) | ||
| 2118 | { | ||
| 2119 | if (atomic_read(&kdb_nmi_disabled)) | ||
| 2120 | return 0; | ||
| 2121 | atomic_set(&kdb_nmi_disabled, 1); | ||
| 2122 | arch_kgdb_ops.enable_nmi(0); | ||
| 2123 | return 0; | ||
| 2124 | } | ||
| 2125 | |||
| 2126 | static int kdb_param_enable_nmi(const char *val, const struct kernel_param *kp) | ||
| 2127 | { | ||
| 2128 | if (!atomic_add_unless(&kdb_nmi_disabled, -1, 0)) | ||
| 2129 | return -EINVAL; | ||
| 2130 | arch_kgdb_ops.enable_nmi(1); | ||
| 2131 | return 0; | ||
| 2132 | } | ||
| 2133 | |||
| 2134 | static const struct kernel_param_ops kdb_param_ops_enable_nmi = { | ||
| 2135 | .set = kdb_param_enable_nmi, | ||
| 2136 | }; | ||
| 2137 | module_param_cb(enable_nmi, &kdb_param_ops_enable_nmi, NULL, 0600); | ||
| 2138 | |||
| 2110 | /* | 2139 | /* |
| 2111 | * kdb_cpu - This function implements the 'cpu' command. | 2140 | * kdb_cpu - This function implements the 'cpu' command. |
| 2112 | * cpu [<cpunum>] | 2141 | * cpu [<cpunum>] |
| @@ -2851,6 +2880,10 @@ static void __init kdb_inittab(void) | |||
| 2851 | kdb_register_repeat("dmesg", kdb_dmesg, "[lines]", | 2880 | kdb_register_repeat("dmesg", kdb_dmesg, "[lines]", |
| 2852 | "Display syslog buffer", 0, KDB_REPEAT_NONE); | 2881 | "Display syslog buffer", 0, KDB_REPEAT_NONE); |
| 2853 | #endif | 2882 | #endif |
| 2883 | if (arch_kgdb_ops.enable_nmi) { | ||
| 2884 | kdb_register_repeat("disable_nmi", kdb_disable_nmi, "", | ||
| 2885 | "Disable NMI entry to KDB", 0, KDB_REPEAT_NONE); | ||
| 2886 | } | ||
| 2854 | kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"", | 2887 | kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"", |
| 2855 | "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE); | 2888 | "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE); |
| 2856 | kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>", | 2889 | kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>", |
