- if (ioflg & PCI_IORESOURCE_PCI_EA_BEI)
- printf("[enhanced] ");
- else if (pos && !(flg & ((flg & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)))
+
+ /* Read address as seen by the hardware */
+ if (flg & PCI_BASE_ADDRESS_SPACE_IO)
+ hw_lower = flg & PCI_BASE_ADDRESS_IO_MASK;
+ else
+ {
+ hw_lower = flg & PCI_BASE_ADDRESS_MEM_MASK;
+ if ((flg & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == PCI_BASE_ADDRESS_MEM_TYPE_64)
+ {
+ if (i >= cnt - 1)
+ broken = 1;
+ else
+ {
+ i++;
+ hw_upper = get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i);
+ }
+ }
+ }
+
+ /* Detect virtual regions, which are reported by the OS, but unassigned in the device */
+ if (pos && !hw_lower && !hw_upper && !(ioflg & PCI_IORESOURCE_PCI_EA_BEI))