static void debug_fiq(void *data, void *regs) { int c; static int last_c; while ((c = debug_getc()) != -1) { if (!debug_enable) { if ((c == 13) || (c == 10)) { debug_enable = true; debug_count = 0; debug_prompt(); } } else if ((c >= ' ') && (c < 127)) { if (debug_count < (DEBUG_MAX - 1)) { debug_buf[debug_count++] = c; debug_putc(c); } } else if ((c == 8) || (c == 127)) { if (debug_count > 0) { debug_count--; debug_putc(8); debug_putc(' '); debug_putc(8); } } else if ((c == 13) || (c == 10)) { if (c == '\r' || (c == '\n' && last_c != '\r')) { debug_putc('\r'); debug_putc('\n'); } if (debug_count) { debug_buf[debug_count] = 0; debug_count = 0; debug_exec(debug_buf, regs); } else { debug_prompt(); } } last_c = c; } debug_flush(); }
static irqreturn_t debug_irq(int irq, void *dev) { if (debug_busy) { struct kdbg_ctxt ctxt; ctxt.printf = debug_printf_nfiq; kernel_debugger(&ctxt, debug_cmd); debug_prompt(); debug_busy = 0; } return IRQ_HANDLED; }
// I called this MAME_Debug so that I could test mame cpu cores with daphne (obviously I can't ship mame cpu cores with // daphne due to licensing issues) void MAME_Debug(void) { // if we are in trace mode OR if we've got our desired breakpoint if (g_cpu_trace || (g_break && (get_cpu_struct(g_which_cpu)->getpc_callback() == g_breakpoint))) { // if the active cpu is the one to be debugged if (cpu_getactivecpu() == g_which_cpu) { // since we may be at the debug prompt for a long time, we pause the cpu timer here cpu_pause(); debug_prompt(); // give them a prompt cpu_unpause(); } } }
void msm_serial_debug_init(unsigned int base, int irq, struct device *clk_device, int signal_irq) { int ret; void *port; debug_clk = clk_get(clk_device, "uart_clk"); if (debug_clk) clk_enable(debug_clk); port = ioremap(base, 4096); if (!port) return; init_data.base = base; init_data.irq = irq; init_data.clk_device = clk_device; init_data.signal_irq = signal_irq; debug_port_base = (unsigned int) port; debug_signal_irq = signal_irq; debug_port_init(); debug_prompt(); msm_fiq_select(irq); msm_fiq_set_handler(debug_fiq, 0); msm_fiq_enable(irq); ret = request_irq(signal_irq, debug_irq, IRQF_TRIGGER_RISING, "debug", 0); if (ret) printk(KERN_ERR "serial_debugger: could not install signal_irq"); #if defined(CONFIG_MSM_SERIAL_DEBUGGER_CONSOLE) register_console(&msm_serial_debug_console); #endif debugger_enable = 1; }
static void debug_exec(const char *cmd, unsigned *regs) { if (!strcmp(cmd, "pc")) { dprintf(" pc %08x cpsr %08x mode %s\n", regs[15], regs[16], mode_name(regs[16])); } else if (!strcmp(cmd, "regs")) { dprintf(" r0 %08x r1 %08x r2 %08x r3 %08x\n", regs[0], regs[1], regs[2], regs[3]); dprintf(" r4 %08x r5 %08x r6 %08x r7 %08x\n", regs[4], regs[5], regs[6], regs[7]); dprintf(" r8 %08x r9 %08x r10 %08x r11 %08x mode %s\n", regs[8], regs[9], regs[10], regs[11], mode_name(regs[16])); dprintf(" ip %08x sp %08x lr %08x pc %08x cpsr %08x\n", regs[10], regs[13], regs[14], regs[15], regs[16]); } else if (!strcmp(cmd, "reboot")) { if (msm_hw_reset_hook) msm_hw_reset_hook(); } else if (!strcmp(cmd, "irqs")) { dump_irqs(); } else if (!strcmp(cmd, "kmsg")) { dump_kernel_log(); } else if (!strcmp(cmd, "version")) { dprintf("%s\n", linux_banner); } else { if (debug_busy) { dprintf("command processor busy. trying to abort.\n"); debug_abort = -1; } else { strcpy(debug_cmd, cmd); debug_busy = 1; } msm_trigger_irq(debug_signal_irq); return; } debug_prompt(); }