aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/random
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2019-04-16 17:12:17 +0000
committerConrad Meyer <cem@FreeBSD.org>2019-04-16 17:12:17 +0000
commitf3d2512db6ec23985b10fbcbe0b3bd34ea2574df (patch)
tree362456f2c947da3e40f2af0117dbaf150fd0fd3d /sys/dev/random
parent2866548c8a947b478c5700a7fac0c85d0b5ccaed (diff)
Notes
Diffstat (limited to 'sys/dev/random')
-rw-r--r--sys/dev/random/random_infra.c23
-rw-r--r--sys/dev/random/randomdev.c11
-rw-r--r--sys/dev/random/randomdev.h3
3 files changed, 34 insertions, 3 deletions
diff --git a/sys/dev/random/random_infra.c b/sys/dev/random/random_infra.c
index 324c40dcecd4..59cd44280b95 100644
--- a/sys/dev/random/random_infra.c
+++ b/sys/dev/random/random_infra.c
@@ -63,12 +63,20 @@ null_read_random(void *dummy __unused, u_int dummy2 __unused)
panic("%s: no random module is loaded", __func__);
}
+static bool
+null_is_random_seeded(void)
+{
+ return (false);
+}
+
struct random_readers {
int (*read_random_uio)(struct uio *, bool);
void (*read_random)(void *, u_int);
+ bool (*is_random_seeded)(void);
} random_reader_context = {
(int (*)(struct uio *, bool))nullop,
null_read_random,
+ null_is_random_seeded,
};
struct sx randomdev_config_lock;
@@ -82,12 +90,15 @@ random_infra_sysinit(void *dummy __unused)
SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_FIRST, random_infra_sysinit, NULL);
void
-random_infra_init(int (*p_random_read_uio)(struct uio *, bool), void (*p_random_read)(void *, u_int))
+random_infra_init(int (*p_random_read_uio)(struct uio *, bool),
+ void (*p_random_read)(void *, u_int),
+ bool (*p_is_random_seeded)(void))
{
RANDOM_CONFIG_X_LOCK();
random_reader_context.read_random_uio = p_random_read_uio;
random_reader_context.read_random = p_random_read;
+ random_reader_context.is_random_seeded = p_is_random_seeded;
RANDOM_CONFIG_X_UNLOCK();
}
@@ -98,6 +109,7 @@ random_infra_uninit(void)
RANDOM_CONFIG_X_LOCK();
random_reader_context.read_random_uio = (int (*)(struct uio *, bool))nullop;
random_reader_context.read_random = null_read_random;
+ random_reader_context.is_random_seeded = null_is_random_seeded;
RANDOM_CONFIG_X_UNLOCK();
}
@@ -129,4 +141,13 @@ read_random(void *buf, u_int len)
RANDOM_CONFIG_S_UNLOCK();
}
+bool
+is_random_seeded(void)
+{
+ RANDOM_CONFIG_S_LOCK();
+ random_reader_context.is_random_seeded();
+ RANDOM_CONFIG_S_UNLOCK();
+}
+
+
#endif /* defined(RANDOM_LOADABLE) */
diff --git a/sys/dev/random/randomdev.c b/sys/dev/random/randomdev.c
index 19a73b28151a..cbe01d1c5343 100644
--- a/sys/dev/random/randomdev.c
+++ b/sys/dev/random/randomdev.c
@@ -62,11 +62,14 @@ __FBSDID("$FreeBSD$");
#if defined(RANDOM_LOADABLE)
#define READ_RANDOM_UIO _read_random_uio
#define READ_RANDOM _read_random
+#define IS_RANDOM_SEEDED _is_random_seeded
static int READ_RANDOM_UIO(struct uio *, bool);
static void READ_RANDOM(void *, u_int);
+static bool IS_RANDOM_SEEDED(void);
#else
#define READ_RANDOM_UIO read_random_uio
#define READ_RANDOM read_random
+#define IS_RANDOM_SEEDED is_random_seeded
#endif
static d_read_t randomdev_read;
@@ -93,7 +96,7 @@ random_alg_context_ra_init_alg(void *data)
p_random_alg_context = &random_alg_context;
p_random_alg_context->ra_init_alg(data);
#if defined(RANDOM_LOADABLE)
- random_infra_init(READ_RANDOM_UIO, READ_RANDOM);
+ random_infra_init(READ_RANDOM_UIO, READ_RANDOM, IS_RANDOM_SEEDED);
#endif
}
@@ -271,6 +274,12 @@ READ_RANDOM(void *random_buf, u_int len)
}
}
+bool
+IS_RANDOM_SEEDED(void)
+{
+ return (p_random_alg_context->ra_seeded());
+}
+
static __inline void
randomdev_accumulate(uint8_t *buf, u_int count)
{
diff --git a/sys/dev/random/randomdev.h b/sys/dev/random/randomdev.h
index 41300f237aaf..e5df7efefa5b 100644
--- a/sys/dev/random/randomdev.h
+++ b/sys/dev/random/randomdev.h
@@ -118,7 +118,8 @@ extern struct sx randomdev_config_lock;
#define RANDOM_CONFIG_S_LOCK(x) sx_slock(&randomdev_config_lock)
#define RANDOM_CONFIG_S_UNLOCK(x) sx_sunlock(&randomdev_config_lock)
#define RANDOM_CONFIG_DEINIT_LOCK(x) sx_destroy(&randomdev_config_lock)
-void random_infra_init(int (*)(struct uio *, bool), void (*)(void *, u_int));
+void random_infra_init(int (*)(struct uio *, bool), void (*)(void *, u_int),
+ bool (*)(void));
void random_infra_uninit(void);
#endif