int pci_conf_write_intercept(unsigned int seg, unsigned int bdf, unsigned int reg, unsigned int size, uint32_t *data) { struct pci_dev *pdev; int rc = xsm_pci_config_permission(XSM_HOOK, current->domain, bdf, reg, reg + size - 1, 1); if ( rc < 0 ) return rc; ASSERT(!rc); /* * Avoid expensive operations when no hook is going to do anything * for the access anyway. */ if ( reg < 64 || reg >= 256 ) return 0; pcidevs_lock(); pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); if ( pdev ) rc = pci_msi_conf_write_intercept(pdev, reg, size, data); pcidevs_unlock(); return rc; }
static void map_me_phantom_function(struct domain *domain, u32 dev, int map) { struct acpi_drhd_unit *drhd; struct pci_dev *pdev; /* find ME VT-d engine base on a real ME device */ pdev = pci_get_pdev(0, PCI_DEVFN(dev, 0)); drhd = acpi_find_matched_drhd_unit(pdev); /* map or unmap ME phantom function */ if ( map ) domain_context_mapping_one(domain, drhd->iommu, 0, PCI_DEVFN(dev, 7)); else domain_context_unmap_one(domain, drhd->iommu, 0, PCI_DEVFN(dev, 7)); }
int pci_conf_write_intercept(unsigned int seg, unsigned int bdf, unsigned int reg, unsigned int size, uint32_t *data) { struct pci_dev *pdev; int rc = 0; /* * Avoid expensive operations when no hook is going to do anything * for the access anyway. */ if ( reg < 64 || reg >= 256 ) return 0; spin_lock(&pcidevs_lock); pdev = pci_get_pdev(seg, PCI_BUS(bdf), PCI_DEVFN2(bdf)); if ( pdev ) rc = pci_msi_conf_write_intercept(pdev, reg, size, data); spin_unlock(&pcidevs_lock); return rc; }
void __init vga_endboot(void) { if ( vga_puts == vga_noop_puts ) return; printk("Xen is %s VGA console.\n", vgacon_keep ? "keeping" : "relinquishing"); if ( !vgacon_keep ) vga_puts = vga_noop_puts; else { int bus, devfn; for ( bus = 0; bus < 256; ++bus ) for ( devfn = 0; devfn < 256; ++devfn ) { const struct pci_dev *pdev; u8 b = bus, df = devfn, sb; spin_lock(&pcidevs_lock); pdev = pci_get_pdev(0, bus, devfn); spin_unlock(&pcidevs_lock); if ( !pdev || pci_conf_read16(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), PCI_CLASS_DEVICE) != 0x0300 || !(pci_conf_read16(0, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), PCI_COMMAND) & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) ) continue; while ( b ) { switch ( find_upstream_bridge(0, &b, &df, &sb) ) { case 0: b = 0; break; case 1: switch ( pci_conf_read8(0, b, PCI_SLOT(df), PCI_FUNC(df), PCI_HEADER_TYPE) ) { case PCI_HEADER_TYPE_BRIDGE: case PCI_HEADER_TYPE_CARDBUS: if ( pci_conf_read16(0, b, PCI_SLOT(df), PCI_FUNC(df), PCI_BRIDGE_CONTROL) & PCI_BRIDGE_CTL_VGA ) continue; break; } break; } break; } if ( !b ) { printk(XENLOG_INFO "Boot video device %02x:%02x.%u\n", bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); pci_hide_device(bus, devfn); } } } switch ( vga_console_info.video_type ) { case XEN_VGATYPE_TEXT_MODE_3: if ( !vgacon_keep ) memset(video, 0, columns * lines * 2); break; case XEN_VGATYPE_VESA_LFB: case XEN_VGATYPE_EFI_LFB: vesa_endboot(vgacon_keep); break; default: BUG(); } }