NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/42992: KGDB does not work once interrupts are enabled



>Number:         42992
>Category:       kern
>Synopsis:       KGDB does not work once interrupts are enabled
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Mar 17 19:20:00 +0000 2010
>Originator:     Paul Koning
>Release:        5.0
>Organization:
Dell
>Environment:
NetBSD pkvm50 5.0 NetBSD 5.0 (GENERIC) #9: Wed Mar 17 12:11:58 EDT 2010  
root@pkvm50:/usr/obj/sys/arch/i386/compile/GENERIC i386

>Description:
kgdb uses polled I/O for talking to the remote gdb.  Early on that works fine, 
but once interrupts are enabled, incoming characters trigger an interrupt to 
the com port driver so it becomes a race between that driver and the polled 
driver to see who gets to grab the character.  The polled driver loses most of 
the time, and even a single lost byte is enough to mess up the remote protocol. 
 The result is that KGDB is simply non-functional once the kernel switches to 
interrupt driven I/O.

>How-To-Repeat:
Build a kernel with KGDB.  Start it with -d, attach kgdb, set a breakpoint at 
some spot that will be hit once the OS is up.  Continue.  The breakpoint will 
be hit, but then gdb will not communicate successfully (in particular, fetching 
registers after the break signal fails) so it appears hung.  Running gdb with 
"set debug remote 1" shows the failure to communicate fairly well, and turning 
on DEBUG_KGDB in kgdb_stub.c shows it even more clearly (you see partial gdb 
packets instead of complete ones -- the missing bytes were sucked up by 
comintr().)

>Fix:
The solution is to put  a splserial() early in kgdb_trap with the matching 
splx() at the two exits.  This cures the problem and makes KGDB work reliably.



Home | Main Index | Thread Index | Old Index