From owner-freebsd-current Wed Sep 11 01:30:45 1996 Return-Path: owner-current Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id BAA20874 for current-outgoing; Wed, 11 Sep 1996 01:30:45 -0700 (PDT) Received: from alpo.whistle.com (s205m1.whistle.com [207.76.205.1]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id BAA20867 for ; Wed, 11 Sep 1996 01:30:40 -0700 (PDT) Received: from current1.whistle.com (current1.whistle.com [207.76.205.22]) by alpo.whistle.com (8.7.5/8.7.3) with SMTP id BAA07714 for ; Wed, 11 Sep 1996 01:21:38 -0700 (PDT) Message-ID: <32367633.167EB0E7@whistle.com> Date: Wed, 11 Sep 1996 01:20:03 -0700 From: Julian Elischer Organization: Whistle Communications X-Mailer: Mozilla 3.0b6 (X11; I; FreeBSD 2.2-CURRENT i386) MIME-Version: 1.0 To: current@freebsd.org Subject: [HOWTO] Kernel GDB stubs Content-Type: multipart/mixed; boundary="------------794BDF32446B9B3D2781E494" Sender: owner-current@freebsd.org X-Loop: FreeBSD.org Precedence: bulk This is a multi-part message in MIME format. --------------794BDF32446B9B3D2781E494 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit I'd like to nominate the crew who got the kernel gdb stub going, for some sort of "GOD for a day" award. I've been using it with xxgdb over gdb.. the ability to just dump out structures in the kernel, and single step with source, all in differnet windows, etc. etc. is amazing.. I'm almost looking forward for excuses to use it.. today I found 2 bugs in the appletalk code, and cleared up my understanding of some aspects of the VFS system, found a long-standing bug in a frame-relay driver, and stopped a DEVFS panic, all using it.. this is almost TOO easy.. Of course you need 2 machines but I have a little old 486 hanging off the back of my pentium here, and it's great. I did the regulation config -g MYKERN, then modified the Makefile to add: cp kernel kernel.debug strip -d kernel The debug kernel is a bit big -rwxr-xr-x 1 julian bmann 8783261 Sep 11 00:25 kernel.debug but you install the stripped one.. in the compile directory I have the following .gdbinit set remotebaud 9600 file kernel.debug target remote /dev/cuaa1 then inthat directory simply run gdb or xxgdb or ddd or tkgdb or whatever frontend you like. gdb just sits and awaits a breakpoint or whatever.. don't forget to set sysctl -w debug.debugger_on_panic=1 on teh target machine if you want to catch panics and do once to get into the ddb then "gdb" to set gdb mode, followed by "cont". or Boot: -g If you have problems, I have the attached patches to sio.c to make it work for me though some people don't need these. bde has another patch he prefers, but you shouldn't have sio0 open for anything else or naturally there will be confusion.... julian --------------794BDF32446B9B3D2781E494 Content-Type: text/plain; charset=us-ascii; name="xx.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="xx.diff" Index: sio.c =================================================================== RCS file: /cvs/freebsd/src/sys/i386/isa/sio.c,v retrieving revision 1.145 diff -c -r1.145 sio.c *** 1.145 1996/09/06 23:08:05 --- sio.c 1996/09/11 08:16:51 *************** *** 70,75 **** --- 70,76 ---- #include #include #include + #include #ifdef COM_ESP #include *************** *** 266,271 **** --- 267,274 ---- void *devfs_token_cuai; #endif }; + static int cn_initialised = -2; + struct siocnstate sp; /* * XXX public functions in drivers should be declared in headers produced *************** *** 993,998 **** --- 996,1005 ---- #else tp = com->tp = &sio_tty[unit]; #endif + if( unit == comconsole ) + if ( cn_initialised == -1 ) + cn_initialised = 0; + s = spltty(); /* * We jump to this label after all non-interrupted sleeps to pick *************** *** 1221,1226 **** --- 1228,1235 ---- com->active_out = FALSE; wakeup(&com->active_out); wakeup(TSA_CARR_ON(tp)); /* restart any wopeners */ + if( unit == comconsole ) + cn_initialised = -1; splx(s); } *************** *** 2285,2291 **** /* * Following are all routines needed for SIO to act as console */ - #include struct siocnstate { u_char dlbl; --- 2294,2299 ---- *************** *** 2324,2329 **** --- 2332,2339 ---- int divisor; Port_t iobase; + /* -2 = initial -1 = don't bother, 1 = done */ + if((cn_initialised != 0) && (cn_initialised != -2)) return; /* * Save all the device control registers except the fifo register * and set our default ones (cs8 -parenb speed=comdefaultrate). *************** *** 2348,2353 **** --- 2358,2364 ---- * an interrupt by floating the IRQ line. */ outb(iobase + com_mcr, (sp->mcr & MCR_IENABLE) | MCR_DTR | MCR_RTS); + cn_initialised++ ; } static void *************** *** 2356,2361 **** --- 2367,2373 ---- { Port_t iobase; + if(cn_initialised < 0) return; /* * Restore the device control registers. */ *************** *** 2370,2375 **** --- 2382,2388 ---- */ outb(iobase + com_mcr, sp->mcr | MCR_DTR | MCR_RTS); outb(iobase + com_ier, sp->ier); + cn_initialised--; } void *************** *** 2407,2413 **** int c; Port_t iobase; int s; - struct siocnstate sp; iobase = siocniobase; s = spltty(); --- 2420,2425 ---- *************** *** 2429,2435 **** int c; Port_t iobase; int s; - struct siocnstate sp; iobase = siocniobase; s = spltty(); --- 2441,2446 ---- *************** *** 2448,2454 **** int c; { int s; - struct siocnstate sp; s = spltty(); siocnopen(&sp); --- 2459,2464 ---- --------------794BDF32446B9B3D2781E494--