Index: dev/rnd.c =================================================================== RCS file: /cvs/src/sys/dev/rnd.c,v retrieving revision 1.215 diff -u -p -r1.215 rnd.c --- dev/rnd.c 25 May 2020 17:52:57 -0000 1.215 +++ dev/rnd.c 25 May 2020 22:20:44 -0000 @@ -155,6 +155,18 @@ int filt_randomwrite(struct knote *, lon static void _rs_seed(u_char *, size_t); static void _rs_clearseed(const void *p, size_t s); +#ifndef cpu_rnd_cycles +static inline unsigned int +cpu_rnd_cycles(void) +{ + struct timespec ts; + + nanotime(&ts); + + return (ts.tv_nsec ^ (ts.tv_sec << 20)); +} +#endif + const struct filterops randomread_filtops = { .f_flags = FILTEROP_ISFD, .f_attach = NULL, @@ -206,16 +218,14 @@ void enqueue_randomness(u_int val) { struct rand_event *rep; - struct timespec ts; + unsigned int cycles; u_int qlen; - timespecclear(&ts); - if (timeout_initialized(&rnd_timeout)) - nanotime(&ts); + cycles = cpu_rnd_cycles(); mtx_enter(&rnd_enqlck); rep = rnd_put(); - rep->re_time += ts.tv_nsec ^ (ts.tv_sec << 20); + rep->re_time += cycles; rep->re_val += val; qlen = rnd_qlen(); mtx_leave(&rnd_enqlck); Index: arch/amd64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/cpu.h,v retrieving revision 1.135 diff -u -p -r1.135 cpu.h --- arch/amd64/include/cpu.h 28 Apr 2020 12:58:28 -0000 1.135 +++ arch/amd64/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -314,6 +314,18 @@ void cpu_unidle(struct cpu_info *); #define curpcb curcpu()->ci_curpcb +static inline unsigned int +__cpu_rnd_cycles(void) +{ + unsigned int hi, lo; + + __asm volatile("rdtsc" : "=d" (hi), "=a" (lo)); + + return (hi ^ lo); +} + +#define cpu_rnd_cycles() __cpu_rnd_cycles() + /* * Arguments to hardclock, softclock and statclock * encapsulate the previous machine state in an opaque Index: arch/alpha/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/alpha/include/cpu.h,v retrieving revision 1.61 diff -u -p -r1.61 cpu.h --- arch/alpha/include/cpu.h 24 Mar 2019 06:19:26 -0000 1.61 +++ arch/alpha/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -282,6 +282,15 @@ do { \ #define fpcurproc curcpu()->ci_fpcurproc #define curpcb curcpu()->ci_curpcb +static inline unsinged int +__cpu_rnd_cycles(void) +{ + unsigned long pcc = alpha_rpcc(); + return ((pcc >> 32) ^ pcc); +} + +#define cpu_rnd_cycles() __cpu_rnd_cycles() + /* * definitions of cpu-dependent requirements * referenced in generic code Index: arch/hppa/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/hppa/include/cpu.h,v retrieving revision 1.91 diff -u -p -r1.91 cpu.h --- arch/hppa/include/cpu.h 5 Dec 2018 10:28:21 -0000 1.91 +++ arch/hppa/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -154,6 +154,17 @@ enum hppa_cpu_type { extern enum hppa_cpu_type cpu_type; extern const char *cpu_typename; extern int cpu_hvers; + +static inline unsigned int +__cpu_rnd_cycles(void) +{ + unsigned int cycles; + + asm volatile ("mfctl %%cr16, %0" : "=r"(cycles)); + + return (cycles); +} +#define cpu_rnd_cycles() __cpu_rnd_cycles() #endif #endif Index: arch/powerpc/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/powerpc/include/cpu.h,v retrieving revision 1.66 diff -u -p -r1.66 cpu.h --- arch/powerpc/include/cpu.h 17 Mar 2020 10:14:45 -0000 1.66 +++ arch/powerpc/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -161,6 +161,19 @@ extern int ppc_nobat; void cpu_bootstrap(void); +static inline unsigned int +__cpu_rnd_cycles(void) +{ + unsigned int lo, hi; + + __asm volatile("mftbu %0" : "=r"(hi)); + __asm volatile("mftb %0" : "=r"(lo)); + + return (hi ^ lo); +} + +#define cpu_rnd_cycles() __cpu_rnd_cycles() + /* * This is used during profiling to integrate system time. */ Index: arch/powerpc64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/include/cpu.h,v retrieving revision 1.5 diff -u -p -r1.5 cpu.h --- arch/powerpc64/include/cpu.h 22 May 2020 16:27:49 -0000 1.5 +++ arch/powerpc64/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -28,7 +28,7 @@ struct cpu_info { extern struct cpu_info cpu_info_primary; -register struct cpu_info *__curcpu asm("r13"); +register struct cpu_info * const __curcpu asm("r13"); #define curcpu() __curcpu #define MAXCPUS 1 Index: arch/sparc64/include/cpu.h =================================================================== RCS file: /cvs/src/sys/arch/sparc64/include/cpu.h,v retrieving revision 1.93 diff -u -p -r1.93 cpu.h --- arch/sparc64/include/cpu.h 5 Dec 2018 10:28:21 -0000 1.93 +++ arch/sparc64/include/cpu.h 25 May 2020 22:20:44 -0000 @@ -172,7 +172,7 @@ extern struct cpu_info *cpus; #ifdef MULTIPROCESSOR -register struct cpu_info *__curcpu asm ("g7"); +register struct cpu_info * const __curcpu asm ("g7"); #define curcpu() (__curcpu->ci_self) #define cpu_number() (__curcpu->ci_cpuid) @@ -210,6 +210,15 @@ void cpu_unidle(struct cpu_info *); #define curpcb __curcpu->ci_cpcb #define fpproc __curcpu->ci_fpproc + +static inline unsigned int +__cpu_rnd_cycles(void) +{ + uint64_t cycles = tick(); + return ((cycles >> 32) ^ cycles); +} + +#define cpu_rnd_cycles __cpu_rnd_cycles() /* * On processors with multiple threads we force a thread switch.