OpenSolaris

You are not signed in. Sign in or register.

Heads-up: dadk: panic booting amd64 machine in DEBUG mode

Date: Sun, 20 Aug 2006 23:13:47 -0700
From: Danek Duvall <danek.duvall at sun dot com>
To: onnv-gate at onnv dot sfbay dot sun dot com, on-all at sun dot com
Subject: Heads-up: dadk: panic booting amd64 machine in DEBUG mode

The recent putback for

    4200341 x86 ide driver doesn't create error kstats

introduced a panic, at least on amd64/DEBUG bits, though it may be present
in more.  The panic is as follows:

    panic[cpu0]/thread=fffffffffbc26880: assertion failed: ((flag & 0x0FF00000) & 0x0FF00000) != 0, file: ../../intel/io/dktp/controller/ata/ata_disk.c, line: 2888
    
    fffffffffbc48af0 genunix:assfail+83 ()
    fffffffffbc48b80 ata:ata_copy_dk_ioc_string+1a9 ()
    fffffffffbc48bb0 ata:ata_disk_ioctl+c8 ()
    fffffffffbc48c20 dadk:dadk_create_errstats+24e ()
    fffffffffbc48c70 dadk:dadk_open+21f ()
    fffffffffbc48cd0 cmdk:cmdkattach+8b ()
    fffffffffbc48d30 genunix:devi_attach+94 ()
    fffffffffbc48d70 genunix:attach_node+142 ()
    fffffffffbc48dc0 genunix:i_ndi_config_node+f0 ()
    fffffffffbc48df0 genunix:i_ddi_attachchild+72 ()
    fffffffffbc48e30 genunix:devi_attach_node+e1 ()
    fffffffffbc48ef0 genunix:devi_config_one+4df ()
    fffffffffbc48f70 genunix:ndi_busop_bus_config+7b ()
    fffffffffbc48fe0 scsi:scsi_hba_bus_config+8f ()
    fffffffffbc49050 genunix:ndi_devi_config_one+c4 ()
    fffffffffbc49110 genunix:resolve_pathname+18a ()
    fffffffffbc49140 genunix:ddi_pathname_to_dev_t+1e ()
    fffffffffbc49150 unix:getrootdev+22 ()
    fffffffffbc491b0 ufs:ufs_mountroot+214 ()
    fffffffffbc491d0 genunix:fsop_mountroot+1d ()
    fffffffffbc49200 genunix:rootconf+d6 ()
    fffffffffbc49250 genunix:vfs_mountroot+75 ()
    fffffffffbc49290 genunix:main+11b ()
    fffffffffbc492a0 unix:_start+95 ()
    
    skipping system dump - no dump device configured
    rebooting...

The problem bits are dated 0819 and forward.  The problem will not be
present in 0822 bits and later, but Monday morning's bits will still have
the problem.

Should you be unable to wait for a backout or a confirmed fix, this appears
to have worked for Roger:

    $ diffs -c usr/src/uts/intel/io/dktp/dcdev/dadk.c
    ------- dadk.c -------
    ***************
    *** 593,599 ****
            dadk_ioc_string.is_buf = &dep->dadk_model.value.c[0];
            dadk_ioc_string.is_size = 16;
            CTL_IOCTL(dadkp->dad_ctlobjp, DIOCTL_GETMODEL,
    !           (uintptr_t)&dadk_ioc_string, FKIOCTL);
      
            /* get serial */
            dep->dadk_serial.value.c[0] = 0;
    --- 593,599 ----
            dadk_ioc_string.is_buf = &dep->dadk_model.value.c[0];
            dadk_ioc_string.is_size = 16;
            CTL_IOCTL(dadkp->dad_ctlobjp, DIOCTL_GETMODEL,
    !           (uintptr_t)&dadk_ioc_string, FNATIVE | FKIOCTL);
      
            /* get serial */
            dep->dadk_serial.value.c[0] = 0;
    ***************
    *** 600,606 ****
            dadk_ioc_string.is_buf = &dep->dadk_serial.value.c[0];
            dadk_ioc_string.is_size = 16;
            CTL_IOCTL(dadkp->dad_ctlobjp, DIOCTL_GETSERIAL,
    !           (uintptr_t)&dadk_ioc_string, FKIOCTL);
      
            /* Get revision */
            dep->dadk_revision.value.c[0] = 0;
    --- 600,606 ----
            dadk_ioc_string.is_buf = &dep->dadk_serial.value.c[0];
            dadk_ioc_string.is_size = 16;
            CTL_IOCTL(dadkp->dad_ctlobjp, DIOCTL_GETSERIAL,
    !           (uintptr_t)&dadk_ioc_string, FNATIVE | FKIOCTL);
      
            /* Get revision */
            dep->dadk_revision.value.c[0] = 0;
 

Apologies for not getting this fixed for Monday's archives, and thanks to
Roger for finding the problem.

Danek