rndcontrol doesn't work on -STABLE?
Gregory Neil Shapiro
gshapiro at freebsd.org
Sun Feb 22 17:14:57 PST 2004
> > I found this comment in src/sys/i386/i386/mem.c:
> >
> > * 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.
>
> Great ... another reason to move up ... but, short term, is there any
> other way of doing this? user land daemon or something?
It looks like all of the kernel interfaces for inserting random entropy
aren't exported out of the kernel. I looked through the code involved
and it certainly seems that the code can handle the additional APIC_IO
interrupts with a few minor changes (which I haven't tried). Someone
will probably point out an obvious reason why this won't work (like some
of the low level assembly interrupt handling routines).
Index: sys/i386/i386/mem.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/mem.c,v
retrieving revision 1.79.2.10
diff -u -r1.79.2.10 mem.c
--- sys/i386/i386/mem.c 9 Aug 2003 16:21:18 -0000 1.79.2.10
+++ sys/i386/i386/mem.c 23 Feb 2004 01:03:44 -0000
@@ -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;
Index: usr.sbin/rndcontrol/rndcontrol.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rndcontrol/Attic/rndcontrol.c,v
retrieving revision 1.11.2.1
diff -u -r1.11.2.1 rndcontrol.c
--- usr.sbin/rndcontrol/rndcontrol.c 10 May 2000 02:04:44 -0000 1.11.2.1
+++ usr.sbin/rndcontrol/rndcontrol.c 23 Feb 2004 01:03:45 -0000
@@ -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