linux/drivers/misc/kgdbts.c
<<
>>
Prefs
   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                ts.idx -= go_back;
 407        fill_get_buf(ts.tst[ts.idx].get);
 408}
 409
 410static int got_break(char *put_str, char *arg)
 411{
 412        test_complete = 1;
 413        if (!strncmp(put_str+1, arg, 2)) {
 414                if (!strncmp(arg, "T0", 2))
 415                        test_complete = 2;
 416                return 0;
 417        }
 418        return 1;
 419}
 420
 421static void get_cont_catch(char *arg)
 422{
 423        /* Always send detach because the test is completed at this point */
 424        fill_get_buf("D");
 425}
 426
 427static int put_cont_catch(char *put_str, char *arg)
 428{
 429        /* This is at the end of the test and we catch any and all input */
 430        v2printk("kgdbts: cleanup task: %lx\n", sstep_thread_id);
 431        ts.idx--;
 432        return 0;
 433}
 434
 435static int emul_reset(char *put_str, char *arg)
 436{
 437        if (strncmp(put_str, "$OK", 3))
 438                return 1;
 439        if (restart_from_top_after_write) {
 440                restart_from_top_after_write = 0;
 441                ts.idx = -1;
 442        }
 443        return 0;
 444}
 445
 446static void emul_sstep_get(char *arg)
 447{
 448        if (!arch_needs_sstep_emulation) {
 449                if (cont_instead_of_sstep) {
 450                        cont_instead_of_sstep = 0;
 451                        fill_get_buf("c");
 452                } else {
 453                        fill_get_buf(arg);
 454                }
 455                return;
 456        }
 457        switch (sstep_state) {
 458        case 0:
 459                v2printk("Emulate single step\n");
 460                /* Start by looking at the current PC */
 461                fill_get_buf("g");
 462                break;
 463        case 1:
 464                /* set breakpoint */
 465                break_helper("Z0", NULL, sstep_addr);
 466                break;
 467        case 2:
 468                /* Continue */
 469                fill_get_buf("c");
 470                break;
 471        case 3:
 472                /* Clear breakpoint */
 473                break_helper("z0", NULL, sstep_addr);
 474                break;
 475        default:
 476                eprintk("kgdbts: ERROR failed sstep get emulation\n");
 477        }
 478        sstep_state++;
 479}
 480
 481static int emul_sstep_put(char *put_str, char *arg)
 482{
 483        if (!arch_needs_sstep_emulation) {
 484                char *ptr = &put_str[11];
 485                if (put_str[1] != 'T' || put_str[2] != '0')
 486                        return 1;
 487                kgdb_hex2long(&ptr, &sstep_thread_id);
 488                return 0;
 489        }
 490        switch (sstep_state) {
 491        case 1:
 492                /* validate the "g" packet to get the IP */
 493                kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs,
 494                         NUMREGBYTES);
 495                gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
 496                v2printk("Stopped at IP: %lx\n",
 497                         instruction_pointer(&kgdbts_regs));
 498                /* Want to stop at IP + break instruction size by default */
 499                sstep_addr = cont_addr + BREAK_INSTR_SIZE;
 500                break;
 501        case 2:
 502                if (strncmp(put_str, "$OK", 3)) {
 503                        eprintk("kgdbts: failed sstep break set\n");
 504                        return 1;
 505                }
 506                break;
 507        case 3:
 508                if (strncmp(put_str, "$T0", 3)) {
 509                        eprintk("kgdbts: failed continue sstep\n");
 510                        return 1;
 511                } else {
 512                        char *ptr = &put_str[11];
 513                        kgdb_hex2long(&ptr, &sstep_thread_id);
 514                }
 515                break;
 516        case 4:
 517                if (strncmp(put_str, "$OK", 3)) {
 518                        eprintk("kgdbts: failed sstep break unset\n");
 519                        return 1;
 520                }
 521                /* Single step is complete so continue on! */
 522                sstep_state = 0;
 523                return 0;
 524        default:
 525                eprintk("kgdbts: ERROR failed sstep put emulation\n");
 526        }
 527
 528        /* Continue on the same test line until emulation is complete */
 529        ts.idx--;
 530        return 0;
 531}
 532
 533static int final_ack_set(char *put_str, char *arg)
 534{
 535        if (strncmp(put_str+1, arg, 2))
 536                return 1;
 537        final_ack = 1;
 538        return 0;
 539}
 540/*
 541 * Test to plant a breakpoint and detach, which should clear out the
 542 * breakpoint and restore the original instruction.
 543 */
 544static struct test_struct plant_and_detach_test[] = {
 545        { "?", "S0*" }, /* Clear break points */
 546        { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
 547        { "D", "OK" }, /* Detach */
 548        { "", "" },
 549};
 550
 551/*
 552 * Simple test to write in a software breakpoint, check for the
 553 * correct stop location and detach.
 554 */
 555static struct test_struct sw_breakpoint_test[] = {
 556        { "?", "S0*" }, /* Clear break points */
 557        { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
 558        { "c", "T0*", }, /* Continue */
 559        { "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
 560        { "write", "OK", write_regs },
 561        { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
 562        { "D", "OK" }, /* Detach */
 563        { "D", "OK", NULL,  got_break }, /* On success we made it here */
 564        { "", "" },
 565};
 566
 567/*
 568 * Test a known bad memory read location to test the fault handler and
 569 * read bytes 1-8 at the bad address
 570 */
 571static struct test_struct bad_read_test[] = {
 572        { "?", "S0*" }, /* Clear break points */
 573        { "m0,1", "E*" }, /* read 1 byte at address 1 */
 574        { "m0,2", "E*" }, /* read 1 byte at address 2 */
 575        { "m0,3", "E*" }, /* read 1 byte at address 3 */
 576        { "m0,4", "E*" }, /* read 1 byte at address 4 */
 577        { "m0,5", "E*" }, /* read 1 byte at address 5 */
 578        { "m0,6", "E*" }, /* read 1 byte at address 6 */
 579        { "m0,7", "E*" }, /* read 1 byte at address 7 */
 580        { "m0,8", "E*" }, /* read 1 byte at address 8 */
 581        { "D", "OK" }, /* Detach which removes all breakpoints and continues */
 582        { "", "" },
 583};
 584
 585/*
 586 * Test for hitting a breakpoint, remove it, single step, plant it
 587 * again and detach.
 588 */
 589static struct test_struct singlestep_break_test[] = {
 590        { "?", "S0*" }, /* Clear break points */
 591        { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
 592        { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
 593        { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
 594        { "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
 595        { "write", "OK", write_regs }, /* Write registers */
 596        { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
 597        { "g", "kgdbts_break_test", NULL, check_single_step },
 598        { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
 599        { "c", "T0*", }, /* Continue */
 600        { "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
 601        { "write", "OK", write_regs }, /* Write registers */
 602        { "D", "OK" }, /* Remove all breakpoints and continues */
 603        { "", "" },
 604};
 605
 606/*
 607 * Test for hitting a breakpoint at do_fork for what ever the number
 608 * of iterations required by the variable repeat_test.
 609 */
 610static struct test_struct do_fork_test[] = {
 611        { "?", "S0*" }, /* Clear break points */
 612        { "do_fork", "OK", sw_break, }, /* set sw breakpoint */
 613        { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
 614        { "do_fork", "OK", sw_rem_break }, /*remove breakpoint */
 615        { "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */
 616        { "write", "OK", write_regs, emul_reset }, /* Write registers */
 617        { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
 618        { "g", "do_fork", NULL, check_single_step },
 619        { "do_fork", "OK", sw_break, }, /* set sw breakpoint */
 620        { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
 621        { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
 622        { "", "", get_cont_catch, put_cont_catch },
 623};
 624
 625/* Test for hitting a breakpoint at sys_open for what ever the number
 626 * of iterations required by the variable repeat_test.
 627 */
 628static struct test_struct sys_open_test[] = {
 629        { "?", "S0*" }, /* Clear break points */
 630        { "sys_open", "OK", sw_break, }, /* set sw breakpoint */
 631        { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
 632        { "sys_open", "OK", sw_rem_break }, /*remove breakpoint */
 633        { "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */
 634        { "write", "OK", write_regs, emul_reset }, /* Write registers */
 635        { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
 636        { "g", "sys_open", NULL, check_single_step },
 637        { "sys_open", "OK", sw_break, }, /* set sw breakpoint */
 638        { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
 639        { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
 640        { "", "", get_cont_catch, put_cont_catch },
 641};
 642
 643/*
 644 * Test for hitting a simple hw breakpoint
 645 */
 646static struct test_struct hw_breakpoint_test[] = {
 647        { "?", "S0*" }, /* Clear break points */
 648        { "kgdbts_break_test", "OK", hw_break, }, /* set hw breakpoint */
 649        { "c", "T0*", }, /* Continue */
 650        { "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
 651        { "write", "OK", write_regs },
 652        { "kgdbts_break_test", "OK", hw_rem_break }, /*remove breakpoint */
 653        { "D", "OK" }, /* Detach */
 654        { "D", "OK", NULL,  got_break }, /* On success we made it here */
 655        { "", "" },
 656};
 657
 658/*
 659 * Test for hitting a hw write breakpoint
 660 */
 661static struct test_struct hw_write_break_test[] = {
 662        { "?", "S0*" }, /* Clear break points */
 663        { "hw_break_val", "OK", hw_write_break, }, /* set hw breakpoint */
 664        { "c", "T0*", NULL, got_break }, /* Continue */
 665        { "g", "silent", NULL, check_and_rewind_pc },
 666        { "write", "OK", write_regs },
 667        { "hw_break_val", "OK", hw_rem_write_break }, /*remove breakpoint */
 668        { "D", "OK" }, /* Detach */
 669        { "D", "OK", NULL,  got_break }, /* On success we made it here */
 670        { "", "" },
 671};
 672
 673/*
 674 * Test for hitting a hw access breakpoint
 675 */
 676static struct test_struct hw_access_break_test[] = {
 677        { "?", "S0*" }, /* Clear break points */
 678        { "hw_break_val", "OK", hw_access_break, }, /* set hw breakpoint */
 679        { "c", "T0*", NULL, got_break }, /* Continue */
 680        { "g", "silent", NULL, check_and_rewind_pc },
 681        { "write", "OK", write_regs },
 682        { "hw_break_val", "OK", hw_rem_access_break }, /*remove breakpoint */
 683        { "D", "OK" }, /* Detach */
 684        { "D", "OK", NULL,  got_break }, /* On success we made it here */
 685        { "", "" },
 686};
 687
 688/*
 689 * Test for hitting a hw access breakpoint
 690 */
 691static struct test_struct nmi_sleep_test[] = {
 692        { "?", "S0*" }, /* Clear break points */
 693        { "c", "T0*", NULL, got_break }, /* Continue */
 694        { "D", "OK" }, /* Detach */
 695        { "D", "OK", NULL,  got_break }, /* On success we made it here */
 696        { "", "" },
 697};
 698
 699static void fill_get_buf(char *buf)
 700{
 701        unsigned char checksum = 0;
 702        int count = 0;
 703        char ch;
 704
 705        strcpy(get_buf, "$");
 706        strcat(get_buf, buf);
 707        while ((ch = buf[count])) {
 708                checksum += ch;
 709                count++;
 710        }
 711        strcat(get_buf, "#");
 712        get_buf[count + 2] = hex_asc_hi(checksum);
 713        get_buf[count + 3] = hex_asc_lo(checksum);
 714        get_buf[count + 4] = '\0';
 715        v2printk("get%i: %s\n", ts.idx, get_buf);
 716}
 717
 718static int validate_simple_test(char *put_str)
 719{
 720        char *chk_str;
 721
 722        if (ts.tst[ts.idx].put_handler)
 723                return ts.tst[ts.idx].put_handler(put_str,
 724                        ts.tst[ts.idx].put);
 725
 726        chk_str = ts.tst[ts.idx].put;
 727        if (*put_str == '$')
 728                put_str++;
 729
 730        while (*chk_str != '\0' && *put_str != '\0') {
 731                /* If someone does a * to match the rest of the string, allow
 732                 * it, or stop if the received string is complete.
 733                 */
 734                if (*put_str == '#' || *chk_str == '*')
 735                        return 0;
 736                if (*put_str != *chk_str)
 737                        return 1;
 738
 739                chk_str++;
 740                put_str++;
 741        }
 742        if (*chk_str == '\0' && (*put_str == '\0' || *put_str == '#'))
 743                return 0;
 744
 745        return 1;
 746}
 747
 748static int run_simple_test(int is_get_char, int chr)
 749{
 750        int ret = 0;
 751        if (is_get_char) {
 752                /* Send an ACK on the get if a prior put completed and set the
 753                 * send ack variable
 754                 */
 755                if (send_ack) {
 756                        send_ack = 0;
 757                        return '+';
 758                }
 759                /* On the first get char, fill the transmit buffer and then
 760                 * take from the get_string.
 761                 */
 762                if (get_buf_cnt == 0) {
 763                        if (ts.tst[ts.idx].get_handler)
 764                                ts.tst[ts.idx].get_handler(ts.tst[ts.idx].get);
 765                        else
 766                                fill_get_buf(ts.tst[ts.idx].get);
 767                }
 768
 769                if (get_buf[get_buf_cnt] == '\0') {
 770                        eprintk("kgdbts: ERROR GET: EOB on '%s' at %i\n",
 771                           ts.name, ts.idx);
 772                        get_buf_cnt = 0;
 773                        fill_get_buf("D");
 774                }
 775                ret = get_buf[get_buf_cnt];
 776                get_buf_cnt++;
 777                return ret;
 778        }
 779
 780        /* This callback is a put char which is when kgdb sends data to
 781         * this I/O module.
 782         */
 783        if (ts.tst[ts.idx].get[0] == '\0' && ts.tst[ts.idx].put[0] == '\0' &&
 784            !ts.tst[ts.idx].get_handler) {
 785                eprintk("kgdbts: ERROR: beyond end of test on"
 786                           " '%s' line %i\n", ts.name, ts.idx);
 787                return 0;
 788        }
 789
 790        if (put_buf_cnt >= BUFMAX) {
 791                eprintk("kgdbts: ERROR: put buffer overflow on"
 792                           " '%s' line %i\n", ts.name, ts.idx);
 793                put_buf_cnt = 0;
 794                return 0;
 795        }
 796        /* Ignore everything until the first valid packet start '$' */
 797        if (put_buf_cnt == 0 && chr != '$')
 798                return 0;
 799
 800        put_buf[put_buf_cnt] = chr;
 801        put_buf_cnt++;
 802
 803        /* End of packet == #XX so look for the '#' */
 804        if (put_buf_cnt > 3 && put_buf[put_buf_cnt - 3] == '#') {
 805                if (put_buf_cnt >= BUFMAX) {
 806                        eprintk("kgdbts: ERROR: put buffer overflow on"
 807                                " '%s' line %i\n", ts.name, ts.idx);
 808                        put_buf_cnt = 0;
 809                        return 0;
 810                }
 811                put_buf[put_buf_cnt] = '\0';
 812                v2printk("put%i: %s\n", ts.idx, put_buf);
 813                /* Trigger check here */
 814                if (ts.validate_put && ts.validate_put(put_buf)) {
 815                        eprintk("kgdbts: ERROR PUT: end of test "
 816                           "buffer on '%s' line %i expected %s got %s\n",
 817                           ts.name, ts.idx, ts.tst[ts.idx].put, put_buf);
 818                }
 819                ts.idx++;
 820                put_buf_cnt = 0;
 821                get_buf_cnt = 0;
 822                send_ack = 1;
 823        }
 824        return 0;
 825}
 826
 827static void init_simple_test(void)
 828{
 829        memset(&ts, 0, sizeof(ts));
 830        ts.run_test = run_simple_test;
 831        ts.validate_put = validate_simple_test;
 832}
 833
 834static void run_plant_and_detach_test(int is_early)
 835{
 836        char before[BREAK_INSTR_SIZE];
 837        char after[BREAK_INSTR_SIZE];
 838
 839        probe_kernel_read(before, (char *)kgdbts_break_test,
 840          BREAK_INSTR_SIZE);
 841        init_simple_test();
 842        ts.tst = plant_and_detach_test;
 843        ts.name = "plant_and_detach_test";
 844        /* Activate test with initial breakpoint */
 845        if (!is_early)
 846                kgdb_breakpoint();
 847        probe_kernel_read(after, (char *)kgdbts_break_test,
 848          BREAK_INSTR_SIZE);
 849        if (memcmp(before, after, BREAK_INSTR_SIZE)) {
 850                printk(KERN_CRIT "kgdbts: ERROR kgdb corrupted memory\n");
 851                panic("kgdb memory corruption");
 852        }
 853
 854        /* complete the detach test */
 855        if (!is_early)
 856                kgdbts_break_test();
 857}
 858
 859static void run_breakpoint_test(int is_hw_breakpoint)
 860{
 861        test_complete = 0;
 862        init_simple_test();
 863        if (is_hw_breakpoint) {
 864                ts.tst = hw_breakpoint_test;
 865                ts.name = "hw_breakpoint_test";
 866        } else {
 867                ts.tst = sw_breakpoint_test;
 868                ts.name = "sw_breakpoint_test";
 869        }
 870        /* Activate test with initial breakpoint */
 871        kgdb_breakpoint();
 872        /* run code with the break point in it */
 873        kgdbts_break_test();
 874        kgdb_breakpoint();
 875
 876        if (test_complete)
 877                return;
 878
 879        eprintk("kgdbts: ERROR %s test failed\n", ts.name);
 880        if (is_hw_breakpoint)
 881                hwbreaks_ok = 0;
 882}
 883
 884static void run_hw_break_test(int is_write_test)
 885{
 886        test_complete = 0;
 887        init_simple_test();
 888        if (is_write_test) {
 889                ts.tst = hw_write_break_test;
 890                ts.name = "hw_write_break_test";
 891        } else {
 892                ts.tst = hw_access_break_test;
 893                ts.name = "hw_access_break_test";
 894        }
 895        /* Activate test with initial breakpoint */
 896        kgdb_breakpoint();
 897        hw_break_val_access();
 898        if (is_write_test) {
 899                if (test_complete == 2) {
 900                        eprintk("kgdbts: ERROR %s broke on access\n",
 901                                ts.name);
 902                        hwbreaks_ok = 0;
 903                }
 904                hw_break_val_write();
 905        }
 906        kgdb_breakpoint();
 907
 908        if (test_complete == 1)
 909                return;
 910
 911        eprintk("kgdbts: ERROR %s test failed\n", ts.name);
 912        hwbreaks_ok = 0;
 913}
 914
 915static void run_nmi_sleep_test(int nmi_sleep)
 916{
 917        unsigned long flags;
 918
 919        init_simple_test();
 920        ts.tst = nmi_sleep_test;
 921        ts.name = "nmi_sleep_test";
 922        /* Activate test with initial breakpoint */
 923        kgdb_breakpoint();
 924        local_irq_save(flags);
 925        mdelay(nmi_sleep*1000);
 926        touch_nmi_watchdog();
 927        local_irq_restore(flags);
 928        if (test_complete != 2)
 929                eprintk("kgdbts: ERROR nmi_test did not hit nmi\n");
 930        kgdb_breakpoint();
 931        if (test_complete == 1)
 932                return;
 933
 934        eprintk("kgdbts: ERROR %s test failed\n", ts.name);
 935}
 936
 937static void run_bad_read_test(void)
 938{
 939        init_simple_test();
 940        ts.tst = bad_read_test;
 941        ts.name = "bad_read_test";
 942        /* Activate test with initial breakpoint */
 943        kgdb_breakpoint();
 944}
 945
 946static void run_do_fork_test(void)
 947{
 948        init_simple_test();
 949        ts.tst = do_fork_test;
 950        ts.name = "do_fork_test";
 951        /* Activate test with initial breakpoint */
 952        kgdb_breakpoint();
 953}
 954
 955static void run_sys_open_test(void)
 956{
 957        init_simple_test();
 958        ts.tst = sys_open_test;
 959        ts.name = "sys_open_test";
 960        /* Activate test with initial breakpoint */
 961        kgdb_breakpoint();
 962}
 963
 964static void run_singlestep_break_test(void)
 965{
 966        init_simple_test();
 967        ts.tst = singlestep_break_test;
 968        ts.name = "singlestep_breakpoint_test";
 969        /* Activate test with initial breakpoint */
 970        kgdb_breakpoint();
 971        kgdbts_break_test();
 972        kgdbts_break_test();
 973}
 974
 975static void kgdbts_run_tests(void)
 976{
 977        char *ptr;
 978        int fork_test = 0;
 979        int do_sys_open_test = 0;
 980        int sstep_test = 1000;
 981        int nmi_sleep = 0;
 982        int i;
 983
 984        ptr = strchr(config, 'F');
 985        if (ptr)
 986                fork_test = simple_strtol(ptr + 1, NULL, 10);
 987        ptr = strchr(config, 'S');
 988        if (ptr)
 989                do_sys_open_test = simple_strtol(ptr + 1, NULL, 10);
 990        ptr = strchr(config, 'N');
 991        if (ptr)
 992                nmi_sleep = simple_strtol(ptr+1, NULL, 10);
 993        ptr = strchr(config, 'I');
 994        if (ptr)
 995                sstep_test = simple_strtol(ptr+1, NULL, 10);
 996
 997        /* All HW break point tests */
 998        if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) {
 999                hwbreaks_ok = 1;
1000                v1printk("kgdbts:RUN hw breakpoint test\n");
1001                run_breakpoint_test(1);
1002                v1printk("kgdbts:RUN hw write breakpoint test\n");
1003                run_hw_break_test(1);
1004                v1printk("kgdbts:RUN access write breakpoint test\n");
1005                run_hw_break_test(0);
1006        }
1007
1008        /* required internal KGDB tests */
1009        v1printk("kgdbts:RUN plant and detach test\n");
1010        run_plant_and_detach_test(0);
1011        v1printk("kgdbts:RUN sw breakpoint test\n");
1012        run_breakpoint_test(0);
1013        v1printk("kgdbts:RUN bad memory access test\n");
1014        run_bad_read_test();
1015        v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test);
1016        for (i = 0; i < sstep_test; i++) {
1017                run_singlestep_break_test();
1018                if (i % 100 == 0)
1019                        v1printk("kgdbts:RUN singlestep [%i/%i]\n",
1020                                 i, sstep_test);
1021        }
1022
1023        /* ===Optional tests=== */
1024
1025        if (nmi_sleep) {
1026                v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep);
1027                run_nmi_sleep_test(nmi_sleep);
1028        }
1029
1030        /* If the do_fork test is run it will be the last test that is
1031         * executed because a kernel thread will be spawned at the very
1032         * end to unregister the debug hooks.
1033         */
1034        if (fork_test) {
1035                repeat_test = fork_test;
1036                printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n",
1037                        repeat_test);
1038                kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg");
1039                run_do_fork_test();
1040                return;
1041        }
1042
1043        /* If the sys_open test is run it will be the last test that is
1044         * executed because a kernel thread will be spawned at the very
1045         * end to unregister the debug hooks.
1046         */
1047        if (do_sys_open_test) {
1048                repeat_test = do_sys_open_test;
1049                printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n",
1050                        repeat_test);
1051                kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg");
1052                run_sys_open_test();
1053                return;
1054        }
1055        /* Shutdown and unregister */
1056        kgdb_unregister_io_module(&kgdbts_io_ops);
1057        configured = 0;
1058}
1059
1060static int kgdbts_option_setup(char *opt)
1061{
1062        if (strlen(opt) >= MAX_CONFIG_LEN) {
1063                printk(KERN_ERR "kgdbts: config string too long\n");
1064                return -ENOSPC;
1065        }
1066        strcpy(config, opt);
1067
1068        verbose = 0;
1069        if (strstr(config, "V1"))
1070                verbose = 1;
1071        if (strstr(config, "V2"))
1072                verbose = 2;
1073
1074        return 0;
1075}
1076
1077__setup("kgdbts=", kgdbts_option_setup);
1078
1079static int configure_kgdbts(void)
1080{
1081        int err = 0;
1082
1083        if (!strlen(config) || isspace(config[0]))
1084                goto noconfig;
1085        err = kgdbts_option_setup(config);
1086        if (err)
1087                goto noconfig;
1088
1089        final_ack = 0;
1090        run_plant_and_detach_test(1);
1091
1092        err = kgdb_register_io_module(&kgdbts_io_ops);
1093        if (err) {
1094                configured = 0;
1095                return err;
1096        }
1097        configured = 1;
1098        kgdbts_run_tests();
1099
1100        return err;
1101
1102noconfig:
1103        config[0] = 0;
1104        configured = 0;
1105
1106        return err;
1107}
1108
1109static int __init init_kgdbts(void)
1110{
1111        /* Already configured? */
1112        if (configured == 1)
1113                return 0;
1114
1115        return configure_kgdbts();
1116}
1117device_initcall(init_kgdbts);
1118
1119static int kgdbts_get_char(void)
1120{
1121        int val = 0;
1122
1123        if (ts.run_test)
1124                val = ts.run_test(1, 0);
1125
1126        return val;
1127}
1128
1129static void kgdbts_put_char(u8 chr)
1130{
1131        if (ts.run_test)
1132                ts.run_test(0, chr);
1133}
1134
1135static int param_set_kgdbts_var(const char *kmessage, struct kernel_param *kp)
1136{
1137        int len = strlen(kmessage);
1138
1139        if (len >= MAX_CONFIG_LEN) {
1140                printk(KERN_ERR "kgdbts: config string too long\n");
1141                return -ENOSPC;
1142        }
1143
1144        /* Only copy in the string if the init function has not run yet */
1145        if (configured < 0) {
1146                strcpy(config, kmessage);
1147                return 0;
1148        }
1149
1150        if (configured == 1) {
1151                printk(KERN_ERR "kgdbts: ERROR: Already configured and running.\n");
1152                return -EBUSY;
1153        }
1154
1155        strcpy(config, kmessage);
1156        /* Chop out \n char as a result of echo */
1157        if (config[len - 1] == '\n')
1158                config[len - 1] = '\0';
1159
1160        /* Go and configure with the new params. */
1161        return configure_kgdbts();
1162}
1163
1164static void kgdbts_pre_exp_handler(void)
1165{
1166        /* Increment the module count when the debugger is active */
1167        if (!kgdb_connected)
1168                try_module_get(THIS_MODULE);
1169}
1170
1171static void kgdbts_post_exp_handler(void)
1172{
1173        /* decrement the module count when the debugger detaches */
1174        if (!kgdb_connected)
1175                module_put(THIS_MODULE);
1176}
1177
1178static struct kgdb_io kgdbts_io_ops = {
1179        .name                   = "kgdbts",
1180        .read_char              = kgdbts_get_char,
1181        .write_char             = kgdbts_put_char,
1182        .pre_exception          = kgdbts_pre_exp_handler,
1183        .post_exception         = kgdbts_post_exp_handler,
1184};
1185
1186/*
1187 * not really modular, but the easiest way to keep compat with existing
1188 * bootargs behaviour is to continue using module_param here.
1189 */
1190module_param_call(kgdbts, param_set_kgdbts_var, param_get_string, &kps, 0644);
1191MODULE_PARM_DESC(kgdbts, "<A|V1|V2>[F#|S#][N#]");
1192