Print this page
3605 Xen HVM hangs during boot if apix is enabled

@@ -112,11 +112,12 @@
 static void apix_intx_clear_mask(int irqno);
 static int apix_intx_get_shared(int irqno);
 static void apix_intx_set_shared(int irqno, int delta);
 static apix_vector_t *apix_intx_xlate_vector(dev_info_t *, int,
     struct intrspec *);
-static int apix_intx_alloc_vector(dev_info_t *, int, struct intrspec *);
+static int apix_intx_alloc_vector(dev_info_t *, ddi_intr_handle_impl_t *,
+    struct intrspec *);
 
 extern int apic_clkinit(int);
 
 /* IRM initialization for APIX PSM module */
 extern void apix_irm_init(void);

@@ -259,19 +260,10 @@
         int rval;
 
         if (apix_enable == 0)
                 return (PSM_FAILURE);
 
-        /*
-         * FIXME Temporarily disable apix module on Xen HVM platform due to
-         * known hang during boot (see #3605).
-         *
-         * Please remove when/if the issue is resolved.
-         */
-        if (get_hwenv() == HW_XEN_HVM)
-                return (PSM_FAILURE);
-
         /* check for hw features if specified  */
         if (apix_hw_chk_enable) {
                 /* check if x2APIC mode is supported */
                 if ((apix_supported_hw & APIX_SUPPORT_X2APIC) ==
                     APIX_SUPPORT_X2APIC) {

@@ -1182,12 +1174,11 @@
                         /* allocate or share vector for fixed */
                         if ((ihdl_plat_t *)hdlp->ih_private == NULL) {
                                 return (PSM_FAILURE);
                         }
                         ispec = ((ihdl_plat_t *)hdlp->ih_private)->ip_ispecp;
-                        *result = apix_intx_alloc_vector(dip, hdlp->ih_inum,
-                            ispec);
+                        *result = apix_intx_alloc_vector(dip, hdlp, ispec);
                         break;
                 default:
                         return (PSM_FAILURE);
                 }
                 break;

@@ -2521,21 +2512,24 @@
         mutex_exit(&airq_mutex);
         return (newirq);
 }
 
 static int
-apix_intx_alloc_vector(dev_info_t *dip, int inum, struct intrspec *ispec)
+apix_intx_alloc_vector(dev_info_t *dip, ddi_intr_handle_impl_t *hdlp,
+    struct intrspec *ispec)
 {
         int irqno;
         apix_vector_t *vecp;
 
-        if ((irqno = apix_intx_xlate_irq(dip, inum, ispec)) == -1)
+        if ((irqno = apix_intx_xlate_irq(dip, hdlp->ih_inum, ispec)) == -1)
                 return (0);
 
-        if ((vecp = apix_alloc_intx(dip, inum, irqno)) == NULL)
+        if ((vecp = apix_alloc_intx(dip, hdlp->ih_inum, irqno)) == NULL)
                 return (0);
 
+        hdlp->ih_irq = irqno;
+
         DDI_INTR_IMPLDBG((CE_CONT, "apix_intx_alloc_vector: dip=0x%p name=%s "
             "irqno=0x%x cpuid=%d vector=0x%x\n",
             (void *)dip, ddi_driver_name(dip), irqno,
             vecp->v_cpuid, vecp->v_vector));