[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [RFC 6/6] acpi:arm64: Add support for parsing IORT table



On 08/06/17 20:30, Sameer Goel wrote:
[...]
>  /**
> - * iort_iommu_configure - Set-up IOMMU configuration for a device.
> + * iort_iommu_configure - Set-up IOMMU configuration for a device. This
> + * function sets up the fwspec as needed for a given device. Only PCI
> + * devices are supported for now.
>   *
>   * @dev: device to configure
>   *
> - * Returns: iommu_ops pointer on configuration success
> - *          NULL on configuration failure
> + * Returns: Appropriate acpi_status
>   */
> -const struct iommu_ops *iort_iommu_configure(struct device *dev)
> +acpi_status iort_iommu_configure(struct device *dev)
>  {
>       struct acpi_iort_node *node, *parent;
> -     const struct iommu_ops *ops = NULL;
>       u32 streamid = 0;
> +     acpi_status status = AE_OK;
>  
>       if (dev_is_pci(dev)) {
> -             struct pci_bus *bus = to_pci_dev(dev)->bus;
> +             struct pci_dev *pci_device = to_pci_dev(dev);
>               u32 rid;
>  
> -             pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid,
> -                                    &rid);
> +             rid = PCI_BDF2(pci_device->bus,pci_device->devfn);

Beware that the Linux code isn't actually correct to begin with[1]. I
don't know how much Xen deals with PCI bridges and quirks, but as it
stands you should be able to trivially expose the flaw here by plugging
in a Marvell 88SE912x-based SATA card and watching either DMA or MSIs
(or even both) kick up stream table faults.

Robin.

[1]:http://www.spinics.net/lists/linux-acpi/msg74844.html

>  
>               node = iort_scan_node(ACPI_IORT_NODE_PCI_ROOT_COMPLEX,
> -                                   iort_match_node_callback, &bus->dev);
> +                                   iort_match_node_callback, dev);
>               if (!node)
> -                     return NULL;
> +                     return AE_NOT_FOUND;
>  
>               parent = iort_node_map_rid(node, rid, &streamid,
>                                          IORT_IOMMU_TYPE);
>  
> -             ops = iort_iommu_xlate(dev, parent, streamid);
> +             status = iort_iommu_xlate(dev, parent, streamid);
> +
> +             status = status ? AE_ERROR : AE_OK;
>  
>       } else {
> +             status = AE_NOT_IMPLEMENTED;
> +#if 0
>               int i = 0;
>  
>               node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,
> @@ -616,11 +655,17 @@ const struct iommu_ops *iort_iommu_configure(struct 
> device *dev)
>                       parent = iort_node_get_id(node, &streamid,
>                                                 IORT_IOMMU_TYPE, i++);
>               }
> +#endif
>       }
>  
> -     return ops;
> +     return status;
>  }

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.