Index: linux/kernel/kgdb.c =================================================================== --- linux.orig/kernel/kgdb.c +++ linux/kernel/kgdb.c @@ -49,6 +49,15 @@ #include #include +#if defined(CONFIG_KGDB) && defined(CONFIG_IPIPE) +#undef smp_processor_id +#undef local_irq_save +#undef local_irq_restore +#define smp_processor_id ipipe_processor_id +#define local_irq_save local_irq_save_hw +#define local_irq_restore local_irq_restore_hw +#endif + extern int pid_max; extern int pidhash_init_done; @@ -743,7 +752,7 @@ static void kgdb_wait(struct pt_regs *re local_irq_save(flags); processor = smp_processor_id(); kgdb_info[processor].debuggerinfo = regs; - kgdb_info[processor].task = current; + kgdb_info[processor].task = ipipe_safe_current(); atomic_set(&procindebug[processor], 1); atomic_set(&kgdb_sync_softlockup[smp_processor_id()], 1); @@ -884,8 +893,8 @@ int kgdb_deactivate_sw_breakpoints(void) kgdb_break[i].saved_instr))) return error; - if (CACHE_FLUSH_IS_SAFE && current->mm && - addr < TASK_SIZE) + if (CACHE_FLUSH_IS_SAFE && ipipe_safe_current() == current && + current->mm && addr < TASK_SIZE) flush_cache_range(current->mm->mmap_cache, addr, addr + BREAK_INSTR_SIZE); else if (CACHE_FLUSH_IS_SAFE) @@ -1069,7 +1078,7 @@ int kgdb_handle_exception(int ex_vector, goto kgdb_restore; kgdb_info[processor].debuggerinfo = linux_regs; - kgdb_info[processor].task = current; + kgdb_info[processor].task = ipipe_safe_current(); kgdb_disable_hw_debug(linux_regs); @@ -1121,7 +1130,8 @@ int kgdb_handle_exception(int ex_vector, *ptr++ = hexchars[(signo >> 4) % 16]; *ptr++ = hexchars[signo % 16]; ptr += strlen(strcpy(ptr, "thread:")); - int_to_threadref(&thref, shadow_pid(current->pid)); + int_to_threadref(&thref, + shadow_pid(ipipe_safe_current()->pid)); ptr = pack_threadid(ptr, &thref); *ptr++ = ';'; @@ -1213,7 +1223,8 @@ int kgdb_handle_exception(int ex_vector, kgdb_hex2mem(&remcom_in_buffer[1], (char *)gdb_regs, NUMREGBYTES); - if (kgdb_usethread && kgdb_usethread != current) + if (kgdb_usethread && + kgdb_usethread != ipipe_safe_current()) error_packet(remcom_out_buffer, -EINVAL); else { gdb_regs_to_regs(gdb_regs, linux_regs); @@ -1334,7 +1345,8 @@ int kgdb_handle_exception(int ex_vector, /* Current thread id */ strcpy(remcom_out_buffer, "QC"); - threadid = shadow_pid(current->pid); + threadid = + shadow_pid(ipipe_safe_current()->pid); int_to_threadref(&thref, threadid); pack_threadid(remcom_out_buffer + 2, &thref); @@ -1488,7 +1500,8 @@ int kgdb_handle_exception(int ex_vector, break; case 'c': case 's': - if (kgdb_contthread && kgdb_contthread != current) { + if (kgdb_contthread && + kgdb_contthread != ipipe_safe_current()) { /* Can't switch threads in kgdb */ error_packet(remcom_out_buffer, -EINVAL); break; Index: linux/lib/Kconfig.debug =================================================================== --- linux.orig/lib/Kconfig.debug +++ linux/lib/Kconfig.debug @@ -273,7 +273,7 @@ choice config KGDB_ONLY_MODULES bool "KGDB: Use only kernel modules for I/O" - depends on MODULES + depends on MODULES && !IPIPE help Use only kernel modules to configure KGDB I/O after the kernel is booted. @@ -318,7 +318,7 @@ config KGDB_SIBYTE endchoice config KGDBOE - tristate "KGDB: On ethernet" if !KGDBOE_NOMODULE + tristate "KGDB: On ethernet" if !KGDBOE_NOMODULE && !IPIPE depends on m && KGDB select NETPOLL select NETPOLL_TRAP Index: linux/drivers/serial/8250_kgdb.c =================================================================== --- linux.orig/drivers/serial/8250_kgdb.c +++ linux/drivers/serial/8250_kgdb.c @@ -301,6 +301,10 @@ static void __init kgdb8250_late_init(vo "GDB-stub", current_port) < 0) printk(KERN_ERR "KGDB failed to request the serial IRQ (%d)\n", current_port->irq); +#ifdef CONFIG_IPIPE + ipipe_control_irq(current_port->irq, 0, + IPIPE_HANDLE_MASK|IPIPE_STICKY_MASK|IPIPE_SYSTEM_MASK); +#endif /* CONFIG_IPIPE */ } static __init int kgdb_init_io(void) Index: linux/arch/i386/kernel/kgdb.c =================================================================== --- linux.orig/arch/i386/kernel/kgdb.c +++ linux/arch/i386/kernel/kgdb.c @@ -43,6 +43,11 @@ #include "mach_ipi.h" +#if defined(CONFIG_KGDB) && defined(CONFIG_IPIPE) +#undef smp_processor_id +#define smp_processor_id ipipe_processor_id +#endif + /* Put the error code here just in case the user cares. */ int gdb_i386errcode; /* Likewise, the vector number here (since GDB only gets the signal