Crash while iterating over devices and resource

Matthew Dillon dillon at apollo.backplane.com
Thu May 3 14:10:37 PDT 2007


:Hi all,
:
:Since the old ndisulator code (which is in DragonFly) doesn't recognize 
:my wireless card I've taken a shot at converting the current ndisulator 
:code of FreeBSD to DragonFly.
:
:The code now correctly identifies my wireless card however the 
:win-driver want to map io space. In the function where ndisulator does 
:this it recursively iterate over all devices and resources to select the 
:correct device to map to. The driver crashes in this code.
:
:Attached is a minimal example of the code which crashes (it crashes in 
:the SLIST_FOREACH [macro]call) and a dump of the output just prior to 
:crashing and after the crash.
:
:Since I don't now much about hardware I'm not sure whether it is normal 
:that pci1 is a child of pci0, and I also would have thought the 
:resource_list pointer of pci1 (which it crashes on) would be more in 
:sequentual to the pointer of the resource_list pointers of agp0 and pcib1.
:
:Hope one of you can help.
:
:Martin

    I think its a bug in pci_get_resource_list().

struct resource_list *
pci_get_resource_list (device_t dev, device_t child)
{
        struct pci_devinfo *    dinfo = device_get_ivars(child);
        struct resource_list *  rl = &dinfo->resources;

        if (!rl)
                return (NULL);

        return (rl);
}

    That should probably be:

struct resource_list *
pci_get_resource_list (device_t dev, device_t child)
{
        struct pci_devinfo *dinfo = device_get_ivars(child);

        if (dinfo == NULL)
                return (NULL);
        return (&dinfo->resources);
}


    Try that and see what you get.

    The PCI heirarchy is a real mess.  The busses can hang off of each
    other, e.g. one pci bus can be a device on another pci bus.  It all
    gets fed into the cpu somehow :-)

					-Matt






More information about the Kernel mailing list