diff options
| -rw-r--r-- | drivers/misc/kgdbts.c | 41 | ||||
| -rw-r--r-- | lib/Kconfig.kgdb | 18 |
2 files changed, 42 insertions, 17 deletions
diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index cbc4822b5847..6d6286c4eeac 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c | |||
| @@ -112,6 +112,10 @@ | |||
| 112 | printk(KERN_INFO a); \ | 112 | printk(KERN_INFO a); \ |
| 113 | touch_nmi_watchdog(); \ | 113 | touch_nmi_watchdog(); \ |
| 114 | } while (0) | 114 | } while (0) |
| 115 | #define eprintk(a...) do { \ | ||
| 116 | printk(KERN_ERR a); \ | ||
| 117 | WARN_ON(1); \ | ||
| 118 | } while (0) | ||
| 115 | #define MAX_CONFIG_LEN 40 | 119 | #define MAX_CONFIG_LEN 40 |
| 116 | 120 | ||
| 117 | static const char hexchars[] = "0123456789abcdef"; | 121 | static const char hexchars[] = "0123456789abcdef"; |
| @@ -145,7 +149,11 @@ static struct pt_regs kgdbts_regs; | |||
| 145 | /* -1 = init not run yet, 0 = unconfigured, 1 = configured. */ | 149 | /* -1 = init not run yet, 0 = unconfigured, 1 = configured. */ |
| 146 | static int configured = -1; | 150 | static int configured = -1; |
| 147 | 151 | ||
| 152 | #ifdef CONFIG_KGDB_TESTS_BOOT_STRING | ||
| 153 | static char config[MAX_CONFIG_LEN] = CONFIG_KGDB_TESTS_BOOT_STRING; | ||
| 154 | #else | ||
| 148 | static char config[MAX_CONFIG_LEN]; | 155 | static char config[MAX_CONFIG_LEN]; |
| 156 | #endif | ||
| 149 | static struct kparam_string kps = { | 157 | static struct kparam_string kps = { |
| 150 | .string = config, | 158 | .string = config, |
| 151 | .maxlen = MAX_CONFIG_LEN, | 159 | .maxlen = MAX_CONFIG_LEN, |
| @@ -289,7 +297,7 @@ static int check_and_rewind_pc(char *put_str, char *arg) | |||
| 289 | #endif | 297 | #endif |
| 290 | if (strcmp(arg, "silent") && | 298 | if (strcmp(arg, "silent") && |
| 291 | instruction_pointer(&kgdbts_regs) + offset != addr) { | 299 | instruction_pointer(&kgdbts_regs) + offset != addr) { |
| 292 | printk(KERN_ERR "kgdbts: BP mismatch %lx expected %lx\n", | 300 | eprintk("kgdbts: BP mismatch %lx expected %lx\n", |
| 293 | instruction_pointer(&kgdbts_regs) + offset, addr); | 301 | instruction_pointer(&kgdbts_regs) + offset, addr); |
| 294 | return 1; | 302 | return 1; |
| 295 | } | 303 | } |
| @@ -313,7 +321,7 @@ static int check_single_step(char *put_str, char *arg) | |||
| 313 | v2printk("Singlestep stopped at IP: %lx\n", | 321 | v2printk("Singlestep stopped at IP: %lx\n", |
| 314 | instruction_pointer(&kgdbts_regs)); | 322 | instruction_pointer(&kgdbts_regs)); |
| 315 | if (instruction_pointer(&kgdbts_regs) == addr) { | 323 | if (instruction_pointer(&kgdbts_regs) == addr) { |
| 316 | printk(KERN_ERR "kgdbts: SingleStep failed at %lx\n", | 324 | eprintk("kgdbts: SingleStep failed at %lx\n", |
| 317 | instruction_pointer(&kgdbts_regs)); | 325 | instruction_pointer(&kgdbts_regs)); |
| 318 | return 1; | 326 | return 1; |
| 319 | } | 327 | } |
| @@ -378,7 +386,7 @@ static void emul_sstep_get(char *arg) | |||
| 378 | break_helper("z0", 0, sstep_addr); | 386 | break_helper("z0", 0, sstep_addr); |
| 379 | break; | 387 | break; |
| 380 | default: | 388 | default: |
| 381 | printk(KERN_ERR "kgdbts: ERROR failed sstep get emulation\n"); | 389 | eprintk("kgdbts: ERROR failed sstep get emulation\n"); |
| 382 | } | 390 | } |
| 383 | sstep_state++; | 391 | sstep_state++; |
| 384 | } | 392 | } |
| @@ -404,26 +412,26 @@ static int emul_sstep_put(char *put_str, char *arg) | |||
| 404 | break; | 412 | break; |
| 405 | case 2: | 413 | case 2: |
| 406 | if (strncmp(put_str, "$OK", 3)) { | 414 | if (strncmp(put_str, "$OK", 3)) { |
| 407 | printk(KERN_ERR "kgdbts: failed sstep break set\n"); | 415 | eprintk("kgdbts: failed sstep break set\n"); |
| 408 | return 1; | 416 | return 1; |
| 409 | } | 417 | } |
| 410 | break; | 418 | break; |
| 411 | case 3: | 419 | case 3: |
| 412 | if (strncmp(put_str, "$T0", 3)) { | 420 | if (strncmp(put_str, "$T0", 3)) { |
| 413 | printk(KERN_ERR "kgdbts: failed continue sstep\n"); | 421 | eprintk("kgdbts: failed continue sstep\n"); |
| 414 | return 1; | 422 | return 1; |
| 415 | } | 423 | } |
| 416 | break; | 424 | break; |
| 417 | case 4: | 425 | case 4: |
| 418 | if (strncmp(put_str, "$OK", 3)) { | 426 | if (strncmp(put_str, "$OK", 3)) { |
| 419 | printk(KERN_ERR "kgdbts: failed sstep break unset\n"); | 427 | eprintk("kgdbts: failed sstep break unset\n"); |
| 420 | return 1; | 428 | return 1; |
| 421 | } | 429 | } |
| 422 | /* Single step is complete so continue on! */ | 430 | /* Single step is complete so continue on! */ |
| 423 | sstep_state = 0; | 431 | sstep_state = 0; |
| 424 | return 0; | 432 | return 0; |
| 425 | default: | 433 | default: |
| 426 | printk(KERN_ERR "kgdbts: ERROR failed sstep put emulation\n"); | 434 | eprintk("kgdbts: ERROR failed sstep put emulation\n"); |
| 427 | } | 435 | } |
| 428 | 436 | ||
| 429 | /* Continue on the same test line until emulation is complete */ | 437 | /* Continue on the same test line until emulation is complete */ |
| @@ -668,8 +676,7 @@ static int run_simple_test(int is_get_char, int chr) | |||
| 668 | } | 676 | } |
| 669 | 677 | ||
| 670 | if (get_buf[get_buf_cnt] == '\0') { | 678 | if (get_buf[get_buf_cnt] == '\0') { |
| 671 | printk(KERN_ERR | 679 | eprintk("kgdbts: ERROR GET: EOB on '%s' at %i\n", |
| 672 | "kgdbts: ERROR GET: end of buffer on '%s' at %i\n", | ||
| 673 | ts.name, ts.idx); | 680 | ts.name, ts.idx); |
| 674 | get_buf_cnt = 0; | 681 | get_buf_cnt = 0; |
| 675 | fill_get_buf("D"); | 682 | fill_get_buf("D"); |
| @@ -684,13 +691,13 @@ static int run_simple_test(int is_get_char, int chr) | |||
| 684 | */ | 691 | */ |
| 685 | if (ts.tst[ts.idx].get[0] == '\0' && | 692 | if (ts.tst[ts.idx].get[0] == '\0' && |
| 686 | ts.tst[ts.idx].put[0] == '\0') { | 693 | ts.tst[ts.idx].put[0] == '\0') { |
| 687 | printk(KERN_ERR "kgdbts: ERROR: beyond end of test on" | 694 | eprintk("kgdbts: ERROR: beyond end of test on" |
| 688 | " '%s' line %i\n", ts.name, ts.idx); | 695 | " '%s' line %i\n", ts.name, ts.idx); |
| 689 | return 0; | 696 | return 0; |
| 690 | } | 697 | } |
| 691 | 698 | ||
| 692 | if (put_buf_cnt >= BUFMAX) { | 699 | if (put_buf_cnt >= BUFMAX) { |
| 693 | printk(KERN_ERR "kgdbts: ERROR: put buffer overflow on" | 700 | eprintk("kgdbts: ERROR: put buffer overflow on" |
| 694 | " '%s' line %i\n", ts.name, ts.idx); | 701 | " '%s' line %i\n", ts.name, ts.idx); |
| 695 | put_buf_cnt = 0; | 702 | put_buf_cnt = 0; |
| 696 | return 0; | 703 | return 0; |
| @@ -708,7 +715,7 @@ static int run_simple_test(int is_get_char, int chr) | |||
| 708 | v2printk("put%i: %s\n", ts.idx, put_buf); | 715 | v2printk("put%i: %s\n", ts.idx, put_buf); |
| 709 | /* Trigger check here */ | 716 | /* Trigger check here */ |
| 710 | if (ts.validate_put && ts.validate_put(put_buf)) { | 717 | if (ts.validate_put && ts.validate_put(put_buf)) { |
| 711 | printk(KERN_ERR "kgdbts: ERROR PUT: end of test " | 718 | eprintk("kgdbts: ERROR PUT: end of test " |
| 712 | "buffer on '%s' line %i expected %s got %s\n", | 719 | "buffer on '%s' line %i expected %s got %s\n", |
| 713 | ts.name, ts.idx, ts.tst[ts.idx].put, put_buf); | 720 | ts.name, ts.idx, ts.tst[ts.idx].put, put_buf); |
| 714 | } | 721 | } |
| @@ -772,7 +779,7 @@ static void run_breakpoint_test(int is_hw_breakpoint) | |||
| 772 | if (test_complete) | 779 | if (test_complete) |
| 773 | return; | 780 | return; |
| 774 | 781 | ||
| 775 | printk(KERN_ERR "kgdbts: ERROR %s test failed\n", ts.name); | 782 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); |
| 776 | } | 783 | } |
| 777 | 784 | ||
| 778 | static void run_hw_break_test(int is_write_test) | 785 | static void run_hw_break_test(int is_write_test) |
| @@ -791,7 +798,7 @@ static void run_hw_break_test(int is_write_test) | |||
| 791 | hw_break_val_access(); | 798 | hw_break_val_access(); |
| 792 | if (is_write_test) { | 799 | if (is_write_test) { |
| 793 | if (test_complete == 2) | 800 | if (test_complete == 2) |
| 794 | printk(KERN_ERR "kgdbts: ERROR %s broke on access\n", | 801 | eprintk("kgdbts: ERROR %s broke on access\n", |
| 795 | ts.name); | 802 | ts.name); |
| 796 | hw_break_val_write(); | 803 | hw_break_val_write(); |
| 797 | } | 804 | } |
| @@ -800,7 +807,7 @@ static void run_hw_break_test(int is_write_test) | |||
| 800 | if (test_complete == 1) | 807 | if (test_complete == 1) |
| 801 | return; | 808 | return; |
| 802 | 809 | ||
| 803 | printk(KERN_ERR "kgdbts: ERROR %s test failed\n", ts.name); | 810 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); |
| 804 | } | 811 | } |
| 805 | 812 | ||
| 806 | static void run_nmi_sleep_test(int nmi_sleep) | 813 | static void run_nmi_sleep_test(int nmi_sleep) |
| @@ -817,12 +824,12 @@ static void run_nmi_sleep_test(int nmi_sleep) | |||
| 817 | touch_nmi_watchdog(); | 824 | touch_nmi_watchdog(); |
| 818 | local_irq_restore(flags); | 825 | local_irq_restore(flags); |
| 819 | if (test_complete != 2) | 826 | if (test_complete != 2) |
| 820 | printk(KERN_ERR "kgdbts: ERROR nmi_test did not hit nmi\n"); | 827 | eprintk("kgdbts: ERROR nmi_test did not hit nmi\n"); |
| 821 | kgdb_breakpoint(); | 828 | kgdb_breakpoint(); |
| 822 | if (test_complete == 1) | 829 | if (test_complete == 1) |
| 823 | return; | 830 | return; |
| 824 | 831 | ||
| 825 | printk(KERN_ERR "kgdbts: ERROR %s test failed\n", ts.name); | 832 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); |
| 826 | } | 833 | } |
| 827 | 834 | ||
| 828 | static void run_bad_read_test(void) | 835 | static void run_bad_read_test(void) |
diff --git a/lib/Kconfig.kgdb b/lib/Kconfig.kgdb index aaabcddcda5a..f2e01ac5ab09 100644 --- a/lib/Kconfig.kgdb +++ b/lib/Kconfig.kgdb | |||
| @@ -38,3 +38,21 @@ config KGDB_TESTS | |||
| 38 | See the drivers/misc/kgdbts.c for the details about | 38 | See the drivers/misc/kgdbts.c for the details about |
| 39 | the tests. The most basic of this I/O module is to boot | 39 | the tests. The most basic of this I/O module is to boot |
| 40 | a kernel boot arguments "kgdbwait kgdbts=V1F100" | 40 | a kernel boot arguments "kgdbwait kgdbts=V1F100" |
| 41 | |||
| 42 | config KGDB_TESTS_ON_BOOT | ||
| 43 | bool "KGDB: Run tests on boot" | ||
| 44 | depends on KGDB_TESTS | ||
| 45 | default n | ||
| 46 | help | ||
| 47 | Run the kgdb tests on boot up automatically without the need | ||
| 48 | to pass in a kernel parameter | ||
| 49 | |||
| 50 | config KGDB_TESTS_BOOT_STRING | ||
| 51 | string "KGDB: which internal kgdb tests to run" | ||
| 52 | depends on KGDB_TESTS_ON_BOOT | ||
| 53 | default "V1F100" | ||
| 54 | help | ||
| 55 | This is the command string to send the kgdb test suite on | ||
| 56 | boot. See the drivers/misc/kgdbts.c for detailed | ||
| 57 | information about other strings you could use beyond the | ||
| 58 | default of V1F100. | ||
