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));