From da30e9f2eee235ce11d47bb2e32f976b8c187e5d Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Mon, 10 Sep 2018 15:00:03 -0400 Subject: [PATCH] Fix another buggy fake acpi pci root driver In this case, the platform driver that creates the PCI(e) root device doesn't fill in its driver link, so we can't look up what driver is in use - but since it's the root, it *really* doesn't matter. And in general, we only really care if it's the last node in our path, because that'll be the controller for the boot device anyway. Signed-off-by: Peter Jones --- src/linux-pci.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/linux-pci.c b/src/linux-pci.c index e7c864b2d33..f63f5914d9f 100644 --- a/src/linux-pci.c +++ b/src/linux-pci.c @@ -67,7 +67,9 @@ parse_pci(struct device *dev, const char *current, const char *root) uint8_t bus, device, function; struct pci_dev_info *pci_dev; unsigned int i = dev->n_pci_devs; + struct stat statbuf; + debug("devpart is \"%s\"", devpart); pos = 0; debug("searching for 0000:00:00.0/"); rc = sscanf(devpart, "%hx:%hhx:%hhx.%hhx/%n", @@ -100,15 +102,23 @@ parse_pci(struct device *dev, const char *current, const char *root) return -1; } tmp[devpart - root] = '\0'; - rc = sysfs_readlink(&linkbuf, "class/block/%s/driver", tmp); - if (rc < 0 || !linkbuf) { - efi_error("Could not find driver for pci device %s", tmp); - free(tmp); - return -1; + rc = sysfs_stat(&statbuf, "class/block/%s/driver", tmp); + if (rc < 0 && errno == ENOENT) { + debug("No driver link for /sys/class/block/%s", tmp); + debug("Assuming this is just a buggy platform core driver"); + dev->pci_dev[i].driverlink = NULL; + } else { + rc = sysfs_readlink(&linkbuf, "class/block/%s/driver", tmp); + if (rc < 0 || !linkbuf) { + efi_error("Could not find driver for pci device %s", tmp); + free(tmp); + return -1; + } else { + dev->pci_dev[i].driverlink = strdup(linkbuf); + debug("driver:%s\n", linkbuf); + } } free(tmp); - dev->pci_dev[i].driverlink = strdup(linkbuf); - debug("driver:%s\n", linkbuf); dev->n_pci_devs += 1; } -- 2.17.1