diff options
| -rw-r--r-- | Documentation/x86_64/boot-options.txt | 3 | ||||
| -rw-r--r-- | arch/x86_64/Kconfig.debug | 9 | ||||
| -rw-r--r-- | arch/x86_64/kernel/traps.c | 40 | ||||
| -rw-r--r-- | arch/x86_64/mm/fault.c | 19 | ||||
| -rw-r--r-- | arch/x86_64/mm/init.c | 4 |
5 files changed, 10 insertions, 65 deletions
diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt index aaabb5883ab8..e566affeed7f 100644 --- a/Documentation/x86_64/boot-options.txt +++ b/Documentation/x86_64/boot-options.txt | |||
| @@ -193,6 +193,9 @@ Debugging | |||
| 193 | 193 | ||
| 194 | kstack=N Print that many words from the kernel stack in oops dumps. | 194 | kstack=N Print that many words from the kernel stack in oops dumps. |
| 195 | 195 | ||
| 196 | pagefaulttrace Dump all page faults. Only useful for extreme debugging | ||
| 197 | and will create a lot of output. | ||
| 198 | |||
| 196 | Misc | 199 | Misc |
| 197 | 200 | ||
| 198 | noreplacement Don't replace instructions with more appropiate ones | 201 | noreplacement Don't replace instructions with more appropiate ones |
diff --git a/arch/x86_64/Kconfig.debug b/arch/x86_64/Kconfig.debug index 9cf1410d2f5a..3ccf6f4d1068 100644 --- a/arch/x86_64/Kconfig.debug +++ b/arch/x86_64/Kconfig.debug | |||
| @@ -2,15 +2,6 @@ menu "Kernel hacking" | |||
| 2 | 2 | ||
| 3 | source "lib/Kconfig.debug" | 3 | source "lib/Kconfig.debug" |
| 4 | 4 | ||
| 5 | # !SMP for now because the context switch early causes GPF in segment reloading | ||
| 6 | # and the GS base checking does the wrong thing then, causing a hang. | ||
| 7 | config CHECKING | ||
| 8 | bool "Additional run-time checks" | ||
| 9 | depends on DEBUG_KERNEL && !SMP | ||
| 10 | help | ||
| 11 | Enables some internal consistency checks for kernel debugging. | ||
| 12 | You should normally say N. | ||
| 13 | |||
| 14 | config INIT_DEBUG | 5 | config INIT_DEBUG |
| 15 | bool "Debug __init statements" | 6 | bool "Debug __init statements" |
| 16 | depends on DEBUG_KERNEL | 7 | depends on DEBUG_KERNEL |
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 4a836384dd0f..bf337f493189 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
| @@ -428,19 +428,6 @@ static void __kprobes do_trap(int trapnr, int signr, char *str, | |||
| 428 | { | 428 | { |
| 429 | conditional_sti(regs); | 429 | conditional_sti(regs); |
| 430 | 430 | ||
| 431 | #ifdef CONFIG_CHECKING | ||
| 432 | { | ||
| 433 | unsigned long gs; | ||
| 434 | struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); | ||
| 435 | rdmsrl(MSR_GS_BASE, gs); | ||
| 436 | if (gs != (unsigned long)pda) { | ||
| 437 | wrmsrl(MSR_GS_BASE, pda); | ||
| 438 | printk("%s: wrong gs %lx expected %p rip %lx\n", str, gs, pda, | ||
| 439 | regs->rip); | ||
| 440 | } | ||
| 441 | } | ||
| 442 | #endif | ||
| 443 | |||
| 444 | if (user_mode(regs)) { | 431 | if (user_mode(regs)) { |
| 445 | struct task_struct *tsk = current; | 432 | struct task_struct *tsk = current; |
| 446 | 433 | ||
| @@ -513,20 +500,6 @@ asmlinkage void __kprobes do_general_protection(struct pt_regs * regs, | |||
| 513 | { | 500 | { |
| 514 | conditional_sti(regs); | 501 | conditional_sti(regs); |
| 515 | 502 | ||
| 516 | #ifdef CONFIG_CHECKING | ||
| 517 | { | ||
| 518 | unsigned long gs; | ||
| 519 | struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); | ||
| 520 | rdmsrl(MSR_GS_BASE, gs); | ||
| 521 | if (gs != (unsigned long)pda) { | ||
| 522 | wrmsrl(MSR_GS_BASE, pda); | ||
| 523 | oops_in_progress++; | ||
| 524 | printk("general protection handler: wrong gs %lx expected %p\n", gs, pda); | ||
| 525 | oops_in_progress--; | ||
| 526 | } | ||
| 527 | } | ||
| 528 | #endif | ||
| 529 | |||
| 530 | if (user_mode(regs)) { | 503 | if (user_mode(regs)) { |
| 531 | struct task_struct *tsk = current; | 504 | struct task_struct *tsk = current; |
| 532 | 505 | ||
| @@ -665,19 +638,6 @@ asmlinkage void __kprobes do_debug(struct pt_regs * regs, | |||
| 665 | struct task_struct *tsk = current; | 638 | struct task_struct *tsk = current; |
| 666 | siginfo_t info; | 639 | siginfo_t info; |
| 667 | 640 | ||
| 668 | #ifdef CONFIG_CHECKING | ||
| 669 | { | ||
| 670 | /* RED-PEN interaction with debugger - could destroy gs */ | ||
| 671 | unsigned long gs; | ||
| 672 | struct x8664_pda *pda = cpu_pda + safe_smp_processor_id(); | ||
| 673 | rdmsrl(MSR_GS_BASE, gs); | ||
| 674 | if (gs != (unsigned long)pda) { | ||
| 675 | wrmsrl(MSR_GS_BASE, pda); | ||
| 676 | printk("debug handler: wrong gs %lx expected %p\n", gs, pda); | ||
| 677 | } | ||
| 678 | } | ||
| 679 | #endif | ||
| 680 | |||
| 681 | get_debugreg(condition, 6); | 641 | get_debugreg(condition, 6); |
| 682 | 642 | ||
| 683 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, | 643 | if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code, |
diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c index b75b872ec154..3a63707a698b 100644 --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c | |||
| @@ -308,18 +308,6 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
| 308 | unsigned long flags; | 308 | unsigned long flags; |
| 309 | siginfo_t info; | 309 | siginfo_t info; |
| 310 | 310 | ||
| 311 | #ifdef CONFIG_CHECKING | ||
| 312 | { | ||
| 313 | unsigned long gs; | ||
| 314 | struct x8664_pda *pda = cpu_pda + stack_smp_processor_id(); | ||
| 315 | rdmsrl(MSR_GS_BASE, gs); | ||
| 316 | if (gs != (unsigned long)pda) { | ||
| 317 | wrmsrl(MSR_GS_BASE, pda); | ||
| 318 | printk("page_fault: wrong gs %lx expected %p\n", gs, pda); | ||
| 319 | } | ||
| 320 | } | ||
| 321 | #endif | ||
| 322 | |||
| 323 | /* get the address */ | 311 | /* get the address */ |
| 324 | __asm__("movq %%cr2,%0":"=r" (address)); | 312 | __asm__("movq %%cr2,%0":"=r" (address)); |
| 325 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | 313 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, |
| @@ -571,3 +559,10 @@ do_sigbus: | |||
| 571 | force_sig_info(SIGBUS, &info, tsk); | 559 | force_sig_info(SIGBUS, &info, tsk); |
| 572 | return; | 560 | return; |
| 573 | } | 561 | } |
| 562 | |||
| 563 | static int __init enable_pagefaulttrace(char *str) | ||
| 564 | { | ||
| 565 | page_fault_trace = 1; | ||
| 566 | return 0; | ||
| 567 | } | ||
| 568 | __setup("pagefaulttrace", enable_pagefaulttrace); | ||
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 854a41b8372b..286f6a624c3a 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
| @@ -565,10 +565,6 @@ extern int exception_trace, page_fault_trace; | |||
| 565 | static ctl_table debug_table2[] = { | 565 | static ctl_table debug_table2[] = { |
| 566 | { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL, | 566 | { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL, |
| 567 | proc_dointvec }, | 567 | proc_dointvec }, |
| 568 | #ifdef CONFIG_CHECKING | ||
| 569 | { 100, "page-fault-trace", &page_fault_trace, sizeof(int), 0644, NULL, | ||
| 570 | proc_dointvec }, | ||
| 571 | #endif | ||
| 572 | { 0, } | 568 | { 0, } |
| 573 | }; | 569 | }; |
| 574 | 570 | ||
