Integrate the interrupt related operations for /dev/random support
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 4 Jul 2003 05:57:27 +0000 (05:57 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 4 Jul 2003 05:57:27 +0000 (05:57 +0000)
directly into kern/kern_intr.c to work around a bad design.  Eventually
the 5.x random code will be backported.

sys/i386/i386/mem.c
sys/kern/kern_intr.c
sys/kern/kern_memio.c
sys/kern/kern_random.c
sys/platform/pc32/i386/mem.c
sys/sys/interrupt.h
sys/sys/random.h

index ccfcbf7..de976b6 100644 (file)
@@ -39,7 +39,7 @@
  *     from: Utah $Hdr: mem.c 1.13 89/10/08$
  *     from: @(#)mem.c 7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $
- * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.4 2003/06/25 03:55:53 dillon Exp $
+ * $DragonFly: src/sys/i386/i386/Attic/mem.c,v 1.5 2003/07/04 05:57:25 dillon Exp $
  */
 
 /*
@@ -97,7 +97,7 @@ static struct cdevsw mem_cdevsw = {
        /* bmaj */      -1
 };
 
-static struct random_softc random_softc[16];
+static int rand_bolt;
 static caddr_t zbuf;
 
 MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
@@ -253,7 +253,7 @@ mmrw(dev, uio, flags)
                                 * Use tsleep() to get the error code right.
                                 * It should return immediately.
                                 */
-                               error = tsleep(&random_softc[0],
+                               error = tsleep(&rand_bolt,
                                    PZERO | PCATCH, "urand", 1);
                                if (error != 0 && error != EWOULDBLOCK)
                                        continue;
@@ -443,7 +443,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
        static intrmask_t interrupt_allowed;
        intrmask_t interrupt_mask;
        int error, intr;
-       struct random_softc *sc;
        
        /*
         * We're the random or urandom device.  The only ioctls are for
@@ -463,7 +462,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
         */
        intr = *(int16_t *)data;
        interrupt_mask = 1 << intr;
-       sc = &random_softc[intr];
        switch (cmd) {
        /* Really handled in upper layer */
        case FIOASYNC:
@@ -478,13 +476,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (interrupt_allowed & interrupt_mask)
                        break;
                interrupt_allowed |= interrupt_mask;
-               sc->sc_intr = intr;
-               disable_intr();
-               sc->sc_handler = intr_handler[intr];
-               intr_handler[intr] = add_interrupt_randomness;
-               sc->sc_arg = intr_unit[intr];
-               intr_unit[intr] = sc;
-               enable_intr();
+               register_randintr(intr);
                break;
        case MEM_CLEARIRQ:
                error = suser(td);
@@ -495,10 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (!(interrupt_allowed & interrupt_mask))
                        break;
                interrupt_allowed &= ~interrupt_mask;
-               disable_intr();
-               intr_handler[intr] = sc->sc_handler;
-               intr_unit[intr] = sc->sc_arg;
-               enable_intr();
+               unregister_randintr(intr);
                break;
        case MEM_RETURNIRQ:
                error = suser(td);
index e261dee..5498149 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_intr.c,v 1.24.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/kern/kern_intr.c,v 1.6 2003/06/30 19:50:31 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_intr.c,v 1.7 2003/07/04 05:57:27 dillon Exp $
  *
  */
 
@@ -36,6 +36,7 @@
 #include <sys/thread.h>
 #include <sys/proc.h>
 #include <sys/thread2.h>
+#include <sys/random.h>
 
 #include <machine/ipl.h>
 
@@ -52,6 +53,7 @@ typedef struct intrec {
 static intrec_t        *intlists[NHWI+NSWI];
 static thread_t ithreads[NHWI+NSWI];
 static struct thread ithread_ary[NHWI+NSWI];
+static struct random_softc irandom_ary[NHWI+NSWI];
 
 static void ithread_handler(void *arg);
 
@@ -155,6 +157,21 @@ swi_setpriority(int intr, int pri)
        lwkt_setpri(td, pri);
 }
 
+void
+register_randintr(int intr)
+{
+    struct random_softc *sc = &irandom_ary[intr];
+    sc->sc_intr = intr;
+    sc->sc_enabled = 1;
+}
+
+void
+unregister_randintr(int intr)
+{
+    struct random_softc *sc = &irandom_ary[intr];
+    sc->sc_enabled = 0;
+}
+
 /*
  * Dispatch an interrupt.  If there's nothing to do we have a stray
  * interrupt and can just return, leaving the interrupt masked.
@@ -187,6 +204,7 @@ ithread_handler(void *arg)
     intrec_t **list = &intlists[intr];
     intrec_t *rec;
     intrec_t *nrec;
+    struct random_softc *sc = &irandom_ary[intr];
 
     KKASSERT(curthread->td_pri >= TDPRI_CRIT);
     for (;;) {
@@ -194,6 +212,8 @@ ithread_handler(void *arg)
            nrec = rec->next;
            rec->handler(rec->argument);
        }
+       if (sc->sc_enabled)
+               add_interrupt_randomness(intr);
        ithread_done(intr);
     }
 }
index 9982055..e962f09 100644 (file)
@@ -39,7 +39,7 @@
  *     from: Utah $Hdr: mem.c 1.13 89/10/08$
  *     from: @(#)mem.c 7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $
- * $DragonFly: src/sys/kern/kern_memio.c,v 1.4 2003/06/25 03:55:53 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_memio.c,v 1.5 2003/07/04 05:57:25 dillon Exp $
  */
 
 /*
@@ -97,7 +97,7 @@ static struct cdevsw mem_cdevsw = {
        /* bmaj */      -1
 };
 
-static struct random_softc random_softc[16];
+static int rand_bolt;
 static caddr_t zbuf;
 
 MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
@@ -253,7 +253,7 @@ mmrw(dev, uio, flags)
                                 * Use tsleep() to get the error code right.
                                 * It should return immediately.
                                 */
-                               error = tsleep(&random_softc[0],
+                               error = tsleep(&rand_bolt,
                                    PZERO | PCATCH, "urand", 1);
                                if (error != 0 && error != EWOULDBLOCK)
                                        continue;
@@ -443,7 +443,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
        static intrmask_t interrupt_allowed;
        intrmask_t interrupt_mask;
        int error, intr;
-       struct random_softc *sc;
        
        /*
         * We're the random or urandom device.  The only ioctls are for
@@ -463,7 +462,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
         */
        intr = *(int16_t *)data;
        interrupt_mask = 1 << intr;
-       sc = &random_softc[intr];
        switch (cmd) {
        /* Really handled in upper layer */
        case FIOASYNC:
@@ -478,13 +476,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (interrupt_allowed & interrupt_mask)
                        break;
                interrupt_allowed |= interrupt_mask;
-               sc->sc_intr = intr;
-               disable_intr();
-               sc->sc_handler = intr_handler[intr];
-               intr_handler[intr] = add_interrupt_randomness;
-               sc->sc_arg = intr_unit[intr];
-               intr_unit[intr] = sc;
-               enable_intr();
+               register_randintr(intr);
                break;
        case MEM_CLEARIRQ:
                error = suser(td);
@@ -495,10 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (!(interrupt_allowed & interrupt_mask))
                        break;
                interrupt_allowed &= ~interrupt_mask;
-               disable_intr();
-               intr_handler[intr] = sc->sc_handler;
-               intr_unit[intr] = sc->sc_arg;
-               enable_intr();
+               unregister_randintr(intr);
                break;
        case MEM_RETURNIRQ:
                error = suser(td);
index 664a61c..67531ed 100644 (file)
@@ -2,7 +2,7 @@
  * kern_random.c -- A strong random number generator
  *
  * $FreeBSD: src/sys/kern/kern_random.c,v 1.36.2.4 2002/09/17 17:11:57 sam Exp $
- * $DragonFly: src/sys/kern/Attic/kern_random.c,v 1.3 2003/06/23 17:55:41 dillon Exp $
+ * $DragonFly: src/sys/kern/Attic/kern_random.c,v 1.4 2003/07/04 05:57:27 dillon Exp $
  *
  * Version 0.95, last modified 18-Oct-95
  * 
@@ -113,7 +113,7 @@ static struct random_bucket random_state;
 static u_int32_t random_pool[POOLWORDS];
 static struct timer_rand_state keyboard_timer_state;
 static struct timer_rand_state extract_timer_state;
-static struct timer_rand_state irq_timer_state[ICU_LEN];
+static struct timer_rand_state irq_timer_state[MAX_INTS];
 #ifdef notyet
 static struct timer_rand_state blkdev_timer_state[MAX_BLKDEV];
 #endif
@@ -240,13 +240,8 @@ add_keyboard_randomness(u_char scancode)
 }
 
 void
-add_interrupt_randomness(void *vsc)
+add_interrupt_randomness(int intr)
 {
-       int intr;
-       struct random_softc *sc = vsc;
-
-       (sc->sc_handler)(sc->sc_arg);
-       intr = sc->sc_intr;
        add_timer_randomness(&random_state, &irq_timer_state[intr], intr);
 }
 
index 9c518cc..8a2fe26 100644 (file)
@@ -39,7 +39,7 @@
  *     from: Utah $Hdr: mem.c 1.13 89/10/08$
  *     from: @(#)mem.c 7.2 (Berkeley) 5/9/91
  * $FreeBSD: src/sys/i386/i386/mem.c,v 1.79.2.9 2003/01/04 22:58:01 njl Exp $
- * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.4 2003/06/25 03:55:53 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/Attic/mem.c,v 1.5 2003/07/04 05:57:25 dillon Exp $
  */
 
 /*
@@ -97,7 +97,7 @@ static struct cdevsw mem_cdevsw = {
        /* bmaj */      -1
 };
 
-static struct random_softc random_softc[16];
+static int rand_bolt;
 static caddr_t zbuf;
 
 MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
@@ -253,7 +253,7 @@ mmrw(dev, uio, flags)
                                 * Use tsleep() to get the error code right.
                                 * It should return immediately.
                                 */
-                               error = tsleep(&random_softc[0],
+                               error = tsleep(&rand_bolt,
                                    PZERO | PCATCH, "urand", 1);
                                if (error != 0 && error != EWOULDBLOCK)
                                        continue;
@@ -443,7 +443,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
        static intrmask_t interrupt_allowed;
        intrmask_t interrupt_mask;
        int error, intr;
-       struct random_softc *sc;
        
        /*
         * We're the random or urandom device.  The only ioctls are for
@@ -463,7 +462,6 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
         */
        intr = *(int16_t *)data;
        interrupt_mask = 1 << intr;
-       sc = &random_softc[intr];
        switch (cmd) {
        /* Really handled in upper layer */
        case FIOASYNC:
@@ -478,13 +476,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (interrupt_allowed & interrupt_mask)
                        break;
                interrupt_allowed |= interrupt_mask;
-               sc->sc_intr = intr;
-               disable_intr();
-               sc->sc_handler = intr_handler[intr];
-               intr_handler[intr] = add_interrupt_randomness;
-               sc->sc_arg = intr_unit[intr];
-               intr_unit[intr] = sc;
-               enable_intr();
+               register_randintr(intr);
                break;
        case MEM_CLEARIRQ:
                error = suser(td);
@@ -495,10 +487,7 @@ random_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct thread *td)
                if (!(interrupt_allowed & interrupt_mask))
                        break;
                interrupt_allowed &= ~interrupt_mask;
-               disable_intr();
-               intr_handler[intr] = sc->sc_handler;
-               intr_unit[intr] = sc->sc_arg;
-               enable_intr();
+               unregister_randintr(intr);
                break;
        case MEM_RETURNIRQ:
                error = suser(td);
index 42199e3..bd79a37 100644 (file)
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/sys/interrupt.h,v 1.9.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/sys/interrupt.h,v 1.4 2003/06/29 07:37:07 dillon Exp $
+ * $DragonFly: src/sys/sys/interrupt.h,v 1.5 2003/07/04 05:57:27 dillon Exp $
  */
 
 #ifndef _SYS_INTERRUPT_H_
 #define _SYS_INTERRUPT_H_
 
+#define MAX_INTS       32
+
 typedef void inthand2_t __P((void *_cookie));
 typedef void ointhand2_t __P((int _device_id));
 
 void register_swi(int intr, inthand2_t *handler, void *arg, const char *name);
 void register_int(int intr, inthand2_t *handler, void *arg, const char *name);
+void register_randintr(int intr);
 void swi_setpriority(int intr, int pri);
 void unregister_swi(int intr, inthand2_t *handler);
 void unregister_int(int intr, inthand2_t *handler);
+void unregister_randintr(int intr);
 void ithread_done(int intr);   /* procedure defined in MD */
 void sched_ithd(int intr);     /* procedure called from MD */
 
index efbe4bb..37702c0 100644 (file)
@@ -2,7 +2,7 @@
  * random.h -- A strong random number generator
  *
  * $FreeBSD: src/sys/sys/random.h,v 1.19.2.2 2002/09/17 17:11:54 sam Exp $
- * $DragonFly: src/sys/sys/random.h,v 1.4 2003/06/29 03:28:46 dillon Exp $
+ * $DragonFly: src/sys/sys/random.h,v 1.5 2003/07/04 05:57:27 dillon Exp $
  *
  * Version 0.95, last modified 18-Oct-95
  * 
 /* Type of the cookie passed to add_interrupt_randomness. */
 
 struct random_softc {
-       inthand2_t      *sc_handler;
-       void            *sc_arg;
        int             sc_intr;
+       int             sc_enabled;
 };
 
 /* Exported functions */
 
 void rand_initialize(void);
 void add_keyboard_randomness(u_char scancode);
-inthand2_t add_interrupt_randomness;
+void add_interrupt_randomness(int intr);
 #ifdef notused
 void add_blkdev_randomness(int major);
 #endif