From: Julien Grall Date: Tue, 17 Nov 2020 13:45:47 +0000 (+0000) Subject: xen/iommu: vtd: Fix undefined behavior pci_vtd_quirks() X-Git-Tag: archive/raspbian/4.16.0+51-g0941d6cb-1+rpi1~2^2~42^2~1367 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=aec46884784c2494a30221da775d4ac2c43a4d42;p=xen.git xen/iommu: vtd: Fix undefined behavior pci_vtd_quirks() When booting Xen with CONFIG_USBAN=y on Sandy Bridge, UBSAN will throw the following splat: (XEN) ================================================================================ (XEN) UBSAN: Undefined behaviour in quirks.c:449:63 (XEN) left shift of 1 by 31 places cannot be represented in type 'int' (XEN) ----[ Xen-4.11.4 x86_64 debug=y Not tainted ]---- [...] (XEN) Xen call trace: (XEN) [] ubsan.c#ubsan_epilogue+0xa/0xad (XEN) [] __ubsan_handle_shift_out_of_bounds+0xb4/0x145 (XEN) [] pci_vtd_quirk+0x3d3/0x74f (XEN) [] iommu.c#domain_context_mapping+0x45b/0x46f (XEN) [] iommu.c#setup_hwdom_device+0x22/0x3a (XEN) [] pci.c#setup_one_hwdom_device+0x8c/0x124 (XEN) [] pci.c#_setup_hwdom_pci_devices+0xbb/0x2f7 (XEN) [] pci.c#pci_segments_iterate+0x4c/0x8c (XEN) [] setup_hwdom_pci_devices+0x25/0x2c (XEN) [] iommu.c#intel_iommu_hwdom_init+0x52/0x2f3 (XEN) [] iommu_hwdom_init+0x4e/0xa4 (XEN) [] dom0_construct_pv+0x23c8/0x2476 (XEN) [] construct_dom0+0x6c/0xa3 (XEN) [] __start_xen+0x4651/0x4b55 (XEN) [] __high_start+0x53/0x55 Note that splat is from 4.11.4 and not staging. Although, the problem is still present. This can be solved by making the first operand unsigned int. Signed-off-by: Julien Grall Acked-by: Andrew Cooper Reviewed-by: Jan Beulich Reviewed-by: Kevin Tian --- diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough/vtd/quirks.c index a8330f17bc..8a81d9c930 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -435,7 +435,7 @@ void pci_vtd_quirk(const struct pci_dev *pdev) case 0x3728: /* Xeon C5500/C3500 (JasperForest) */ case 0x3c28: /* Sandybridge */ val = pci_conf_read32(pdev->sbdf, 0x1AC); - pci_conf_write32(pdev->sbdf, 0x1AC, val | (1 << 31)); + pci_conf_write32(pdev->sbdf, 0x1AC, val | (1U << 31)); printk(XENLOG_INFO "Masked VT-d error signaling on %pp\n", &pdev->sbdf); break;