Author: marius
Date: Wed Jan 14 22:11:01 2009
New Revision: 187250
URL: http://svn.freebsd.org/changeset/base/187250

Log:
  MFC: r186876
  
  Check the return values of contigmalloc(9) as well as bus_dma(9)
  functions and stop attaching of dcons(4) and dcons_crom(4) if
  they indicate failure. This fixes a panic seen on sparc64 machines
  with no free physical memory in the requested 32-bit region but
  still doesn't make dcons(4)/dcons_crom(4) these work.

Modified:
  stable/6/sys/   (props changed)
  stable/6/sys/dev/dcons/dcons_crom.c
  stable/6/sys/dev/dcons/dcons_os.c

Modified: stable/6/sys/dev/dcons/dcons_crom.c
==============================================================================
--- stable/6/sys/dev/dcons/dcons_crom.c Wed Jan 14 22:10:51 2009        
(r187249)
+++ stable/6/sys/dev/dcons/dcons_crom.c Wed Jan 14 22:11:01 2009        
(r187250)
@@ -172,7 +172,10 @@ dcons_crom_attach(device_t dev)
        return (-1);
 #else
        struct dcons_crom_softc *sc;
+       int error;
 
+       if (dcons_conf->buf == NULL)
+               return (ENXIO);
         sc = (struct dcons_crom_softc *) device_get_softc(dev);
        sc->fd.fc = device_get_ivars(dev);
        sc->fd.dev = dev;
@@ -180,7 +183,7 @@ dcons_crom_attach(device_t dev)
        sc->fd.post_busreset = (void *) dcons_crom_post_busreset;
 
        /* map dcons buffer */
-       bus_dma_tag_create(
+       error = bus_dma_tag_create(
                /*parent*/ sc->fd.fc->dmat,
                /*alignment*/ sizeof(u_int32_t),
                /*boundary*/ 0,
@@ -196,10 +199,16 @@ dcons_crom_attach(device_t dev)
                /*lockarg*/&Giant,
 #endif
                &sc->dma_tag);
-       bus_dmamap_create(sc->dma_tag, BUS_DMA_COHERENT, &sc->dma_map);
-       bus_dmamap_load(sc->dma_tag, sc->dma_map,
+       if (error != 0)
+               return (error);
+       error = bus_dmamap_create(sc->dma_tag, BUS_DMA_COHERENT, &sc->dma_map);
+       if (error != 0)
+               return (error);
+       error = bus_dmamap_load(sc->dma_tag, sc->dma_map,
            (void *)dcons_conf->buf, dcons_conf->size,
            dmamap_cb, sc, 0);
+       if (error != 0)
+               return (error);
        return (0);
 #endif
 }

Modified: stable/6/sys/dev/dcons/dcons_os.c
==============================================================================
--- stable/6/sys/dev/dcons/dcons_os.c   Wed Jan 14 22:10:51 2009        
(r187249)
+++ stable/6/sys/dev/dcons/dcons_os.c   Wed Jan 14 22:11:01 2009        
(r187250)
@@ -548,6 +548,8 @@ dcons_drv_init(int stage)
                 */ 
                dg.buf = (struct dcons_buf *) contigmalloc(dg.size,
                        M_DEVBUF, 0, 0x10000, 0xffffffff, PAGE_SIZE, 0ul);
+               if (dg.buf == NULL)
+                       return (-1);
                dcons_init(dg.buf, dg.size, sc);
        }
 
@@ -671,9 +673,9 @@ dcons_modevent(module_t mode, int type, 
        switch (type) {
        case MOD_LOAD:
                ret = dcons_drv_init(1);
-               dcons_attach();
 #if __FreeBSD_version >= 500000
                if (ret == 0) {
+                       dcons_attach();
                        dcons_cnprobe(&dcons_consdev);
                        dcons_cninit(&dcons_consdev);
                        cnadd(&dcons_consdev);
@@ -682,7 +684,8 @@ dcons_modevent(module_t mode, int type, 
                break;
        case MOD_UNLOAD:
                printf("dcons: unload\n");
-               callout_stop(&dcons_callout);
+               if (drv_init == 1) {
+                       callout_stop(&dcons_callout);
 #if __FreeBSD_version < 502122
 #if DDB && DCONS_FORCE_GDB
 #if CONS_NODEV
@@ -693,13 +696,14 @@ dcons_modevent(module_t mode, int type, 
 #endif
 #endif
 #if __FreeBSD_version >= 500000
-               cnremove(&dcons_consdev);
+                       cnremove(&dcons_consdev);
 #endif
-               dcons_detach(DCONS_CON);
-               dcons_detach(DCONS_GDB);
-               dg.buf->magic = 0;
+                       dcons_detach(DCONS_CON);
+                       dcons_detach(DCONS_GDB);
+                       dg.buf->magic = 0;
 
-               contigfree(dg.buf, DCONS_BUF_SIZE, M_DEVBUF);
+                       contigfree(dg.buf, DCONS_BUF_SIZE, M_DEVBUF);
+               }
 
                break;
        case MOD_SHUTDOWN:
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to