#!/bin/sh
if [ $(id -u) != 0 ]; then
 echo Error: You must be root to run this script!
 exit 1
fi

cd /usr/share/virtualbox/src/vboxhost/vboxpci

# https://www.virtualbox.org/ticket/9743

patch --no-backup-if-mismatch -p4 << 'EOT'
--- src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c	(Revision 39223)
+++ src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c	(Revision 39224)
@@ -33,14 +33,22 @@
 #include "VBoxPciInternal.h"
 
 #ifdef VBOX_WITH_IOMMU
-#include <linux/dmar.h>
-#include <linux/intel-iommu.h>
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)
-# include <asm/amd_iommu.h>
-#else
-# include <linux/amd-iommu.h>
-#endif
-#endif
+# include <linux/dmar.h>
+# include <linux/intel-iommu.h>
+# include <linux/pci.h>
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)
+#  include <asm/amd_iommu.h>
+# else
+#  include <linux/amd-iommu.h>
+# endif
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 2, 0)
+#  define IOMMU_PRESENT()      iommu_found()
+#  define IOMMU_DOMAIN_ALLOC() iommu_domain_alloc()
+# else
+#  define IOMMU_PRESENT()      iommu_present(&pci_bus_type)
+#  define IOMMU_DOMAIN_ALLOC() iommu_domain_alloc(&pci_bus_type)
+# endif
+#endif /* VBOX_WITH_IOMMU */
 
 
 /*******************************************************************************
@@ -146,7 +154,7 @@
 #endif
 
 #ifdef VBOX_WITH_IOMMU
-    if (iommu_found())
+    if (IOMMU_PRESENT())
         printk(KERN_INFO "vboxpci: IOMMU found\n");
     else
         printk(KERN_INFO "vboxpci: IOMMU not found (not registered)\n");
@@ -984,9 +992,9 @@
     printk(KERN_DEBUG "vboxPciOsInitVm: %p\n", pThis);
 #endif
 #ifdef VBOX_WITH_IOMMU
-    if (iommu_found())
+    if (IOMMU_PRESENT())
     {
-        pThis->pIommuDomain = iommu_domain_alloc();
+        pThis->pIommuDomain = IOMMU_DOMAIN_ALLOC();
         if (!pThis->pIommuDomain)
         {
             printk(KERN_DEBUG "cannot allocate IOMMU domain\n");
EOT
/etc/init.d/vboxdrv setup
