On Tue, Apr 19, 2022 at 01:16:43PM +0200, Jason A. Donenfeld wrote: > For situations in which we don't have a c0 counter register available, > we've been falling back to reading the c0 "random" register, which is > usually bounded by the amount of TLB entries and changes every other > cycle or so. This means it wraps extremely often. We can do better by > combining this fast-changing counter with a potentially slower-changing > counter from random_get_entropy_fallback() in the more significant bits. > This commit combines the two, taking into account that the changing bits > are in a different bit position depending on the CPU model. In addition, > we previously were falling back to 0 for ancient CPUs that Linux does > not support anyway; remove that dead path entirely. > > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Arnd Bergmann <arnd@xxxxxxxx> > Cc: Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx> > Cc: Maciej W. Rozycki <macro@xxxxxxxxxxx> > Signed-off-by: Jason A. Donenfeld <Jason@xxxxxxxxx> > --- > ThomasB - I dropped your Ack from v4, because this is pretty different > from v4 now. > > Maciej - you mentioned you had a test rig. Think you could provide a > "Tested-by" if this approach works? > > arch/mips/include/asm/timex.h | 16 +++++++--------- > 1 file changed, 7 insertions(+), 9 deletions(-) > > diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h > index b05bb70a2e46..e3f5460a923b 100644 > --- a/arch/mips/include/asm/timex.h > +++ b/arch/mips/include/asm/timex.h > @@ -80,21 +80,19 @@ static inline cycles_t get_cycles(void) > /* > * Like get_cycles - but where c0_count is not available we desperately > * use c0_random in an attempt to get at least a little bit of entropy. > - * > - * R6000 and R6000A neither have a count register nor a random register. > - * That leaves no entropy source in the CPU itself. > */ > static inline unsigned long random_get_entropy(void) > { > - unsigned int prid = read_c0_prid(); > - unsigned int imp = prid & PRID_IMP_MASK; > + unsigned int c0_random; > > - if (can_use_mips_counter(prid)) > + if (can_use_mips_counter(read_c0_prid())) > return read_c0_count(); > - else if (likely(imp != PRID_IMP_R6000 && imp != PRID_IMP_R6000A)) > - return read_c0_random(); > + > + if (cpu_has_3kex) > + c0_random = (read_c0_random() >> 8) & 0x3f; > else > - return 0; /* no usable register */ > + c0_random = read_c0_random() & 0x3f; > + return (random_get_entropy_fallback() << 6) | (0x3f - c0_random); > } > #define random_get_entropy random_get_entropy > > -- > 2.35.1 Acked-by: Thomas Bogendoerfer <tsbogend@xxxxxxxxxxxxxxxx> -- Crap can work. Given enough thrust pigs will fly, but it's not necessarily a good idea. [ RFC1925, 2.3 ]