Re: [Xenomai-core] [PATCH] fix for kgbd patch

2006-09-28 Thread Jan Kiszka
Jan Kiszka wrote:
> Hi,
> 
> the kgdb-over-ipipe add-on patches available from gna.org contain two
> bugs that prevents stepping through Xenomai kernel threads. The attached
> update fixes them. It also contains the workaround to build kgdb with
> gcc-3.4 (before 3.4.4) and 4.1 (before 4.1.2).
> 
> Tested on 2.6.17.13 with latest kgdb from CVS.
> 

It turned out (*) that kgdb over I-pipe only works reliably for
!CONFIG_PREEMPT (e.g. due to rcu_read_lock in the int3 notifier path).
Until some solution has been worked out, switch preemption off when you
use the debugger.

Jan


(*) Ever tried to debug a debugger? Here is one way to do this without
special hardware: Xenomai in qemu, one ddd attached to kgdb over
emulated serial port on /dev/pts/X, another ddd attached to qemu as
debugger back-end ("-s"). Sounds like fun? It isn't.



signature.asc
Description: OpenPGP digital signature
___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core


[Xenomai-core] [PATCH] fix for kgbd patch

2006-09-20 Thread Jan Kiszka
Hi,

the kgdb-over-ipipe add-on patches available from gna.org contain two
bugs that prevents stepping through Xenomai kernel threads. The attached
update fixes them. It also contains the workaround to build kgdb with
gcc-3.4 (before 3.4.4) and 4.1 (before 4.1.2).

Tested on 2.6.17.13 with latest kgdb from CVS.

Jan
Index: linux-2.6.17.13/arch/i386/kernel/kgdb.c
===
--- linux-2.6.17.13.orig/arch/i386/kernel/kgdb.c
+++ linux-2.6.17.13/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_idipipe_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
Index: linux-2.6.17.13/drivers/serial/8250_kgdb.c
===
--- linux-2.6.17.13.orig/drivers/serial/8250_kgdb.c
+++ linux-2.6.17.13/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-2.6.17.13/kernel/Makefile
===
--- linux-2.6.17.13.orig/kernel/Makefile
+++ linux-2.6.17.13/kernel/Makefile
@@ -41,6 +41,8 @@ obj-$(CONFIG_RCU_TORTURE_TEST) += rcutor
 obj-$(CONFIG_RELAY) += relay.o
 obj-$(CONFIG_IPIPE) += ipipe/
 
+CFLAGS_kgdb.o += -fno-unit-at-a-time
+
 ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
 # According to Alan Modra <[EMAIL PROTECTED]>, the -fno-omit-frame-pointer is
 # needed for x86 only.  Why this used to be enabled for all architectures is beyond
Index: linux-2.6.17.13/kernel/kgdb.c
===
--- linux-2.6.17.13.orig/kernel/kgdb.c
+++ linux-2.6.17.13/kernel/kgdb.c
@@ -50,6 +50,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_idipipe_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		64	/* Arbitrary, increase if needed. */
@@ -714,7 +723,7 @@ void int_to_threadref(threadref * id, in
 static struct task_struct *getthread(struct pt_regs *regs, int tid)
 {
 	if (last_pid != 0)
-		return current;
+		return ipipe_safe_current();
 
 	if (num_online_cpus() &&
 	(tid >= pid_max + num_online_cpus() + kgdb_ops->shadowth))
@@ -742,7 +751,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);
 
@@ -820,7 +829,8 @@ int kgdb_activate_sw_breakpoints(void)
 			return error;
 
 		if (CACHE_FLUSH_IS_SAFE) {
-			if (current->mm && addr < TASK_SIZE)
+			if (ipipe_safe_current() == current && current->mm &&
+addr < TASK_SIZE)
 flush_cache_range(current->mm->mmap_cache,
 		addr, addr + BREAK_INSTR_SIZE);
 			else
@@ -883,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)
@@ -1068,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);
 
@@ -1120,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++ = ';';
 
@@ -1212,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(