All of lore.kernel.org
 help / color / mirror / Atom feed
* Using get_cycles for add_timer_randomness
@ 2003-08-16  1:03 Arnd Bergmann
  2004-08-10 16:24 ` Anton Blanchard
  0 siblings, 1 reply; 13+ messages in thread
From: Arnd Bergmann @ 2003-08-16  1:03 UTC (permalink / raw)
  To: linux-kernel

I noticed that only i386 and x86-64 are currently using
a high resolution timer source when adding randomness.
Since many architectures have a working get_cycles()
implementation, it seems rather straightforward to use
that.

Has this been discussed before, or can anyone comment
on the implementation below?

This patch attempts to take into account the size of
cycles_t, which is either 32 or 64 bits wide but
independent of the architecture's word size.

The behavior should be nearly identical to the
old one on i386, x86-64 and all architectures
without a time stamp counter, while finding
more entropy on the other architectures.

	Arnd <><

===== drivers/char/random.c 1.35 vs edited =====
--- 1.35/drivers/char/random.c	Wed Aug  6 19:59:31 2003
+++ edited/drivers/char/random.c	Sat Aug 16 02:05:34 2003
@@ -711,8 +711,8 @@
 
 /* There is one of these per entropy source */
 struct timer_rand_state {
-	__u32		last_time;
-	__s32		last_delta,last_delta2;
+	cycles_t	last_time;
+	long		last_delta,last_delta2;
 	int		dont_count_entropy:1;
 };
 
@@ -729,27 +729,28 @@
  * The number "num" is also added to the pool - it should somehow describe
  * the type of event which just happened.  This is currently 0-255 for
  * keyboard scan codes, and 256 upwards for interrupts.
- * On the i386, this is assumed to be at most 16 bits, and the high bits
- * are used for a high-resolution timer.
+ * This is assumed to be at most 16 bits, and the high bits are used for
+ * high-resolution timers.
  *
  */
 static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
 {
-	__u32		time;
-	__s32		delta, delta2, delta3;
+	cycles_t	time;
+	long		delta, delta2, delta3;
 	int		entropy = 0;
 
-#if defined (__i386__) || defined (__x86_64__)
-	if (cpu_has_tsc) {
-		__u32 high;
-		rdtsc(time, high);
-		num ^= high;
+	/*
+	 * Use get_cycles() if implemented, otherwise fall back to
+	 * jiffies.
+	 */
+	time = get_cycles();
+	if (time != 0) {
+		if (sizeof (time) > 4) {
+			num ^= (u32)(time >> 32);
+		}
 	} else {
 		time = jiffies;
 	}
-#else
-	time = jiffies;
-#endif
 
 	/*
 	 * Calculate number of bits of randomness we probably added.
===== include/asm-i386/timex.h 1.5 vs edited =====
--- 1.5/include/asm-i386/timex.h	Mon Jun  9 14:41:23 2003
+++ edited/include/asm-i386/timex.h	Sat Aug 16 02:17:05 2003
@@ -7,7 +7,7 @@
 #define _ASMi386_TIMEX_H
 
 #include <linux/config.h>
-#include <asm/msr.h>
+#include <asm/processor.h>
 
 #ifdef CONFIG_X86_PC9800
    extern int CLOCK_TICK_RATE;
@@ -44,14 +44,17 @@
 
 static inline cycles_t get_cycles (void)
 {
+	unsigned long long ret=0;
+
 #ifndef CONFIG_X86_TSC
-	return 0;
-#else
-	unsigned long long ret;
+	if (!cpu_has_tsc)
+		return 0;
+#endif
 
+#if defined(CONFIG_X86_GENERIC) || defined(CONFIG_X86_TSC)
 	rdtscll(ret);
-	return ret;
 #endif
+	return ret;
 }
 
 extern unsigned long cpu_khz;

^ permalink raw reply	[flat|nested] 13+ messages in thread
* RE: Using get_cycles for add_timer_randomness
@ 2004-08-16 18:53 Luck, Tony
  0 siblings, 0 replies; 13+ messages in thread
From: Luck, Tony @ 2004-08-16 18:53 UTC (permalink / raw)
  To: Andrew Morton, Anton Blanchard; +Cc: arnd, richm, tytso, linux-arch


>+		if (sizeof(time) > 4)
>+			num ^= (u32)(time >> 32);

How does this bit-flipping the low-order bits based on the high
order bits of the timer help get more randomness?  It looks to
me that it will just mess up the calculation of how much randomness
you might have added. The delta/delta2/delta3 comparisons that
are done later in the function appear to be based on the idea
that you measure the `time' between events.  High order bits in
cycle counters change at quite predicatable intervals and shouldn't
take part in this calculation.

-Tony

^ permalink raw reply	[flat|nested] 13+ messages in thread
* RE: Using get_cycles for add_timer_randomness
@ 2004-08-16 21:29 Luck, Tony
  0 siblings, 0 replies; 13+ messages in thread
From: Luck, Tony @ 2004-08-16 21:29 UTC (permalink / raw)
  To: Luck, Tony, Andrew Morton, Anton Blanchard; +Cc: arnd, richm, tytso, linux-arch

>>+		if (sizeof(time) > 4)
>>+			num ^= (u32)(time >> 32);
>
>How does this bit-flipping the low-order bits based on the high
>order bits of the timer help get more randomness?  It looks to
>me that it will just mess up the calculation of how much randomness
>you might have added. The delta/delta2/delta3 comparisons that
>are done later in the function appear to be based on the idea
>that you measure the `time' between events.  High order bits in
>cycle counters change at quite predicatable intervals and shouldn't
>take part in this calculation.

So I can't read today ... I was sure that "num" said "time" when
I wrote the above ... so disregard the part about messing up
delta calculations.  But I'm still don't see how using the high
bits of the cycle counter can be a good thing.

-Tony

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2004-08-19 18:27 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-16  1:03 Using get_cycles for add_timer_randomness Arnd Bergmann
2004-08-10 16:24 ` Anton Blanchard
2004-08-14 18:36   ` Anton Blanchard
2004-08-15 22:48     ` Andrew Morton
2004-08-15 23:46       ` Richard Mortimer
2004-08-15 23:59       ` David S. Miller
2004-08-16 16:17       ` Theodore Ts'o
2004-08-16 16:22         ` William Lee Irwin III
2004-08-16 16:44           ` Ralf Baechle
2004-08-16 16:49             ` William Lee Irwin III
2004-08-19 18:26               ` Ralf Baechle
  -- strict thread matches above, loose matches on Subject: below --
2004-08-16 18:53 Luck, Tony
2004-08-16 21:29 Luck, Tony

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.