Author: jhibbits
Date: Sat Jan 19 04:47:19 2019
New Revision: 343167
URL: https://svnweb.freebsd.org/changeset/base/343167

Log:
  powerpc: Fix opaque irq data initialization
  
  The powerpc_intr structure is not zero-initialized, so on an invariants
  build would panic in the xics driver with an invalid pointer.  Also fix the
  xics driver to share the private data setup code between xics_enable() and
  xics_bind().
  
  Reported by:  Leonardo Bianconi

Modified:
  head/sys/powerpc/powerpc/intr_machdep.c
  head/sys/powerpc/pseries/xics.c

Modified: head/sys/powerpc/powerpc/intr_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/intr_machdep.c     Fri Jan 18 23:54:51 2019        
(r343166)
+++ head/sys/powerpc/powerpc/intr_machdep.c     Sat Jan 19 04:47:19 2019        
(r343167)
@@ -209,6 +209,7 @@ intr_lookup(u_int irq)
 
        i->event = NULL;
        i->cntp = NULL;
+       i->priv = NULL;
        i->trig = INTR_TRIGGER_CONFORM;
        i->pol = INTR_POLARITY_CONFORM;
        i->irq = irq;

Modified: head/sys/powerpc/pseries/xics.c
==============================================================================
--- head/sys/powerpc/pseries/xics.c     Fri Jan 18 23:54:51 2019        
(r343166)
+++ head/sys/powerpc/pseries/xics.c     Sat Jan 19 04:47:19 2019        
(r343167)
@@ -295,6 +295,20 @@ xics_attach(device_t dev)
        return (0);
 }
 
+static __inline struct xicp_intvec *
+xicp_setup_priv(struct xicp_softc *sc, u_int irq, void **priv)
+{
+       if (*priv == NULL) {
+               KASSERT(sc->nintvecs + 1 < nitems(sc->intvecs),
+                       ("Too many XICP interrupts"));
+               mtx_lock(&sc->sc_mtx);
+               *priv = &sc->intvecs[sc->nintvecs++];
+               mtx_unlock(&sc->sc_mtx);
+       }
+
+       return (*priv);
+}
+
 /*
  * PIC I/F methods.
  */
@@ -311,11 +325,8 @@ xicp_bind(device_t dev, u_int irq, cpuset_t cpumask, v
        if (irq == MAX_XICP_IRQS)
                return;
 
-       if (*priv == NULL)
-               *priv = &sc->intvecs[sc->nintvecs++];
+       iv = xicp_setup_priv(sc, irq, priv);
 
-       iv = *priv;
-
        /*
         * This doesn't appear to actually support affinity groups, so pick a
         * random CPU.
@@ -426,14 +437,7 @@ xicp_enable(device_t dev, u_int irq, u_int vector, voi
        /* Bind to this CPU to start: distrib. ID is last entry in gserver# */
        cpu = PCPU_GET(hwref);
 
-       if (*priv == NULL) {
-               KASSERT(sc->nintvecs + 1 < nitems(sc->intvecs),
-                       ("Too many XICP interrupts"));
-               mtx_lock(&sc->sc_mtx);
-               *priv = &sc->intvecs[sc->nintvecs++];
-               mtx_unlock(&sc->sc_mtx);
-       }
-       intr = *priv;
+       intr = xicp_setup_priv(sc, irq, priv);
 
        intr->irq = irq;
        intr->vector = vector;
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to