summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2014-12-18 16:23:27 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2014-12-18 16:23:27 +0000
commitdd005a0ab1e7a807acd5252fc3049430d4343db5 (patch)
tree94e917ab35e95febeb38e00c3e9b7bbd8ca8e31b /sys
parentd79b7701ee631ac47940da891ca94ff38c1b4125 (diff)
If support is present, use rdrand() at resume time. Make the rdrand()
function easier to call. ok reyk djm
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/amd64/amd64/cpu.c26
-rw-r--r--sys/arch/i386/i386/cpu.c26
2 files changed, 46 insertions, 6 deletions
diff --git a/sys/arch/amd64/amd64/cpu.c b/sys/arch/amd64/amd64/cpu.c
index 338b91a45aa..b76e7fc6545 100644
--- a/sys/arch/amd64/amd64/cpu.c
+++ b/sys/arch/amd64/amd64/cpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.75 2014/12/18 05:33:48 mlarkin Exp $ */
+/* $OpenBSD: cpu.c,v 1.76 2014/12/18 16:23:26 deraadt Exp $ */
/* $NetBSD: cpu.c,v 1.1 2003/04/26 18:39:26 fvdl Exp $ */
/*-
@@ -110,6 +110,7 @@
int cpu_match(struct device *, void *, void *);
void cpu_attach(struct device *, struct device *, void *);
+int cpu_activate(struct device *, int);
void patinit(struct cpu_info *ci);
struct cpu_softc {
@@ -192,7 +193,7 @@ struct cpu_functions mp_cpu_funcs = { mp_cpu_start, NULL,
#endif /* MULTIPROCESSOR */
struct cfattach cpu_ca = {
- sizeof(struct cpu_softc), cpu_match, cpu_attach
+ sizeof(struct cpu_softc), cpu_match, cpu_attach, NULL, cpu_activate
};
struct cfdriver cpu_cd = {
@@ -938,6 +939,7 @@ void
rdrand(void *v)
{
struct timeout *tmo = v;
+ extern int has_rdrand;
union {
uint64_t u64;
uint32_t u32[2];
@@ -945,6 +947,8 @@ rdrand(void *v)
uint64_t valid;
int i;
+ if (has_rdrand == 0)
+ return;
for (i = 0; i < 2; i++) {
__asm volatile(
"xor %1, %1\n\t"
@@ -958,5 +962,21 @@ rdrand(void *v)
}
}
- timeout_add_msec(tmo, 10);
+ if (tmo)
+ timeout_add_msec(tmo, 10);
+}
+
+int
+cpu_activate(struct device *self, int act)
+{
+ struct cpu_softc *sc = (struct cpu_softc *)self;
+
+ switch (act) {
+ case DVACT_RESUME:
+ if (sc->sc_info->ci_cpuid == 0)
+ rdrand(NULL);
+ break;
+ }
+
+ return (0);
}
diff --git a/sys/arch/i386/i386/cpu.c b/sys/arch/i386/i386/cpu.c
index 9c99e8c0df3..3c613ca6cb7 100644
--- a/sys/arch/i386/i386/cpu.c
+++ b/sys/arch/i386/i386/cpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.58 2014/12/14 05:04:49 guenther Exp $ */
+/* $OpenBSD: cpu.c,v 1.59 2014/12/18 16:23:25 deraadt Exp $ */
/* $NetBSD: cpu.c,v 1.1.2.7 2000/06/26 02:04:05 sommerfeld Exp $ */
/*-
@@ -107,6 +107,7 @@
int cpu_match(struct device *, void *, void *);
void cpu_attach(struct device *, struct device *, void *);
+int cpu_activate(struct device *, int);
void patinit(struct cpu_info *ci);
void cpu_idle_mwait_cycle(void);
void cpu_init_mwait(struct device *);
@@ -155,7 +156,7 @@ cpu_init_first()
#endif
struct cfattach cpu_ca = {
- sizeof(struct cpu_info), cpu_match, cpu_attach
+ sizeof(struct cpu_info), cpu_match, cpu_attach, NULL, cpu_activate
};
struct cfdriver cpu_cd = {
@@ -483,9 +484,12 @@ void
rdrand(void *v)
{
struct timeout *tmo = v;
+ extern int has_rdrand;
uint32_t r, valid;
int i;
+ if (has_rdrand == 0)
+ return;
for (i = 0; i < 4; i++) {
__asm volatile(
"xor %1, %1\n\t"
@@ -496,7 +500,23 @@ rdrand(void *v)
add_true_randomness(r);
}
- timeout_add_msec(tmo, 10);
+ if (tmo)
+ timeout_add_msec(tmo, 10);
+}
+
+int
+cpu_activate(struct device *self, int act)
+{
+ struct cpu_info *sc = (struct cpu_info *)self;
+
+ switch (act) {
+ case DVACT_RESUME:
+ if (sc->ci_cpuid == 0)
+ rdrand(NULL);
+ break;
+ }
+
+ return (0);
}
#ifdef MULTIPROCESSOR