Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.19 1196 lines 32 kB view raw
1/* 2 * kgdbts is a test suite for kgdb for the sole purpose of validating 3 * that key pieces of the kgdb internals are working properly such as 4 * HW/SW breakpoints, single stepping, and NMI. 5 * 6 * Created by: Jason Wessel <jason.wessel@windriver.com> 7 * 8 * Copyright (c) 2008 Wind River Systems, Inc. 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License version 2 as 12 * published by the Free Software Foundation. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 17 * See the GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 */ 23/* Information about the kgdb test suite. 24 * ------------------------------------- 25 * 26 * The kgdb test suite is designed as a KGDB I/O module which 27 * simulates the communications that a debugger would have with kgdb. 28 * The tests are broken up in to a line by line and referenced here as 29 * a "get" which is kgdb requesting input and "put" which is kgdb 30 * sending a response. 31 * 32 * The kgdb suite can be invoked from the kernel command line 33 * arguments system or executed dynamically at run time. The test 34 * suite uses the variable "kgdbts" to obtain the information about 35 * which tests to run and to configure the verbosity level. The 36 * following are the various characters you can use with the kgdbts= 37 * line: 38 * 39 * When using the "kgdbts=" you only choose one of the following core 40 * test types: 41 * A = Run all the core tests silently 42 * V1 = Run all the core tests with minimal output 43 * V2 = Run all the core tests in debug mode 44 * 45 * You can also specify optional tests: 46 * N## = Go to sleep with interrupts of for ## seconds 47 * to test the HW NMI watchdog 48 * F## = Break at do_fork for ## iterations 49 * S## = Break at sys_open for ## iterations 50 * I## = Run the single step test ## iterations 51 * 52 * NOTE: that the do_fork and sys_open tests are mutually exclusive. 53 * 54 * To invoke the kgdb test suite from boot you use a kernel start 55 * argument as follows: 56 * kgdbts=V1 kgdbwait 57 * Or if you wanted to perform the NMI test for 6 seconds and do_fork 58 * test for 100 forks, you could use: 59 * kgdbts=V1N6F100 kgdbwait 60 * 61 * The test suite can also be invoked at run time with: 62 * echo kgdbts=V1N6F100 > /sys/module/kgdbts/parameters/kgdbts 63 * Or as another example: 64 * echo kgdbts=V2 > /sys/module/kgdbts/parameters/kgdbts 65 * 66 * When developing a new kgdb arch specific implementation or 67 * using these tests for the purpose of regression testing, 68 * several invocations are required. 69 * 70 * 1) Boot with the test suite enabled by using the kernel arguments 71 * "kgdbts=V1F100 kgdbwait" 72 * ## If kgdb arch specific implementation has NMI use 73 * "kgdbts=V1N6F100 74 * 75 * 2) After the system boot run the basic test. 76 * echo kgdbts=V1 > /sys/module/kgdbts/parameters/kgdbts 77 * 78 * 3) Run the concurrency tests. It is best to use n+1 79 * while loops where n is the number of cpus you have 80 * in your system. The example below uses only two 81 * loops. 82 * 83 * ## This tests break points on sys_open 84 * while [ 1 ] ; do find / > /dev/null 2>&1 ; done & 85 * while [ 1 ] ; do find / > /dev/null 2>&1 ; done & 86 * echo kgdbts=V1S10000 > /sys/module/kgdbts/parameters/kgdbts 87 * fg # and hit control-c 88 * fg # and hit control-c 89 * ## This tests break points on do_fork 90 * while [ 1 ] ; do date > /dev/null ; done & 91 * while [ 1 ] ; do date > /dev/null ; done & 92 * echo kgdbts=V1F1000 > /sys/module/kgdbts/parameters/kgdbts 93 * fg # and hit control-c 94 * 95 */ 96 97#include <linux/kernel.h> 98#include <linux/kgdb.h> 99#include <linux/ctype.h> 100#include <linux/uaccess.h> 101#include <linux/syscalls.h> 102#include <linux/nmi.h> 103#include <linux/delay.h> 104#include <linux/kthread.h> 105#include <linux/module.h> 106#include <linux/sched/task.h> 107 108#include <asm/sections.h> 109 110#define v1printk(a...) do { \ 111 if (verbose) \ 112 printk(KERN_INFO a); \ 113 } while (0) 114#define v2printk(a...) do { \ 115 if (verbose > 1) \ 116 printk(KERN_INFO a); \ 117 touch_nmi_watchdog(); \ 118 } while (0) 119#define eprintk(a...) do { \ 120 printk(KERN_ERR a); \ 121 WARN_ON(1); \ 122 } while (0) 123#define MAX_CONFIG_LEN 40 124 125static struct kgdb_io kgdbts_io_ops; 126static char get_buf[BUFMAX]; 127static int get_buf_cnt; 128static char put_buf[BUFMAX]; 129static int put_buf_cnt; 130static char scratch_buf[BUFMAX]; 131static int verbose; 132static int repeat_test; 133static int test_complete; 134static int send_ack; 135static int final_ack; 136static int force_hwbrks; 137static int hwbreaks_ok; 138static int hw_break_val; 139static int hw_break_val2; 140static int cont_instead_of_sstep; 141static unsigned long cont_thread_id; 142static unsigned long sstep_thread_id; 143#if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC) 144static int arch_needs_sstep_emulation = 1; 145#else 146static int arch_needs_sstep_emulation; 147#endif 148static unsigned long cont_addr; 149static unsigned long sstep_addr; 150static int restart_from_top_after_write; 151static int sstep_state; 152 153/* Storage for the registers, in GDB format. */ 154static unsigned long kgdbts_gdb_regs[(NUMREGBYTES + 155 sizeof(unsigned long) - 1) / 156 sizeof(unsigned long)]; 157static struct pt_regs kgdbts_regs; 158 159/* -1 = init not run yet, 0 = unconfigured, 1 = configured. */ 160static int configured = -1; 161 162#ifdef CONFIG_KGDB_TESTS_BOOT_STRING 163static char config[MAX_CONFIG_LEN] = CONFIG_KGDB_TESTS_BOOT_STRING; 164#else 165static char config[MAX_CONFIG_LEN]; 166#endif 167static struct kparam_string kps = { 168 .string = config, 169 .maxlen = MAX_CONFIG_LEN, 170}; 171 172static void fill_get_buf(char *buf); 173 174struct test_struct { 175 char *get; 176 char *put; 177 void (*get_handler)(char *); 178 int (*put_handler)(char *, char *); 179}; 180 181struct test_state { 182 char *name; 183 struct test_struct *tst; 184 int idx; 185 int (*run_test) (int, int); 186 int (*validate_put) (char *); 187}; 188 189static struct test_state ts; 190 191static int kgdbts_unreg_thread(void *ptr) 192{ 193 /* Wait until the tests are complete and then ungresiter the I/O 194 * driver. 195 */ 196 while (!final_ack) 197 msleep_interruptible(1500); 198 /* Pause for any other threads to exit after final ack. */ 199 msleep_interruptible(1000); 200 if (configured) 201 kgdb_unregister_io_module(&kgdbts_io_ops); 202 configured = 0; 203 204 return 0; 205} 206 207/* This is noinline such that it can be used for a single location to 208 * place a breakpoint 209 */ 210static noinline void kgdbts_break_test(void) 211{ 212 v2printk("kgdbts: breakpoint complete\n"); 213} 214 215/* Lookup symbol info in the kernel */ 216static unsigned long lookup_addr(char *arg) 217{ 218 unsigned long addr = 0; 219 220 if (!strcmp(arg, "kgdbts_break_test")) 221 addr = (unsigned long)kgdbts_break_test; 222 else if (!strcmp(arg, "sys_open")) 223 addr = (unsigned long)do_sys_open; 224 else if (!strcmp(arg, "do_fork")) 225 addr = (unsigned long)_do_fork; 226 else if (!strcmp(arg, "hw_break_val")) 227 addr = (unsigned long)&hw_break_val; 228 addr = (unsigned long) dereference_function_descriptor((void *)addr); 229 return addr; 230} 231 232static void break_helper(char *bp_type, char *arg, unsigned long vaddr) 233{ 234 unsigned long addr; 235 236 if (arg) 237 addr = lookup_addr(arg); 238 else 239 addr = vaddr; 240 241 sprintf(scratch_buf, "%s,%lx,%i", bp_type, addr, 242 BREAK_INSTR_SIZE); 243 fill_get_buf(scratch_buf); 244} 245 246static void sw_break(char *arg) 247{ 248 break_helper(force_hwbrks ? "Z1" : "Z0", arg, 0); 249} 250 251static void sw_rem_break(char *arg) 252{ 253 break_helper(force_hwbrks ? "z1" : "z0", arg, 0); 254} 255 256static void hw_break(char *arg) 257{ 258 break_helper("Z1", arg, 0); 259} 260 261static void hw_rem_break(char *arg) 262{ 263 break_helper("z1", arg, 0); 264} 265 266static void hw_write_break(char *arg) 267{ 268 break_helper("Z2", arg, 0); 269} 270 271static void hw_rem_write_break(char *arg) 272{ 273 break_helper("z2", arg, 0); 274} 275 276static void hw_access_break(char *arg) 277{ 278 break_helper("Z4", arg, 0); 279} 280 281static void hw_rem_access_break(char *arg) 282{ 283 break_helper("z4", arg, 0); 284} 285 286static void hw_break_val_access(void) 287{ 288 hw_break_val2 = hw_break_val; 289} 290 291static void hw_break_val_write(void) 292{ 293 hw_break_val++; 294} 295 296static int get_thread_id_continue(char *put_str, char *arg) 297{ 298 char *ptr = &put_str[11]; 299 300 if (put_str[1] != 'T' || put_str[2] != '0') 301 return 1; 302 kgdb_hex2long(&ptr, &cont_thread_id); 303 return 0; 304} 305 306static int check_and_rewind_pc(char *put_str, char *arg) 307{ 308 unsigned long addr = lookup_addr(arg); 309 unsigned long ip; 310 int offset = 0; 311 312 kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs, 313 NUMREGBYTES); 314 gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs); 315 ip = instruction_pointer(&kgdbts_regs); 316 v2printk("Stopped at IP: %lx\n", ip); 317#ifdef GDB_ADJUSTS_BREAK_OFFSET 318 /* On some arches, a breakpoint stop requires it to be decremented */ 319 if (addr + BREAK_INSTR_SIZE == ip) 320 offset = -BREAK_INSTR_SIZE; 321#endif 322 323 if (arch_needs_sstep_emulation && sstep_addr && 324 ip + offset == sstep_addr && 325 ((!strcmp(arg, "sys_open") || !strcmp(arg, "do_fork")))) { 326 /* This is special case for emulated single step */ 327 v2printk("Emul: rewind hit single step bp\n"); 328 restart_from_top_after_write = 1; 329 } else if (strcmp(arg, "silent") && ip + offset != addr) { 330 eprintk("kgdbts: BP mismatch %lx expected %lx\n", 331 ip + offset, addr); 332 return 1; 333 } 334 /* Readjust the instruction pointer if needed */ 335 ip += offset; 336 cont_addr = ip; 337#ifdef GDB_ADJUSTS_BREAK_OFFSET 338 instruction_pointer_set(&kgdbts_regs, ip); 339#endif 340 return 0; 341} 342 343static int check_single_step(char *put_str, char *arg) 344{ 345 unsigned long addr = lookup_addr(arg); 346 static int matched_id; 347 348 /* 349 * From an arch indepent point of view the instruction pointer 350 * should be on a different instruction 351 */ 352 kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs, 353 NUMREGBYTES); 354 gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs); 355 v2printk("Singlestep stopped at IP: %lx\n", 356 instruction_pointer(&kgdbts_regs)); 357 358 if (sstep_thread_id != cont_thread_id) { 359 /* 360 * Ensure we stopped in the same thread id as before, else the 361 * debugger should continue until the original thread that was 362 * single stepped is scheduled again, emulating gdb's behavior. 363 */ 364 v2printk("ThrID does not match: %lx\n", cont_thread_id); 365 if (arch_needs_sstep_emulation) { 366 if (matched_id && 367 instruction_pointer(&kgdbts_regs) != addr) 368 goto continue_test; 369 matched_id++; 370 ts.idx -= 2; 371 sstep_state = 0; 372 return 0; 373 } 374 cont_instead_of_sstep = 1; 375 ts.idx -= 4; 376 return 0; 377 } 378continue_test: 379 matched_id = 0; 380 if (instruction_pointer(&kgdbts_regs) == addr) { 381 eprintk("kgdbts: SingleStep failed at %lx\n", 382 instruction_pointer(&kgdbts_regs)); 383 return 1; 384 } 385 386 return 0; 387} 388 389static void write_regs(char *arg) 390{ 391 memset(scratch_buf, 0, sizeof(scratch_buf)); 392 scratch_buf[0] = 'G'; 393 pt_regs_to_gdb_regs(kgdbts_gdb_regs, &kgdbts_regs); 394 kgdb_mem2hex((char *)kgdbts_gdb_regs, &scratch_buf[1], NUMREGBYTES); 395 fill_get_buf(scratch_buf); 396} 397 398static void skip_back_repeat_test(char *arg) 399{ 400 int go_back = simple_strtol(arg, NULL, 10); 401 402 repeat_test--; 403 if (repeat_test <= 0) { 404 ts.idx++; 405 } else { 406 if (repeat_test % 100 == 0) 407 v1printk("kgdbts:RUN ... %d remaining\n", repeat_test); 408 409 ts.idx -= go_back; 410 } 411 fill_get_buf(ts.tst[ts.idx].get); 412} 413 414static int got_break(char *put_str, char *arg) 415{ 416 test_complete = 1; 417 if (!strncmp(put_str+1, arg, 2)) { 418 if (!strncmp(arg, "T0", 2)) 419 test_complete = 2; 420 return 0; 421 } 422 return 1; 423} 424 425static void get_cont_catch(char *arg) 426{ 427 /* Always send detach because the test is completed at this point */ 428 fill_get_buf("D"); 429} 430 431static int put_cont_catch(char *put_str, char *arg) 432{ 433 /* This is at the end of the test and we catch any and all input */ 434 v2printk("kgdbts: cleanup task: %lx\n", sstep_thread_id); 435 ts.idx--; 436 return 0; 437} 438 439static int emul_reset(char *put_str, char *arg) 440{ 441 if (strncmp(put_str, "$OK", 3)) 442 return 1; 443 if (restart_from_top_after_write) { 444 restart_from_top_after_write = 0; 445 ts.idx = -1; 446 } 447 return 0; 448} 449 450static void emul_sstep_get(char *arg) 451{ 452 if (!arch_needs_sstep_emulation) { 453 if (cont_instead_of_sstep) { 454 cont_instead_of_sstep = 0; 455 fill_get_buf("c"); 456 } else { 457 fill_get_buf(arg); 458 } 459 return; 460 } 461 switch (sstep_state) { 462 case 0: 463 v2printk("Emulate single step\n"); 464 /* Start by looking at the current PC */ 465 fill_get_buf("g"); 466 break; 467 case 1: 468 /* set breakpoint */ 469 break_helper("Z0", NULL, sstep_addr); 470 break; 471 case 2: 472 /* Continue */ 473 fill_get_buf("c"); 474 break; 475 case 3: 476 /* Clear breakpoint */ 477 break_helper("z0", NULL, sstep_addr); 478 break; 479 default: 480 eprintk("kgdbts: ERROR failed sstep get emulation\n"); 481 } 482 sstep_state++; 483} 484 485static int emul_sstep_put(char *put_str, char *arg) 486{ 487 if (!arch_needs_sstep_emulation) { 488 char *ptr = &put_str[11]; 489 if (put_str[1] != 'T' || put_str[2] != '0') 490 return 1; 491 kgdb_hex2long(&ptr, &sstep_thread_id); 492 return 0; 493 } 494 switch (sstep_state) { 495 case 1: 496 /* validate the "g" packet to get the IP */ 497 kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs, 498 NUMREGBYTES); 499 gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs); 500 v2printk("Stopped at IP: %lx\n", 501 instruction_pointer(&kgdbts_regs)); 502 /* Want to stop at IP + break instruction size by default */ 503 sstep_addr = cont_addr + BREAK_INSTR_SIZE; 504 break; 505 case 2: 506 if (strncmp(put_str, "$OK", 3)) { 507 eprintk("kgdbts: failed sstep break set\n"); 508 return 1; 509 } 510 break; 511 case 3: 512 if (strncmp(put_str, "$T0", 3)) { 513 eprintk("kgdbts: failed continue sstep\n"); 514 return 1; 515 } else { 516 char *ptr = &put_str[11]; 517 kgdb_hex2long(&ptr, &sstep_thread_id); 518 } 519 break; 520 case 4: 521 if (strncmp(put_str, "$OK", 3)) { 522 eprintk("kgdbts: failed sstep break unset\n"); 523 return 1; 524 } 525 /* Single step is complete so continue on! */ 526 sstep_state = 0; 527 return 0; 528 default: 529 eprintk("kgdbts: ERROR failed sstep put emulation\n"); 530 } 531 532 /* Continue on the same test line until emulation is complete */ 533 ts.idx--; 534 return 0; 535} 536 537static int final_ack_set(char *put_str, char *arg) 538{ 539 if (strncmp(put_str+1, arg, 2)) 540 return 1; 541 final_ack = 1; 542 return 0; 543} 544/* 545 * Test to plant a breakpoint and detach, which should clear out the 546 * breakpoint and restore the original instruction. 547 */ 548static struct test_struct plant_and_detach_test[] = { 549 { "?", "S0*" }, /* Clear break points */ 550 { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ 551 { "D", "OK" }, /* Detach */ 552 { "", "" }, 553}; 554 555/* 556 * Simple test to write in a software breakpoint, check for the 557 * correct stop location and detach. 558 */ 559static struct test_struct sw_breakpoint_test[] = { 560 { "?", "S0*" }, /* Clear break points */ 561 { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ 562 { "c", "T0*", }, /* Continue */ 563 { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, 564 { "write", "OK", write_regs }, 565 { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ 566 { "D", "OK" }, /* Detach */ 567 { "D", "OK", NULL, got_break }, /* On success we made it here */ 568 { "", "" }, 569}; 570 571/* 572 * Test a known bad memory read location to test the fault handler and 573 * read bytes 1-8 at the bad address 574 */ 575static struct test_struct bad_read_test[] = { 576 { "?", "S0*" }, /* Clear break points */ 577 { "m0,1", "E*" }, /* read 1 byte at address 1 */ 578 { "m0,2", "E*" }, /* read 1 byte at address 2 */ 579 { "m0,3", "E*" }, /* read 1 byte at address 3 */ 580 { "m0,4", "E*" }, /* read 1 byte at address 4 */ 581 { "m0,5", "E*" }, /* read 1 byte at address 5 */ 582 { "m0,6", "E*" }, /* read 1 byte at address 6 */ 583 { "m0,7", "E*" }, /* read 1 byte at address 7 */ 584 { "m0,8", "E*" }, /* read 1 byte at address 8 */ 585 { "D", "OK" }, /* Detach which removes all breakpoints and continues */ 586 { "", "" }, 587}; 588 589/* 590 * Test for hitting a breakpoint, remove it, single step, plant it 591 * again and detach. 592 */ 593static struct test_struct singlestep_break_test[] = { 594 { "?", "S0*" }, /* Clear break points */ 595 { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ 596 { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */ 597 { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ 598 { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, 599 { "write", "OK", write_regs }, /* Write registers */ 600 { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ 601 { "g", "kgdbts_break_test", NULL, check_single_step }, 602 { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ 603 { "c", "T0*", }, /* Continue */ 604 { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, 605 { "write", "OK", write_regs }, /* Write registers */ 606 { "D", "OK" }, /* Remove all breakpoints and continues */ 607 { "", "" }, 608}; 609 610/* 611 * Test for hitting a breakpoint at do_fork for what ever the number 612 * of iterations required by the variable repeat_test. 613 */ 614static struct test_struct do_fork_test[] = { 615 { "?", "S0*" }, /* Clear break points */ 616 { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ 617 { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */ 618 { "do_fork", "OK", sw_rem_break }, /*remove breakpoint */ 619 { "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */ 620 { "write", "OK", write_regs, emul_reset }, /* Write registers */ 621 { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ 622 { "g", "do_fork", NULL, check_single_step }, 623 { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ 624 { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ 625 { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ 626 { "", "", get_cont_catch, put_cont_catch }, 627}; 628 629/* Test for hitting a breakpoint at sys_open for what ever the number 630 * of iterations required by the variable repeat_test. 631 */ 632static struct test_struct sys_open_test[] = { 633 { "?", "S0*" }, /* Clear break points */ 634 { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ 635 { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */ 636 { "sys_open", "OK", sw_rem_break }, /*remove breakpoint */ 637 { "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */ 638 { "write", "OK", write_regs, emul_reset }, /* Write registers */ 639 { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ 640 { "g", "sys_open", NULL, check_single_step }, 641 { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ 642 { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ 643 { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ 644 { "", "", get_cont_catch, put_cont_catch }, 645}; 646 647/* 648 * Test for hitting a simple hw breakpoint 649 */ 650static struct test_struct hw_breakpoint_test[] = { 651 { "?", "S0*" }, /* Clear break points */ 652 { "kgdbts_break_test", "OK", hw_break, }, /* set hw breakpoint */ 653 { "c", "T0*", }, /* Continue */ 654 { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, 655 { "write", "OK", write_regs }, 656 { "kgdbts_break_test", "OK", hw_rem_break }, /*remove breakpoint */ 657 { "D", "OK" }, /* Detach */ 658 { "D", "OK", NULL, got_break }, /* On success we made it here */ 659 { "", "" }, 660}; 661 662/* 663 * Test for hitting a hw write breakpoint 664 */ 665static struct test_struct hw_write_break_test[] = { 666 { "?", "S0*" }, /* Clear break points */ 667 { "hw_break_val", "OK", hw_write_break, }, /* set hw breakpoint */ 668 { "c", "T0*", NULL, got_break }, /* Continue */ 669 { "g", "silent", NULL, check_and_rewind_pc }, 670 { "write", "OK", write_regs }, 671 { "hw_break_val", "OK", hw_rem_write_break }, /*remove breakpoint */ 672 { "D", "OK" }, /* Detach */ 673 { "D", "OK", NULL, got_break }, /* On success we made it here */ 674 { "", "" }, 675}; 676 677/* 678 * Test for hitting a hw access breakpoint 679 */ 680static struct test_struct hw_access_break_test[] = { 681 { "?", "S0*" }, /* Clear break points */ 682 { "hw_break_val", "OK", hw_access_break, }, /* set hw breakpoint */ 683 { "c", "T0*", NULL, got_break }, /* Continue */ 684 { "g", "silent", NULL, check_and_rewind_pc }, 685 { "write", "OK", write_regs }, 686 { "hw_break_val", "OK", hw_rem_access_break }, /*remove breakpoint */ 687 { "D", "OK" }, /* Detach */ 688 { "D", "OK", NULL, got_break }, /* On success we made it here */ 689 { "", "" }, 690}; 691 692/* 693 * Test for hitting a hw access breakpoint 694 */ 695static struct test_struct nmi_sleep_test[] = { 696 { "?", "S0*" }, /* Clear break points */ 697 { "c", "T0*", NULL, got_break }, /* Continue */ 698 { "D", "OK" }, /* Detach */ 699 { "D", "OK", NULL, got_break }, /* On success we made it here */ 700 { "", "" }, 701}; 702 703static void fill_get_buf(char *buf) 704{ 705 unsigned char checksum = 0; 706 int count = 0; 707 char ch; 708 709 strcpy(get_buf, "$"); 710 strcat(get_buf, buf); 711 while ((ch = buf[count])) { 712 checksum += ch; 713 count++; 714 } 715 strcat(get_buf, "#"); 716 get_buf[count + 2] = hex_asc_hi(checksum); 717 get_buf[count + 3] = hex_asc_lo(checksum); 718 get_buf[count + 4] = '\0'; 719 v2printk("get%i: %s\n", ts.idx, get_buf); 720} 721 722static int validate_simple_test(char *put_str) 723{ 724 char *chk_str; 725 726 if (ts.tst[ts.idx].put_handler) 727 return ts.tst[ts.idx].put_handler(put_str, 728 ts.tst[ts.idx].put); 729 730 chk_str = ts.tst[ts.idx].put; 731 if (*put_str == '$') 732 put_str++; 733 734 while (*chk_str != '\0' && *put_str != '\0') { 735 /* If someone does a * to match the rest of the string, allow 736 * it, or stop if the received string is complete. 737 */ 738 if (*put_str == '#' || *chk_str == '*') 739 return 0; 740 if (*put_str != *chk_str) 741 return 1; 742 743 chk_str++; 744 put_str++; 745 } 746 if (*chk_str == '\0' && (*put_str == '\0' || *put_str == '#')) 747 return 0; 748 749 return 1; 750} 751 752static int run_simple_test(int is_get_char, int chr) 753{ 754 int ret = 0; 755 if (is_get_char) { 756 /* Send an ACK on the get if a prior put completed and set the 757 * send ack variable 758 */ 759 if (send_ack) { 760 send_ack = 0; 761 return '+'; 762 } 763 /* On the first get char, fill the transmit buffer and then 764 * take from the get_string. 765 */ 766 if (get_buf_cnt == 0) { 767 if (ts.tst[ts.idx].get_handler) 768 ts.tst[ts.idx].get_handler(ts.tst[ts.idx].get); 769 else 770 fill_get_buf(ts.tst[ts.idx].get); 771 } 772 773 if (get_buf[get_buf_cnt] == '\0') { 774 eprintk("kgdbts: ERROR GET: EOB on '%s' at %i\n", 775 ts.name, ts.idx); 776 get_buf_cnt = 0; 777 fill_get_buf("D"); 778 } 779 ret = get_buf[get_buf_cnt]; 780 get_buf_cnt++; 781 return ret; 782 } 783 784 /* This callback is a put char which is when kgdb sends data to 785 * this I/O module. 786 */ 787 if (ts.tst[ts.idx].get[0] == '\0' && ts.tst[ts.idx].put[0] == '\0' && 788 !ts.tst[ts.idx].get_handler) { 789 eprintk("kgdbts: ERROR: beyond end of test on" 790 " '%s' line %i\n", ts.name, ts.idx); 791 return 0; 792 } 793 794 if (put_buf_cnt >= BUFMAX) { 795 eprintk("kgdbts: ERROR: put buffer overflow on" 796 " '%s' line %i\n", ts.name, ts.idx); 797 put_buf_cnt = 0; 798 return 0; 799 } 800 /* Ignore everything until the first valid packet start '$' */ 801 if (put_buf_cnt == 0 && chr != '$') 802 return 0; 803 804 put_buf[put_buf_cnt] = chr; 805 put_buf_cnt++; 806 807 /* End of packet == #XX so look for the '#' */ 808 if (put_buf_cnt > 3 && put_buf[put_buf_cnt - 3] == '#') { 809 if (put_buf_cnt >= BUFMAX) { 810 eprintk("kgdbts: ERROR: put buffer overflow on" 811 " '%s' line %i\n", ts.name, ts.idx); 812 put_buf_cnt = 0; 813 return 0; 814 } 815 put_buf[put_buf_cnt] = '\0'; 816 v2printk("put%i: %s\n", ts.idx, put_buf); 817 /* Trigger check here */ 818 if (ts.validate_put && ts.validate_put(put_buf)) { 819 eprintk("kgdbts: ERROR PUT: end of test " 820 "buffer on '%s' line %i expected %s got %s\n", 821 ts.name, ts.idx, ts.tst[ts.idx].put, put_buf); 822 } 823 ts.idx++; 824 put_buf_cnt = 0; 825 get_buf_cnt = 0; 826 send_ack = 1; 827 } 828 return 0; 829} 830 831static void init_simple_test(void) 832{ 833 memset(&ts, 0, sizeof(ts)); 834 ts.run_test = run_simple_test; 835 ts.validate_put = validate_simple_test; 836} 837 838static void run_plant_and_detach_test(int is_early) 839{ 840 char before[BREAK_INSTR_SIZE]; 841 char after[BREAK_INSTR_SIZE]; 842 843 probe_kernel_read(before, (char *)kgdbts_break_test, 844 BREAK_INSTR_SIZE); 845 init_simple_test(); 846 ts.tst = plant_and_detach_test; 847 ts.name = "plant_and_detach_test"; 848 /* Activate test with initial breakpoint */ 849 if (!is_early) 850 kgdb_breakpoint(); 851 probe_kernel_read(after, (char *)kgdbts_break_test, 852 BREAK_INSTR_SIZE); 853 if (memcmp(before, after, BREAK_INSTR_SIZE)) { 854 printk(KERN_CRIT "kgdbts: ERROR kgdb corrupted memory\n"); 855 panic("kgdb memory corruption"); 856 } 857 858 /* complete the detach test */ 859 if (!is_early) 860 kgdbts_break_test(); 861} 862 863static void run_breakpoint_test(int is_hw_breakpoint) 864{ 865 test_complete = 0; 866 init_simple_test(); 867 if (is_hw_breakpoint) { 868 ts.tst = hw_breakpoint_test; 869 ts.name = "hw_breakpoint_test"; 870 } else { 871 ts.tst = sw_breakpoint_test; 872 ts.name = "sw_breakpoint_test"; 873 } 874 /* Activate test with initial breakpoint */ 875 kgdb_breakpoint(); 876 /* run code with the break point in it */ 877 kgdbts_break_test(); 878 kgdb_breakpoint(); 879 880 if (test_complete) 881 return; 882 883 eprintk("kgdbts: ERROR %s test failed\n", ts.name); 884 if (is_hw_breakpoint) 885 hwbreaks_ok = 0; 886} 887 888static void run_hw_break_test(int is_write_test) 889{ 890 test_complete = 0; 891 init_simple_test(); 892 if (is_write_test) { 893 ts.tst = hw_write_break_test; 894 ts.name = "hw_write_break_test"; 895 } else { 896 ts.tst = hw_access_break_test; 897 ts.name = "hw_access_break_test"; 898 } 899 /* Activate test with initial breakpoint */ 900 kgdb_breakpoint(); 901 hw_break_val_access(); 902 if (is_write_test) { 903 if (test_complete == 2) { 904 eprintk("kgdbts: ERROR %s broke on access\n", 905 ts.name); 906 hwbreaks_ok = 0; 907 } 908 hw_break_val_write(); 909 } 910 kgdb_breakpoint(); 911 912 if (test_complete == 1) 913 return; 914 915 eprintk("kgdbts: ERROR %s test failed\n", ts.name); 916 hwbreaks_ok = 0; 917} 918 919static void run_nmi_sleep_test(int nmi_sleep) 920{ 921 unsigned long flags; 922 923 init_simple_test(); 924 ts.tst = nmi_sleep_test; 925 ts.name = "nmi_sleep_test"; 926 /* Activate test with initial breakpoint */ 927 kgdb_breakpoint(); 928 local_irq_save(flags); 929 mdelay(nmi_sleep*1000); 930 touch_nmi_watchdog(); 931 local_irq_restore(flags); 932 if (test_complete != 2) 933 eprintk("kgdbts: ERROR nmi_test did not hit nmi\n"); 934 kgdb_breakpoint(); 935 if (test_complete == 1) 936 return; 937 938 eprintk("kgdbts: ERROR %s test failed\n", ts.name); 939} 940 941static void run_bad_read_test(void) 942{ 943 init_simple_test(); 944 ts.tst = bad_read_test; 945 ts.name = "bad_read_test"; 946 /* Activate test with initial breakpoint */ 947 kgdb_breakpoint(); 948} 949 950static void run_do_fork_test(void) 951{ 952 init_simple_test(); 953 ts.tst = do_fork_test; 954 ts.name = "do_fork_test"; 955 /* Activate test with initial breakpoint */ 956 kgdb_breakpoint(); 957} 958 959static void run_sys_open_test(void) 960{ 961 init_simple_test(); 962 ts.tst = sys_open_test; 963 ts.name = "sys_open_test"; 964 /* Activate test with initial breakpoint */ 965 kgdb_breakpoint(); 966} 967 968static void run_singlestep_break_test(void) 969{ 970 init_simple_test(); 971 ts.tst = singlestep_break_test; 972 ts.name = "singlestep_breakpoint_test"; 973 /* Activate test with initial breakpoint */ 974 kgdb_breakpoint(); 975 kgdbts_break_test(); 976 kgdbts_break_test(); 977} 978 979static void kgdbts_run_tests(void) 980{ 981 char *ptr; 982 int fork_test = 0; 983 int do_sys_open_test = 0; 984 int sstep_test = 1000; 985 int nmi_sleep = 0; 986 int i; 987 988 ptr = strchr(config, 'F'); 989 if (ptr) 990 fork_test = simple_strtol(ptr + 1, NULL, 10); 991 ptr = strchr(config, 'S'); 992 if (ptr) 993 do_sys_open_test = simple_strtol(ptr + 1, NULL, 10); 994 ptr = strchr(config, 'N'); 995 if (ptr) 996 nmi_sleep = simple_strtol(ptr+1, NULL, 10); 997 ptr = strchr(config, 'I'); 998 if (ptr) 999 sstep_test = simple_strtol(ptr+1, NULL, 10); 1000 1001 /* All HW break point tests */ 1002 if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { 1003 hwbreaks_ok = 1; 1004 v1printk("kgdbts:RUN hw breakpoint test\n"); 1005 run_breakpoint_test(1); 1006 v1printk("kgdbts:RUN hw write breakpoint test\n"); 1007 run_hw_break_test(1); 1008 v1printk("kgdbts:RUN access write breakpoint test\n"); 1009 run_hw_break_test(0); 1010 } 1011 1012 /* required internal KGDB tests */ 1013 v1printk("kgdbts:RUN plant and detach test\n"); 1014 run_plant_and_detach_test(0); 1015 v1printk("kgdbts:RUN sw breakpoint test\n"); 1016 run_breakpoint_test(0); 1017 v1printk("kgdbts:RUN bad memory access test\n"); 1018 run_bad_read_test(); 1019 v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test); 1020 for (i = 0; i < sstep_test; i++) { 1021 run_singlestep_break_test(); 1022 if (i % 100 == 0) 1023 v1printk("kgdbts:RUN singlestep [%i/%i]\n", 1024 i, sstep_test); 1025 } 1026 1027 /* ===Optional tests=== */ 1028 1029 if (nmi_sleep) { 1030 v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep); 1031 run_nmi_sleep_test(nmi_sleep); 1032 } 1033 1034 /* If the do_fork test is run it will be the last test that is 1035 * executed because a kernel thread will be spawned at the very 1036 * end to unregister the debug hooks. 1037 */ 1038 if (fork_test) { 1039 repeat_test = fork_test; 1040 printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n", 1041 repeat_test); 1042 kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); 1043 run_do_fork_test(); 1044 return; 1045 } 1046 1047 /* If the sys_open test is run it will be the last test that is 1048 * executed because a kernel thread will be spawned at the very 1049 * end to unregister the debug hooks. 1050 */ 1051 if (do_sys_open_test) { 1052 repeat_test = do_sys_open_test; 1053 printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n", 1054 repeat_test); 1055 kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); 1056 run_sys_open_test(); 1057 return; 1058 } 1059 /* Shutdown and unregister */ 1060 kgdb_unregister_io_module(&kgdbts_io_ops); 1061 configured = 0; 1062} 1063 1064static int kgdbts_option_setup(char *opt) 1065{ 1066 if (strlen(opt) >= MAX_CONFIG_LEN) { 1067 printk(KERN_ERR "kgdbts: config string too long\n"); 1068 return -ENOSPC; 1069 } 1070 strcpy(config, opt); 1071 1072 verbose = 0; 1073 if (strstr(config, "V1")) 1074 verbose = 1; 1075 if (strstr(config, "V2")) 1076 verbose = 2; 1077 1078 return 0; 1079} 1080 1081__setup("kgdbts=", kgdbts_option_setup); 1082 1083static int configure_kgdbts(void) 1084{ 1085 int err = 0; 1086 1087 if (!strlen(config) || isspace(config[0])) 1088 goto noconfig; 1089 err = kgdbts_option_setup(config); 1090 if (err) 1091 goto noconfig; 1092 1093 final_ack = 0; 1094 run_plant_and_detach_test(1); 1095 1096 err = kgdb_register_io_module(&kgdbts_io_ops); 1097 if (err) { 1098 configured = 0; 1099 return err; 1100 } 1101 configured = 1; 1102 kgdbts_run_tests(); 1103 1104 return err; 1105 1106noconfig: 1107 config[0] = 0; 1108 configured = 0; 1109 1110 return err; 1111} 1112 1113static int __init init_kgdbts(void) 1114{ 1115 /* Already configured? */ 1116 if (configured == 1) 1117 return 0; 1118 1119 return configure_kgdbts(); 1120} 1121device_initcall(init_kgdbts); 1122 1123static int kgdbts_get_char(void) 1124{ 1125 int val = 0; 1126 1127 if (ts.run_test) 1128 val = ts.run_test(1, 0); 1129 1130 return val; 1131} 1132 1133static void kgdbts_put_char(u8 chr) 1134{ 1135 if (ts.run_test) 1136 ts.run_test(0, chr); 1137} 1138 1139static int param_set_kgdbts_var(const char *kmessage, 1140 const struct kernel_param *kp) 1141{ 1142 int len = strlen(kmessage); 1143 1144 if (len >= MAX_CONFIG_LEN) { 1145 printk(KERN_ERR "kgdbts: config string too long\n"); 1146 return -ENOSPC; 1147 } 1148 1149 /* Only copy in the string if the init function has not run yet */ 1150 if (configured < 0) { 1151 strcpy(config, kmessage); 1152 return 0; 1153 } 1154 1155 if (configured == 1) { 1156 printk(KERN_ERR "kgdbts: ERROR: Already configured and running.\n"); 1157 return -EBUSY; 1158 } 1159 1160 strcpy(config, kmessage); 1161 /* Chop out \n char as a result of echo */ 1162 if (config[len - 1] == '\n') 1163 config[len - 1] = '\0'; 1164 1165 /* Go and configure with the new params. */ 1166 return configure_kgdbts(); 1167} 1168 1169static void kgdbts_pre_exp_handler(void) 1170{ 1171 /* Increment the module count when the debugger is active */ 1172 if (!kgdb_connected) 1173 try_module_get(THIS_MODULE); 1174} 1175 1176static void kgdbts_post_exp_handler(void) 1177{ 1178 /* decrement the module count when the debugger detaches */ 1179 if (!kgdb_connected) 1180 module_put(THIS_MODULE); 1181} 1182 1183static struct kgdb_io kgdbts_io_ops = { 1184 .name = "kgdbts", 1185 .read_char = kgdbts_get_char, 1186 .write_char = kgdbts_put_char, 1187 .pre_exception = kgdbts_pre_exp_handler, 1188 .post_exception = kgdbts_post_exp_handler, 1189}; 1190 1191/* 1192 * not really modular, but the easiest way to keep compat with existing 1193 * bootargs behaviour is to continue using module_param here. 1194 */ 1195module_param_call(kgdbts, param_set_kgdbts_var, param_get_string, &kps, 0644); 1196MODULE_PARM_DESC(kgdbts, "<A|V1|V2>[F#|S#][N#]");