kgdb over 2.6.17
PATCH 1/1 kgdb over 2.6.17
This is just a trivial refresh of the existing I-pipe-over-kgdb patches for 2.6.16. Successfully tested with 2.6.17.6 + I-pipe-1.3-08.
Still keep in mind that you have to add
CFLAGS_kgdb.o += -fno-unit-at-a-time
to kernel/Makefile in order to compile kgdb with gcc-4.1[.1] (you may remember this when your box locks up or reboots on debugger attaching...). That's due to a compiler bug which will be fixed in 4.1.2.
Jan
arch/i386/kernel/entry.S +3 -3
@@ -123,7 +123,7 @@ VM_MASK = 0x00020000 .previous -KPROBE_ENTRY(ret_from_fork) +ENTRY(ret_from_fork) pushl %eax call schedule_tail GET_THREAD_INFO(%ebp)
@@ -476,7 +476,7 @@ ENTRY(simd_coprocessor_error) pushl $do_simd_coprocessor_error jmp error_code -KPROBE_ENTRY(device_not_available) +ENTRY(device_not_available) pushl $-1 # mark this as an int SAVE_ALL movl %cr0, %eax
@@ -658,7 +658,7 @@ ENTRY(machine_check) jmp error_code #endif -KPROBE_ENTRY(spurious_interrupt_bug) +ENTRY(spurious_interrupt_bug) pushl $0 pushl $do_spurious_interrupt_bug jmp error_code
kernel/kgdb.c +21 -8
@@ -50,6 +50,15 @@#include <linux/sched.h> #include <asm/byteorder.h> +#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;/* How many times to count all of the waiting CPUs */ #define ROUNDUP_WAIT 640000/* Arbitrary, increase if needed. */
@@ -742,7 +751,7 @@ static void kgdb_wait(struct pt_regs *relocal_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 );
@@ -883,8 +892,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 )
@@ -1068,7 +1077,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);
@@ -1120,7 +1129,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++ =';' ;
@@ -1212,7 +1222,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);
@@ -1333,7 +1344,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);
@@ -1487,7 +1499,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 ;
lib/Kconfig.debug +2 -2
@@ -274,7 +274,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.
@@ -319,7 +319,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
drivers/serial/8250_kgdb.c +4 -0
@@ -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 )
arch/i386/kernel/kgdb.c +5 -0
@@ -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
arch/i386/kernel/entry.S +3 -3
@@ -194,7 +194,7 @@ VM_MASK = 0x00020000 .previous -ENTRY(ret_from_fork) +KPROBE_ENTRY(ret_from_fork) STI_COND_HW pushl %eax call schedule_tail
@@ -588,7 +588,7 @@ ENTRY(simd_coprocessor_error) PUSH_XCODE(do_simd_coprocessor_error) jmp error_code -ENTRY(device_not_available) +KPROBE_ENTRY(device_not_available) pushl $-1 # mark this as an int SAVE_ALL DIVERT_EXCEPTION(device_not_available)
@@ -773,7 +773,7 @@ ENTRY(machine_check) jmp error_code #endif -ENTRY(spurious_interrupt_bug) +KPROBE_ENTRY(spurious_interrupt_bug) pushl $0 PUSH_XCODE(do_spurious_interrupt_bug) jmp error_code