Add functions for generating pseudo random 32 and 64 bit values. The implementation is very simple and the randomness likely not of high quality. Signed-off-by: Nina Schoetterl-Glausch <nsg@xxxxxxxxxxxxx> --- Makefile | 1 + lib/libcflat.h | 7 +++++++ lib/rand.c | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 lib/rand.c diff --git a/Makefile b/Makefile index 602910dd..7997e035 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ cflatobjs := \ lib/printf.o \ lib/string.o \ lib/abort.o \ + lib/rand.o \ lib/report.o \ lib/stack.o diff --git a/lib/libcflat.h b/lib/libcflat.h index 700f4352..ed947f98 100644 --- a/lib/libcflat.h +++ b/lib/libcflat.h @@ -83,6 +83,13 @@ extern void abort(void) __attribute__((noreturn)); extern long atol(const char *ptr); extern char *getenv(const char *name); +typedef struct { + uint32_t val; +} rand_state; +#define RAND_STATE_INIT(x) ((rand_state){ .val = (x) }) +uint32_t rand32(rand_state *state); +uint64_t rand64(rand_state *state); + extern int printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); extern int snprintf(char *buf, int size, const char *fmt, ...) diff --git a/lib/rand.c b/lib/rand.c new file mode 100644 index 00000000..658c4cbf --- /dev/null +++ b/lib/rand.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * pseudo random functions + * + * Copyright IBM Corp. 2023 + */ + +#include "libcflat.h" + +uint32_t rand32(rand_state *state) +{ + state->val = 0x915f77f5 * state->val + 1; + return state->val ^ (state->val >> 16); +} + +uint64_t rand64(rand_state *state) +{ + return (uint64_t)rand32(state) << 32 | rand32(state); +} -- 2.41.0