static void cleanup_kgdboc(void) { if (kgdb_unregister_nmi_console()) return; kgdboc_unregister_kbd(); if (configured == 1) kgdb_unregister_io_module(&kgdboc_io_ops); else if (configured == 2) kgdb_unregister_io_module(&kgdboc_io_ops_console); }
static void cleanup_kgdboe(void) { netpoll_cleanup(&np); configured = 0; kgdb_unregister_io_module(&local_kgdb_io_ops); }
static int kgdbts_unreg_thread(void *ptr) { /* Wait until the tests are complete and then ungresiter the I/O * driver. */ while (!final_ack) msleep_interruptible(1500); if (configured) kgdb_unregister_io_module(&kgdbts_io_ops); configured = 0; return 0; }
void kgdboe_io_cleanup(void) { /* We don't check for race conditions between running code by other cores and unloading the module! There is always a small chance that unloading this module would cause a kernel panic because another core is executing a function hooked by us. As normally you don't need to load/unload this module all the time (just execute the 'detach' command in GDB and connect back when ready), we don't check for it here. */ kgdb_unregister_io_module(&kgdboe_io_ops); netpoll_wrapper_free(s_pKgdboeNetpoll); nethook_cleanup(); s_pKgdboeNetpoll = NULL; }
static void kgdbts_run_tests(void) { char *ptr; int fork_test = 0; int do_sys_open_test = 0; int sstep_test = 1000; int nmi_sleep = 0; int i; ptr = strchr(config, 'F'); if (ptr) fork_test = simple_strtol(ptr + 1, NULL, 10); ptr = strchr(config, 'S'); if (ptr) do_sys_open_test = simple_strtol(ptr + 1, NULL, 10); ptr = strchr(config, 'N'); if (ptr) nmi_sleep = simple_strtol(ptr+1, NULL, 10); ptr = strchr(config, 'I'); if (ptr) sstep_test = simple_strtol(ptr+1, NULL, 10); /* required internal KGDB tests */ v1printk("kgdbts:RUN plant and detach test\n"); run_plant_and_detach_test(0); v1printk("kgdbts:RUN sw breakpoint test\n"); run_breakpoint_test(0); v1printk("kgdbts:RUN bad memory access test\n"); run_bad_read_test(); v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test); for (i = 0; i < sstep_test; i++) { run_singlestep_break_test(); if (i % 100 == 0) v1printk("kgdbts:RUN singlestep [%i/%i]\n", i, sstep_test); } /* ===Optional tests=== */ /* All HW break point tests */ if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { hwbreaks_ok = 1; v1printk("kgdbts:RUN hw breakpoint test\n"); run_breakpoint_test(1); v1printk("kgdbts:RUN hw write breakpoint test\n"); run_hw_break_test(1); v1printk("kgdbts:RUN access write breakpoint test\n"); run_hw_break_test(0); } if (nmi_sleep) { v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep); run_nmi_sleep_test(nmi_sleep); } #ifdef CONFIG_DEBUG_RODATA /* Until there is an api to write to read-only text segments, use * HW breakpoints for the remainder of any tests, else print a * failure message if hw breakpoints do not work. */ if (!(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT && hwbreaks_ok)) { eprintk("kgdbts: HW breakpoints do not work," "skipping remaining tests\n"); return; } force_hwbrks = 1; #endif /* CONFIG_DEBUG_RODATA */ /* If the do_fork test is run it will be the last test that is * executed because a kernel thread will be spawned at the very * end to unregister the debug hooks. */ if (fork_test) { repeat_test = fork_test; printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n", repeat_test); kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); run_do_fork_test(); return; } /* If the sys_open test is run it will be the last test that is * executed because a kernel thread will be spawned at the very * end to unregister the debug hooks. */ if (do_sys_open_test) { repeat_test = do_sys_open_test; printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n", repeat_test); kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); run_sys_open_test(); return; } /* Shutdown and unregister */ kgdb_unregister_io_module(&kgdbts_io_ops); configured = 0; }
static void cleanup_kgdbts(void) { if (configured == 1) kgdb_unregister_io_module(&kgdbts_io_ops); }
static void cleanup_kgdboc(void) { kgdboc_unregister_kbd(); if (configured == 1) kgdb_unregister_io_module(&kgdboc_io_ops); }
static int configure_kgdboc(void) { struct tty_driver *p; int tty_line = 0; int err; char *cptr = config; struct console *cons; int is_console = 0; err = kgdboc_option_setup(config); if (err || !strlen(config) || isspace(config[0])) goto noconfig; err = -ENODEV; kgdb_tty_driver = NULL; kgdboc_use_kms = 0; if (strncmp(cptr, "kms,", 4) == 0) { cptr += 4; kgdboc_use_kms = 1; } if (kgdboc_register_kbd(&cptr)) goto do_register; p = tty_find_polling_driver(cptr, &tty_line); if (!p) goto noconfig; cons = console_drivers; while (cons) { int idx; if (cons->device && cons->device(cons, &idx) == p && idx == tty_line) { is_console = 1; break; } cons = cons->next; } kgdb_tty_driver = p; kgdb_tty_line = tty_line; do_register: if (is_console) { err = kgdb_register_io_module(&kgdboc_io_ops_console); configured = 2; } else { err = kgdb_register_io_module(&kgdboc_io_ops); configured = 1; } if (err) goto noconfig; err = kgdb_register_nmi_console(); if (err) goto nmi_con_failed; return 0; nmi_con_failed: kgdb_unregister_io_module(&kgdboc_io_ops); noconfig: kgdboc_unregister_kbd(); config[0] = 0; configured = 0; cleanup_kgdboc(); return err; }
static void kgdbts_run_tests(void) { char *ptr; int fork_test = 0; int do_sys_open_test = 0; int sstep_test = 1000; int nmi_sleep = 0; int i; ptr = strchr(config, 'F'); if (ptr) fork_test = simple_strtol(ptr + 1, NULL, 10); ptr = strchr(config, 'S'); if (ptr) do_sys_open_test = simple_strtol(ptr + 1, NULL, 10); ptr = strchr(config, 'N'); if (ptr) nmi_sleep = simple_strtol(ptr+1, NULL, 10); ptr = strchr(config, 'I'); if (ptr) sstep_test = simple_strtol(ptr+1, NULL, 10); /* All HW break point tests */ if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { hwbreaks_ok = 1; v1printk("kgdbts:RUN hw breakpoint test\n"); run_breakpoint_test(1); v1printk("kgdbts:RUN hw write breakpoint test\n"); run_hw_break_test(1); v1printk("kgdbts:RUN access write breakpoint test\n"); run_hw_break_test(0); } /* required internal KGDB tests */ v1printk("kgdbts:RUN plant and detach test\n"); run_plant_and_detach_test(0); v1printk("kgdbts:RUN sw breakpoint test\n"); run_breakpoint_test(0); v1printk("kgdbts:RUN bad memory access test\n"); run_bad_read_test(); v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test); for (i = 0; i < sstep_test; i++) { run_singlestep_break_test(); if (i % 100 == 0) v1printk("kgdbts:RUN singlestep [%i/%i]\n", i, sstep_test); } /* ===Optional tests=== */ if (nmi_sleep) { v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep); run_nmi_sleep_test(nmi_sleep); } /* If the do_fork test is run it will be the last test that is * executed because a kernel thread will be spawned at the very * end to unregister the debug hooks. */ if (fork_test) { repeat_test = fork_test; printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n", repeat_test); kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); run_do_fork_test(); return; } /* If the sys_open test is run it will be the last test that is * executed because a kernel thread will be spawned at the very * end to unregister the debug hooks. */ if (do_sys_open_test) { repeat_test = do_sys_open_test; printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n", repeat_test); kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); run_sys_open_test(); return; } /* Shutdown and unregister */ kgdb_unregister_io_module(&kgdbts_io_ops); configured = 0; }