Compensate for i386 pcitag_t union
authorderaadt <deraadt@openbsd.org>
Wed, 5 Jan 2022 16:46:11 +0000 (16:46 +0000)
committerderaadt <deraadt@openbsd.org>
Wed, 5 Jan 2022 16:46:11 +0000 (16:46 +0000)
ok jsg kettenis

sys/dev/pci/pci.c

index 608929a..7ca542c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pci.c,v 1.122 2022/01/04 16:15:28 kettenis Exp $      */
+/*     $OpenBSD: pci.c,v 1.123 2022/01/05 16:46:11 deraadt Exp $       */
 /*     $NetBSD: pci.c,v 1.31 1997/06/06 23:48:04 thorpej Exp $ */
 
 /*
@@ -1264,15 +1264,20 @@ pciioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
                return EINVAL;
 
        pc = pci->sc_pc;
-       tag = pci_make_tag(pc, sel->pc_bus, sel->pc_dev, sel->pc_func);
-
        LIST_FOREACH(pd, &pci->sc_devs, pd_next) {
-               if (tag == pd->pd_tag)
+               int bus, dev, func;
+
+               pci_decompose_tag(pc, pd->pd_tag, &bus, &dev, &func);
+
+               if (bus == sel->pc_bus && dev == sel->pc_dev &&
+                   func == sel->pc_func)
                        break;
        }
        if (pd == LIST_END(&pci->sc_devs))
                return ENXIO;
 
+       tag = pci_make_tag(pc, sel->pc_bus, sel->pc_dev, sel->pc_func);
+
        switch (cmd) {
        case PCIOCREAD:
                io = (struct pci_io *)data;