On 12.06.2025 11:29, Jiqian Chen wrote: > +static int vpci_ext_capability_hide(struct pci_dev *pdev, unsigned int cap) > +{ > + const unsigned int offset = pci_find_ext_capability(pdev->sbdf, cap); > + struct vpci_register *r, *prev_r; > + struct vpci *vpci = pdev->vpci; > + uint32_t header, pre_header; > + > + if ( offset < PCI_CFG_SPACE_SIZE ) > + { > + ASSERT_UNREACHABLE(); > + return 0; > + } > + > + spin_lock(&vpci->lock); > + r = vpci_get_register(vpci, offset, 4); > + if ( !r ) > + { > + spin_unlock(&vpci->lock); > + return -ENODEV; > + } > + > + header = (uint32_t)(uintptr_t)r->private; > + if ( offset == PCI_CFG_SPACE_SIZE ) > + { > + if ( PCI_EXT_CAP_NEXT(header) <= PCI_CFG_SPACE_SIZE ) > + r->private = (void *)(uintptr_t)0; > + else > + /* > + * The first extended capability (0x100) can not be removed from > + * the linked list, so instead mask its capability ID to return 0 > + * and force OSes to skip it. > + */ > + r->private = (void *)(uintptr_t)(header & > ~PCI_EXT_CAP_ID(header));
Can we rely on OSes recognizing ID 0 as "just skip"? Since the size isn't encoded in the header, there might be issues lurking here. Jan