lkml.org 
[lkml]   [2004]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: Using get_cycles for add_timer_randomness

This sounded like a good idea at the time, any reason we cant merge
this?

Anton

On Sat, Aug 16, 2003 at 03:03:17AM +0200, Arnd Bergmann wrote:
> 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;
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 14:05    [W:0.059 / U:5.532 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site