From: "H. Peter Anvin" <hpa@linux.intel.com>
To: Linus Torvalds <torvalds@linux-foundation.org>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
Thomas Gleixner <tglx@linutronix.de>,
Fenghua Yu <fenghua.yu@intel.com>, Matt Mackall <mpm@selenic.com>,
Herbert Xu <herbert@gondor.hengli.com.au>,
"Theodore Ts'o" <tytso@mit.edu>, Jeff Garzik <jgarzik@pobox.com>,
linux-kernel@vger.kernel.org
Cc: "H. Peter Anvin" <hpa@linux.intel.com>
Subject: [PATCH 1/2] random: Add support for architectural random hooks
Date: Fri, 29 Jul 2011 13:37:46 -0700 [thread overview]
Message-ID: <1311971867-25124-2-git-send-email-hpa@linux.intel.com> (raw)
In-Reply-To: <1311971867-25124-1-git-send-email-hpa@linux.intel.com>
From: "H. Peter Anvin" <hpa@linux.intel.com>
Add support for architecture-specific hooks into either the blocking
or the nonblocking random pools. These hooks are defined to return
the number of bytes of randomness produced (similar to a read() system
call.) They could also potentialy be used to inject randomness on
demand while continuing to use the pool system, by calling a suitable
injection interface and returning 0.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Matt Mackall <mpm@selenic.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "Theodore Ts'o" <tytso@mit.edu>
---
drivers/char/random.c | 26 ++++++++++++++++++++++++++
include/linux/random.h | 18 ++++++++++++++++++
2 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/drivers/char/random.c b/drivers/char/random.c
index d4ddeba..ca8a86c 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -416,6 +416,7 @@ struct entropy_store {
const char *name;
struct entropy_store *pull;
int limit;
+ struct get_entropy_funcs arch; /* Arch-specific shortcut */
/* read-write data: */
spinlock_t lock;
@@ -862,6 +863,15 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf,
__u8 tmp[EXTRACT_SIZE];
unsigned long flags;
+ if (r->arch.get_entropy_krnl) {
+ ret = r->arch.get_entropy_krnl(buf, nbytes);
+ buf += ret;
+ nbytes -= ret;
+ }
+
+ if (!nbytes)
+ return ret;
+
xfer_secondary_pool(r, nbytes);
nbytes = account(r, nbytes, min, reserved);
@@ -894,6 +904,15 @@ static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,
ssize_t ret = 0, i;
__u8 tmp[EXTRACT_SIZE];
+ if (r->arch.get_entropy_user) {
+ ret = r->arch.get_entropy_user(buf, nbytes);
+ buf += ret;
+ nbytes -= ret;
+ }
+
+ if (!nbytes)
+ return ret;
+
xfer_secondary_pool(r, nbytes);
nbytes = account(r, nbytes, 0, 0);
@@ -954,6 +973,11 @@ static void init_std_data(struct entropy_store *r)
r->entropy_count = 0;
spin_unlock_irqrestore(&r->lock, flags);
+ if (nonblocking_pool.arch.get_entropy_krnl) {
+ nonblocking_pool.arch.get_entropy_krnl(input_pool_data,
+ sizeof input_pool_data);
+ }
+
now = ktime_get_real();
mix_pool_bytes(r, &now, sizeof(now));
mix_pool_bytes(r, utsname(), sizeof(*(utsname())));
@@ -961,6 +985,8 @@ static void init_std_data(struct entropy_store *r)
static int rand_initialize(void)
{
+ arch_setup_random_funcs(&nonblocking_pool.arch,
+ &blocking_pool.arch);
init_std_data(&input_pool);
init_std_data(&blocking_pool);
init_std_data(&nonblocking_pool);
diff --git a/include/linux/random.h b/include/linux/random.h
index fb7ab9d..12bb392 100644
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -10,6 +10,7 @@
#include <linux/types.h>
#include <linux/ioctl.h>
#include <linux/irqnr.h>
+#include <linux/errno.h>
/* ioctl()'s for the random number generator */
@@ -75,7 +76,24 @@ extern const struct file_operations random_fops, urandom_fops;
unsigned int get_random_int(void);
unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len);
+struct get_entropy_funcs {
+ ssize_t (*get_entropy_krnl)(void *buf, size_t nbytes);
+ ssize_t (*get_entropy_user)(void __user *buf, size_t nbytes);
+};
+
+#ifdef CONFIG_ARCH_RANDOM
+void arch_setup_random_funcs(struct get_entropy_funcs *nbp,
+ struct get_entropy_funcs *bp);
+#else
+static inline void arch_setup_random_funcs(struct get_entropy_funcs *nbp,
+ struct get_entropy_funcs *bp)
+{
+ /* Nothing to do */
+}
+#endif
+
u32 random32(void);
+
void srandom32(u32 seed);
u32 prandom32(struct rnd_state *);
--
1.7.6
next prev parent reply other threads:[~2011-07-29 20:38 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-29 20:37 [RFD] Direct support for the x86 RDRAND instruction H. Peter Anvin
2011-07-29 20:37 ` H. Peter Anvin [this message]
2011-07-29 21:16 ` [PATCH 1/2] random: Add support for architectural random hooks Matt Mackall
2011-07-30 6:20 ` Linus Torvalds
2011-07-30 16:34 ` Arjan van de Ven
2011-07-30 17:45 ` Matt Mackall
2011-07-30 18:20 ` Linus Torvalds
2011-07-30 19:13 ` Matt Mackall
2011-07-30 19:29 ` Linus Torvalds
2011-07-30 22:25 ` Ted Ts'o
2011-07-31 1:13 ` Linus Torvalds
2011-07-31 1:32 ` H. Peter Anvin
2011-07-31 1:43 ` Linus Torvalds
2011-07-31 21:26 ` [PATCH v3 0/3] Add support for architectural random number generator H. Peter Anvin
2011-07-31 21:26 ` [PATCH v3 1/3] random: Add support for architectural random hooks H. Peter Anvin
2011-07-31 21:26 ` [PATCH v3 2/3] x86, random: Architectural inlines to get random integers with RDRAND H. Peter Anvin
2011-07-31 21:26 ` [PATCH v3 3/3] x86, random: Verify RDRAND functionality and allow it to be disabled H. Peter Anvin
2011-08-05 12:00 ` [PATCH v3 0/3] Add support for architectural random number generator Herbert Xu
2011-08-05 16:28 ` H. Peter Anvin
2011-08-06 0:09 ` Herbert Xu
2011-07-29 20:37 ` [PATCH 2/2] x86, random: " H. Peter Anvin
2011-07-29 21:05 ` [RFD] Direct support for the x86 RDRAND instruction Jeff Garzik
2011-07-29 21:17 ` H. Peter Anvin
2011-07-30 6:03 ` Linus Torvalds
2011-07-30 22:26 ` [PATCH v2 0/2] Add support for architectural random number generator H. Peter Anvin
2011-07-30 22:26 ` [PATCH v2 1/2] random: Add support for architectural random hooks H. Peter Anvin
2011-07-30 22:26 ` [PATCH v2 2/2] x86, random: Add support for architectural random number generator H. Peter Anvin
-- strict thread matches above, loose matches on Subject: below --
2011-07-30 23:46 [PATCH 1/2] random: Add support for architectural random hooks George Spelvin
2011-07-31 0:29 ` Linus Torvalds
2011-07-31 0:58 ` George Spelvin
2011-07-31 1:02 ` Bryan Donlan
2011-07-31 1:35 ` Linus Torvalds
2011-07-31 2:02 ` Bryan Donlan
2011-07-31 2:42 ` Henrique de Moraes Holschuh
2011-07-31 3:17 ` Bryan Donlan
2011-07-31 4:33 ` Linus Torvalds
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1311971867-25124-2-git-send-email-hpa@linux.intel.com \
--to=hpa@linux.intel.com \
--cc=fenghua.yu@intel.com \
--cc=herbert@gondor.hengli.com.au \
--cc=hpa@zytor.com \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mpm@selenic.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.