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