The implementation of /sys/bus/pci/devices/xxxxxx/modalias is in drivers/pci/sys-fs.c:
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) { struct pci_dev *pci_dev = to_pci_dev(dev); return sprintf(buf, "pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi %02x\n", pci_dev->vendor, pci_dev->device, pci_dev->subsystem_vendor, pci_dev- >subsystem_device, (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), (u8)(pci_dev->class)); } and those of /sys/devices/pcixxxx/xxxxx/usb5/5-0:1.0/modalias is in drivers/usb/core/sysfs.c: static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf) { struct usb_interface *intf; struct usb_device *udev; struct usb_host_interface *alt; intf = to_usb_interface(dev); udev = interface_to_usbdev(intf); alt = intf->cur_altsetting; return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X" "ic%02Xisc%02Xip%02X\n", le16_to_cpu(udev->descriptor.idVendor), le16_to_cpu(udev->descriptor.idProduct), le16_to_cpu(udev->descriptor.bcdDevice), udev->descriptor.bDeviceClass, udev->descriptor.bDeviceSubClass, udev->descriptor.bDeviceProtocol, alt->desc.bInterfaceClass, alt->desc.bInterfaceSubClass, alt->desc.bInterfaceProtocol); } and so just for modalias alone, the output comes from different places in the kernel source. On Jun 27, 8:49 am, Peter Teoh <htmldevelo...@gmail.com> wrote: > Looking into lspci via strace: > strace lspci 2>/tmp/lspci.out > and then extracting out all the "open" calls in lspci.out following that > searching for "sys": > open("cmov/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or > directory) > open("libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or > directory) > open("/lib/tls/i686/cmov/libresolv.so.2", O_RDONLY) = 3 > open("/dev/urandom", O_RDONLY) = 3 > open("/sys/bus/pci/devices", > O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 > open("/sys/bus/pci/devices/0000:00:00.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:00.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:00.0/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:00.0/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:00.0/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:01.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:01.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:01.0/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:01.0/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:01.0/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.0/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.0/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.0/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.1/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.1/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.1/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.1/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.1/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.7/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.7/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.7/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.7/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1a.7/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1b.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1b.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1b.0/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1b.0/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1b.0/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.0/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.0/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.0/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.4/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.4/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.4/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.4/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.4/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.5/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.5/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.5/vendor", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.5/device", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1c.5/class", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1d.0/resource", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1d.0/irq", O_RDONLY) = 4 > open("/sys/bus/pci/devices/0000:00:1d.0/vendor", O_RDONLY) = 4 > From above we know that it enumerate all the devices via first reading the > directory /sys/bus/pci/devices and then searching for files like irq, vendor, > device, class, resource under each devices ID found. > Awesome!!!!