Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Apr 2000 12:00:03 -0700 (PDT)
From:      Nick Hibma <n_hibma@calcaphon.com>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/16767: open("/dev/ppi0") will crash machine without sync disk
Message-ID:  <200004271900.MAA85789@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/16767; it has been noted by GNATS.

From: Nick Hibma <n_hibma@calcaphon.com>
To: m.butkus@tu-bs.de
Cc: freebsd-gnats-submit@freebsd.org, jin@gracie.lbl.gov,
	freebsd-bugs@freebsd.org
Subject: Re: kern/16767: open("/dev/ppi0") will crash machine without sync
 disk
Date: Thu, 27 Apr 2000 20:00:22 +0100 (BST)

 The first part is ok, the second patch should be including the sys/bus.h
 file I think.
 
 If someone could assign the PR to me, I'll have a look soonish.
 
 Nick
 
 > ===================================================================
 > RCS file: /home/ncvs/src/sys/dev/ppbus/ppi.c,v
 > retrieving revision 1.21
 > retrieving revision 1.22
 > diff -p -u -r1.21 -r1.22
 > - --- src/sys/dev/ppbus/ppi.c     2000/01/23 14:41:04     1.21
 > +++ /home/ncvs/src/sys/dev/ppbus/ppi.c  2000/04/07 00:09:24     1.22
 > @@ -23,7 +23,7 @@
 >   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 >   * SUCH DAMAGE.
 >   *
 > - - * $FreeBSD: src/sys/dev/ppbus/ppi.c,v 1.21 2000/01/23 14:41:04 peter Exp $
 > + * $FreeBSD: src/sys/dev/ppbus/ppi.c,v 1.22 2000/04/07 00:09:24 jlemon Exp $
 >   *
 >   */
 >  #include "opt_ppb_1284.h"
 > @@ -173,6 +173,10 @@ ppi_attach(device_t dev)
 >         /* declare our interrupt handler */
 >         ppi->intr_resource = bus_alloc_resource(dev, SYS_RES_IRQ,
 >                                                 &zero, irq, irq, 1, RF_ACTIVE);
 > +       if (ppi->intr_resource == NULL) {
 > +               device_printf(dev, "can't allocate irq\n");
 > +               return (ENOMEM);
 > +       }
 >  
 >         make_dev(&ppi_cdevsw, device_get_unit(dev),     /* XXX cleanup */
 >                  UID_ROOT, GID_WHEEL,
 > >>>> snap >>>>
 > 
 > But this does not really solve the problem, IMHO, since the interrupt
 > allocation should not have failed in the first place. This way,
 > the ppi device fails to attach completely. From dmesg(8):
 > 
 > > ppc0: <Parallel port> at port 0x278-0x27f irq 5 on isa0
 > > ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
 > > ppc0: FIFO with 16/16/16 bytes threshold
 > > ppi0: <Parallel I/O> on ppbus0
 > > ppi0: can't allocate irq
 > > device_probe_and_attach: ppi0 attach returned 12
 > 
 > I have then tried changing RF_ACTIVE to RF_SHAREABLE.  
 > This flag is used in lpt.c for interrupt allocation 
 > (see sys/dev/ppbus/lpt.c, rev 1.15.2.1, line 460ff):
 > 
 >         /* retrieve the ppbus irq */
 >         BUS_READ_IVAR(ppbus, dev, PPBUS_IVAR_IRQ, &irq);
 > 
 >         if (irq > 0) {
 >                 /* declare our interrupt handler */
 >                 sc->intr_resource = bus_alloc_resource(dev, SYS_RES_IRQ,
 >                                                        &zero, irq, irq, 1, RF_SHAREABLE);
 >         }
 > 
 > I don't know whether this is the "right" thing to do because I
 > don't quite understand the meaning of these flags. However, things
 > seem to work now.  My friend has tested the modified ppi driver
 > with the example from /usr/share/examples/ppi/ppilcd.c (he actually
 > has the LCD hardware).
 > 
 > This is the diff of my kernel changes, relative to ppi.c rev 1.21. 
 > It also contains the NULL pointer check from rev 1.22.
 > 
 > <<<< snip <<<<
 > - --- sys/dev/ppbus/ppi.c.orig	Wed Apr 26 22:08:37 2000
 > +++ sys/dev/ppbus/ppi.c	Wed Apr 26 22:14:31 2000
 > @@ -172,7 +172,11 @@
 >  
 >  	/* declare our interrupt handler */
 >  	ppi->intr_resource = bus_alloc_resource(dev, SYS_RES_IRQ,
 > - -						&zero, irq, irq, 1, RF_ACTIVE);
 > +						&zero, irq, irq, 1, RF_SHAREABL
 > E);
 > +	if (ppi->intr_resource == NULL) {
 > +		device_printf(dev, "can't allocate irq\n");
 > +		return (ENOMEM);
 > +	}
 >  
 >  	make_dev(&ppi_cdevsw, device_get_unit(dev),	/* XXX cleanup */
 >  		 UID_ROOT, GID_WHEEL,
 > >>>> snap >>>>
 > 
 > Also, I had to make the following changes to ppilcd to make it compile.
 > This patch is relative to:
 > 
 > $FreeBSD: src/share/examples/ppi/Makefile,v 1.2 1999/08/28 00:19:27 peter Exp 
 > $FreeBSD: src/share/examples/ppi/ppilcd.c,v 1.2 1999/08/28 00:19:28 peter Exp
 > 
 > 
 > <<<< snip <<<<
 > *** share/examples/ppi/Makefile.orig	Thu Apr 27 11:15:36 2000
 > - --- share/examples/ppi/Makefile	Thu Apr 27 11:15:48 2000
 > ***************
 > *** 5,8 ****
 > - --- 5,10 ----
 >   PROG=	ppilcd
 >   NOMAN=	YES
 >   
 > + CFLAGS +=-I/sys/dev/ppbus
 > + 
 >   .include <bsd.prog.mk>
 > *** share/examples/ppi/ppilcd.c.orig	Thu Apr 27 11:15:28 2000
 > - --- share/examples/ppi/ppilcd.c	Thu Apr 27 11:17:08 2000
 > ***************
 > *** 14,19 ****
 > - --- 14,21 ----
 >   #include <err.h>
 >   #include <sysexits.h>
 >   
 > + typedef void *device_t;
 > + 
 >   /* XXX should be in <machine/> */
 >   #include "ppbconf.h"
 >   #include "ppi.h"
 > ***************
 > *** 89,95 ****
 >   int	debuglevel = 0;
 >   int	vflag = 0;
 >   
 > ! void
 >   main(int argc, char *argv[]) 
 >   {
 >       extern char		*optarg;
 > - --- 91,97 ----
 >   int	debuglevel = 0;
 >   int	vflag = 0;
 >   
 > ! int
 >   main(int argc, char *argv[]) 
 >   {
 >       extern char		*optarg;
 > >>>> snap >>>>
 > 
 > In case it matters, this is the dmesg(8) output of my box:
 > 
 > <<<< snip <<<<
 > Copyright (c) 1992-2000 The FreeBSD Project.
 > Copyright (c) 1982, 1986, 1989, 1991, 1993
 > 	The Regents of the University of California. All rights reserved.
 > FreeBSD 4.0-STABLE #9: Tue Apr 25 23:25:47 CEST 2000
 >     root@bagheera.ts.rz.tu-bs.de:/usr/src/sys/compile/BAGHEERA
 > Timecounter "i8254"  frequency 1193182 Hz
 > CPU: Pentium/P55C (165.79-MHz 586-class CPU)
 >   Origin = "GenuineIntel"  Id = 0x543  Stepping = 3
 >   Features=0x8001bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,MMX>
 > real memory  = 67108864 (65536K bytes)
 > avail memory = 61960192 (60508K bytes)
 > Preloaded elf kernel "kernel" at 0xc034b000.
 > Preloaded userconfig_script "/boot/kernel.conf" at 0xc034b09c.
 > Intel Pentium detected, installing workaround for F00F bug
 > md0: Malloc disk
 > npx0: <math processor> on motherboard
 > npx0: INT 16 interface
 > pcib0: <Host to PCI bridge> on motherboard
 > pci0: <PCI bus> on pcib0
 > isab0: <Intel 82371FB PCI to ISA bridge> at device 7.0 on pci0
 > isa0: <ISA bus> on isab0
 > atapci0: <Intel PIIX ATA controller> port 0xe800-0xe80f at device 7.1 on pci0
 > ata0: at 0x1f0 irq 14 on atapci0
 > ncr0: <ncr 53c810 fast10 scsi> port 0xe400-0xe4ff mem 0xe6000000-0xe60000ff irq 12 at device 9.0 on pci0
 > ncr0: driver is using old-style compatability shims
 > ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xe000-0xe01f irq 10 at device 10.0 on pci0
 > ed0: supplying EUI64: 00:00:21:ff:fe:48:36:b9
 > ed0: address 00:00:21:48:36:b9, type NE2000 (16 bit) 
 > pci0: <ATI Mach64-GP graphics accelerator> at 12.0
 > fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
 > fdc0: FIFO enabled, 8 bytes threshold
 > fd0: <1440-KB 3.5" drive> on fdc0 drive 0
 > atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
 > atkbd0: <AT Keyboard> irq 1 on atkbdc0
 > vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
 > sc0: <System console> on isa0
 > sc0: VGA <16 virtual consoles, flags=0x200>
 > sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
 > sio0: type 16550A
 > sio1 at port 0x2f8-0x2ff irq 3 on isa0
 > sio1: type 16550A
 > ppc0: <Parallel port> at port 0x278-0x27f irq 5 on isa0
 > ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
 > ppc0: FIFO with 16/16/16 bytes threshold
 > ppi0: <Parallel I/O> on ppbus0
 > ppi0: can't allocate irq
 > device_probe_and_attach: ppi0 attach returned 12
 > lpt0: <Printer> on ppbus0
 > lpt0: Interrupt-driven port
 > plip0: <PLIP network interface> on ppbus0
 > pcm0: <AD1816> at port 0x220-0x22f,0x388-0x38b,0x100-0x10f irq 7 drq 1,0 on isa0
 > unknown0: <Analog Devices AD1815> at port 0x330-0x331 irq 9 on isa0
 > unknown1: <Analog Devices AD1815> at port 0x200-0x207 on isa0
 > ad0: 14664MB <IBM-DJNA-351520> [29795/16/63] at ata0-master using WDMA2
 > Waiting 5 seconds for SCSI devices to settle
 > sa0 at ncr0 bus 0 target 4 lun 0
 > sa0: <HP HP35470A T603> Removable Sequential Access SCSI-2 device 
 > sa0: 5.000MB/s transfers (5.000MHz, offset 8)
 > Mounting root from ufs:/dev/ad0s1a
 > cd0 at ncr0 bus 0 target 2 lun 0
 > cd0: <SONY CD-ROM CDU-8002 1.8g> Removable CD-ROM SCSI-CCS device 
 > cd0: 3.300MB/s transfers
 > cd0: Attempt to query device size failed: NOT READY, Vendor Specific ASC
 > IP packet filtering initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled
 > >>>> snap >>>>
 > 
 > It would be nice if someone commited this fix/workaround (or a better one) 
 > to -CURRENT and -STABLE. Thanks!
 > 
 > Yours,
 > 	Martin
 > 
 > 
 > To Unsubscribe: send mail to majordomo@FreeBSD.org
 > with "unsubscribe freebsd-bugs" in the body of the message
 > 
 
 --
 n_hibma@webweaving.org
 n_hibma@freebsd.org                                          USB project
 http://www.etla.net/~n_hibma/
 
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200004271900.MAA85789>