rndcontrol doesn't work on -STABLE?

Gregory Neil Shapiro gshapiro at freebsd.org
Sun Feb 22 17:37:12 PST 2004


> > +			for (i = 0; i < 24; i++)
> >  				if (irq & (1 << i))
> >  					printf(" %d", i);
> 
> 	This is broken.  'irq' is u_int16_t.

Thanks, I warned it was untested.  In case anyone wants a fixed patch,
still untested:

--- sys/sys/random.h.orig	Sun Feb 22 17:34:16 2004
+++ sys/sys/random.h	Sun Feb 22 17:34:35 2004
@@ -54,7 +54,7 @@
 
 #define	MEM_SETIRQ	_IOW('r', 1, u_int16_t)	/* set interrupt */
 #define	MEM_CLEARIRQ	_IOW('r', 2, u_int16_t)	/* clear interrupt */
-#define	MEM_RETURNIRQ	_IOR('r', 3, u_int16_t)	/* return interrupt */
+#define	MEM_RETURNIRQ	_IOR('r', 3, u_int32_t)	/* return interrupt */
 
 #ifdef _KERNEL
 
--- sys/i386/i386/mem.c.orig	Sun Feb 22 17:15:13 2004
+++ sys/i386/i386/mem.c	Sun Feb 22 17:33:05 2004
@@ -65,6 +65,7 @@
 #include <machine/psl.h>
 #include <machine/specialreg.h>
 #include <i386/isa/intr_machdep.h>
+#include <i386/isa/icu.h>
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
@@ -96,7 +97,7 @@
 	/* bmaj */	-1
 };
 
-static struct random_softc random_softc[16];
+static struct random_softc random_softc[ICU_LEN];
 static caddr_t	zbuf;
 
 MALLOC_DEFINE(M_MEMDESC, "memdesc", "memory range descriptors");
@@ -471,9 +472,6 @@
 		return (ENOTTY);
 
 	/*
-	 * XXX the data is 16-bit due to a historical botch, so we use
-	 * magic 16's instead of ICU_LEN and can't support 24 interrupts
-	 * under SMP.
 	 * Even inspecting the state is privileged, since it gives a hint
 	 * about how easily the randomness might be guessed.
 	 */
@@ -489,7 +487,7 @@
 		error = suser(p);
 		if (error != 0)
 			return (error);
-		if (intr < 0 || intr >= 16)
+		if (intr < 0 || intr >= ICU_LEN)
 			return (EINVAL);
 		if (interrupt_allowed & interrupt_mask)
 			break;
@@ -506,7 +504,7 @@
 		error = suser(p);
 		if (error != 0)
 			return (error);
-		if (intr < 0 || intr >= 16)
+		if (intr < 0 || intr >= ICU_LEN)
 			return (EINVAL);
 		if (!(interrupt_allowed & interrupt_mask))
 			break;
@@ -520,7 +518,7 @@
 		error = suser(p);
 		if (error != 0)
 			return (error);
-		*(u_int16_t *)data = interrupt_allowed;
+		*(u_int32_t *)data = interrupt_allowed;
 		break;
 	}
 	return (0);
--- usr.sbin/rndcontrol/rndcontrol.c.orig	Sun Feb 22 17:15:13 2004
+++ usr.sbin/rndcontrol/rndcontrol.c	Sun Feb 22 17:33:16 2004
@@ -48,7 +48,7 @@
 main(int argc, char *argv[])
 {
 	int verbose, ch, fd, result, i;
-	u_int16_t irq;
+	u_int32_t irq;
 
 	verbose = 1;
 
@@ -95,7 +95,7 @@
 				return (1);
 			}
 			printf("%s: interrupts in use:", argv[0]);
-			for (i = 0; i < 16; i++)
+			for (i = 0; i < 24; i++)
 				if (irq & (1 << i))
 					printf(" %d", i);
 			printf("\n");


More information about the freebsd-stable mailing list