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

*** 112,122 **** 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 *); extern int apic_clkinit(int); /* IRM initialization for APIX PSM module */ extern void apix_irm_init(void); --- 112,123 ---- 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 *, 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,277 **** 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) { --- 260,269 ----
*** 1182,1193 **** /* 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); break; default: return (PSM_FAILURE); } break; --- 1174,1184 ---- /* 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, ispec); break; default: return (PSM_FAILURE); } break;
*** 2521,2541 **** mutex_exit(&airq_mutex); return (newirq); } static int ! apix_intx_alloc_vector(dev_info_t *dip, int inum, struct intrspec *ispec) { int irqno; apix_vector_t *vecp; ! if ((irqno = apix_intx_xlate_irq(dip, inum, ispec)) == -1) return (0); ! if ((vecp = apix_alloc_intx(dip, inum, irqno)) == NULL) return (0); 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)); --- 2512,2535 ---- mutex_exit(&airq_mutex); return (newirq); } static int ! 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, hdlp->ih_inum, ispec)) == -1) return (0); ! 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));