We will shortly use prandom_u32_state() to implement kstack offset randomization and some arches need to call it from non-instrumentable context. So let's implement prandom_u32_state() as an out-of-line wrapper around a new __always_inline prandom_u32_state_inline(). kstack offset randomization will use this new version.
Acked-by: Mark Rutland <[email protected]> Signed-off-by: Ryan Roberts <[email protected]> --- include/linux/prandom.h | 20 ++++++++++++++++++++ lib/random32.c | 8 +------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/include/linux/prandom.h b/include/linux/prandom.h index ff7dcc3fa105..801188680a29 100644 --- a/include/linux/prandom.h +++ b/include/linux/prandom.h @@ -17,6 +17,26 @@ struct rnd_state { __u32 s1, s2, s3, s4; }; +/** + * prandom_u32_state_inline - seeded pseudo-random number generator. + * @state: pointer to state structure holding seeded state. + * + * This is used for pseudo-randomness with no outside seeding. + * For more random results, use get_random_u32(). + * For use only where the out-of-line version, prandom_u32_state(), cannot be + * used (e.g. noinstr code). + */ +static __always_inline u32 prandom_u32_state_inline(struct rnd_state *state) +{ +#define TAUSWORTHE(s, a, b, c, d) ((s & c) << d) ^ (((s << a) ^ s) >> b) + state->s1 = TAUSWORTHE(state->s1, 6U, 13U, 4294967294U, 18U); + state->s2 = TAUSWORTHE(state->s2, 2U, 27U, 4294967288U, 2U); + state->s3 = TAUSWORTHE(state->s3, 13U, 21U, 4294967280U, 7U); + state->s4 = TAUSWORTHE(state->s4, 3U, 12U, 4294967168U, 13U); + + return (state->s1 ^ state->s2 ^ state->s3 ^ state->s4); +} + u32 prandom_u32_state(struct rnd_state *state); void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes); void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state); diff --git a/lib/random32.c b/lib/random32.c index 24e7acd9343f..2a02d82e91bc 100644 --- a/lib/random32.c +++ b/lib/random32.c @@ -51,13 +51,7 @@ */ u32 prandom_u32_state(struct rnd_state *state) { -#define TAUSWORTHE(s, a, b, c, d) ((s & c) << d) ^ (((s << a) ^ s) >> b) - state->s1 = TAUSWORTHE(state->s1, 6U, 13U, 4294967294U, 18U); - state->s2 = TAUSWORTHE(state->s2, 2U, 27U, 4294967288U, 2U); - state->s3 = TAUSWORTHE(state->s3, 13U, 21U, 4294967280U, 7U); - state->s4 = TAUSWORTHE(state->s4, 3U, 12U, 4294967168U, 13U); - - return (state->s1 ^ state->s2 ^ state->s3 ^ state->s4); + return prandom_u32_state_inline(state); } EXPORT_SYMBOL(prandom_u32_state); -- 2.43.0
