Improve code probing for the Intel hardware RNG to avoid false detections.
See http://home.comcast.net/~andrex/hardware-RNG/doihave.html for details. Problem pointed on by Thor Lancelot Simon on port-amd64 mailing list.
This commit is contained in:
parent
c892ebfd2b
commit
28fb66b731
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pchb_rnd.c,v 1.1 2006/02/12 18:16:01 tron Exp $ */
|
/* $NetBSD: pchb_rnd.c,v 1.2 2006/02/19 23:10:16 tron Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Michael Shalayeff
|
* Copyright (c) 2000 Michael Shalayeff
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: pchb_rnd.c,v 1.1 2006/02/12 18:16:01 tron Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: pchb_rnd.c,v 1.2 2006/02/19 23:10:16 tron Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -50,7 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: pchb_rnd.c,v 1.1 2006/02/12 18:16:01 tron Exp $");
|
||||||
#include <arch/x86/pci/i82802reg.h>
|
#include <arch/x86/pci/i82802reg.h>
|
||||||
#include <arch/x86/pci/pchbvar.h>
|
#include <arch/x86/pci/pchbvar.h>
|
||||||
|
|
||||||
void pchb_rnd_callout(void *v);
|
static void pchb_rnd_callout(void *v);
|
||||||
|
|
||||||
|
#define PCHB_RNG_RETRIES 1000
|
||||||
|
|
||||||
void
|
void
|
||||||
pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
||||||
|
@ -120,20 +122,27 @@ pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check to see if we can read data from the RNG. */
|
/* Check to see if we can read data from the RNG. */
|
||||||
for (i = 0; i < 1000; i++) {
|
for (i = 0; i < PCHB_RNG_RETRIES; i++) {
|
||||||
reg8 = bus_space_read_1(sc->sc_st, sc->sc_sh,
|
reg8 = bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||||
I82802_RNG_RNGST);
|
I82802_RNG_RNGST);
|
||||||
if (reg8 & I82802_RNG_RNGST_DATAV)
|
if (!(reg8 & I82802_RNG_RNGST_DATAV)) {
|
||||||
|
delay(10);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (bus_space_read_1(sc->sc_st, sc->sc_sh,
|
||||||
|
I82802_RNG_DATA) != 0xff) {
|
||||||
break;
|
break;
|
||||||
delay(10);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((reg8 & I82802_RNG_RNGST_DATAV) == 0) {
|
if (i == PCHB_RNG_RETRIES) {
|
||||||
bus_space_unmap(sc->sc_st, sc->sc_sh,
|
bus_space_unmap(sc->sc_st, sc->sc_sh,
|
||||||
I82802_IOSIZE);
|
I82802_IOSIZE);
|
||||||
printf("%s: unable to read from random "
|
#ifdef DIAGNOSTIC
|
||||||
"number generator.\n",
|
aprint_verbose("%s: unable to read from "
|
||||||
|
"random number generator.\n",
|
||||||
sc->sc_dev.dv_xname);
|
sc->sc_dev.dv_xname);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +175,7 @@ pchb_attach_rnd(struct pchb_softc *sc, struct pci_attach_args *pa)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
pchb_rnd_callout(void *v)
|
pchb_rnd_callout(void *v)
|
||||||
{
|
{
|
||||||
struct pchb_softc *sc = v;
|
struct pchb_softc *sc = v;
|
||||||
|
|
Loading…
Reference in New Issue