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

[Xen-devel] [PATCH 1/1] keep iommu disabled until iommu_setup is called



The iommu is enabled by default when xen is booting and later disabled in 
iommu_setup() when no iommu is present.

But under some circumstances iommu-code can be called before iommu_setup() is 
processed. If there is no iommu available xen crashes.

This can happen for example when panic(...) is called that got introduced with
patch "x86-64: detect processors subject to AMD erratum #121 and refuse to 
boot." since xen 4.1.3 and results in the following stacktrace:

   find_iommu_for_device
   amd_iommu_ioapic_update_ire
   timer_interrupt
   enable_8259_A_irq
   do_IRQ
   printk_start_of_line
   acpi_os_printf
   io_apic_write
   __ioapic_write_entry
   ioapic_write_entry
   __clear_IO_APIC_pin
   clear_IO_APIC
   disable_IO_APIC
   __stop_this_cpu
   smp_send_stop
   machine_restart
   panic
   tasklet_schedule_on_cpu
   display_cacheinfo
   init_amd
   generic_identify
   identify_cpu
   _start_xen
   _high_start


This patch fixes this by keeping the iommu disabled until iommu_setup() is 
entered. 

Signed-off-by: Ronny Hegewald@xxxxxxxxx

--- xen/drivers/passthrough/iommu.c.org 2012-10-05 03:38:33.000000000 +0000
+++ xen/drivers/passthrough/iommu.c     2012-10-17 22:58:07.000000000 +0000
@@ -38,7 +38,7 @@
  *   no-intremap                Disable VT-d Interrupt Remapping
  */
 custom_param("iommu", parse_iommu_param);
-bool_t __read_mostly iommu_enabled = 1;
+bool_t __read_mostly iommu_enabled = 0;
 bool_t __read_mostly force_iommu;
 bool_t __initdata iommu_dom0_strict;
 bool_t __read_mostly iommu_verbose;
@@ -51,6 +51,8 @@
 bool_t __read_mostly amd_iommu_debug;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
+bool_t iommu_enabled_default = 1;
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -61,7 +63,7 @@
             *ss = '\0';
 
         if ( !parse_bool(s) )
-            iommu_enabled = 0;
+            iommu_enabled_default = 0;
         else if ( !strcmp(s, "force") || !strcmp(s, "required") )
             force_iommu = 1;
         else if ( !strcmp(s, "workaround_bios_bug") )
@@ -312,6 +314,7 @@
 {
     int rc = -ENODEV;
     bool_t force_intremap = force_iommu && iommu_intremap;
+    iommu_enabled = iommu_enabled_default;
 
     if ( iommu_dom0_strict )
         iommu_passthrough = 0;









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


 


Rackspace

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