From 05498860e8f7b1e8bb27880bc7526de026694804 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 26 Mar 2021 21:55:50 +0100 Subject: Renamed libs Cleaner and more flexible. --- libs/libc/random.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 libs/libc/random.c (limited to 'libs/libc/random.c') diff --git a/libs/libc/random.c b/libs/libc/random.c new file mode 100644 index 0000000..2801029 --- /dev/null +++ b/libs/libc/random.c @@ -0,0 +1,71 @@ +// MIT License, Copyright (c) 2020 Marvin Borner + +#include +#include +#include +#include + +static u32 g_seed = 1; + +void srand(u32 seed) +{ + g_seed = seed; +} + +u32 rdrand(void) +{ +#ifdef kernel + if (!cpu_has_cfeature(CPUID_FEAT_ECX_RDRND)) + return rand(); + + u32 rd; + __asm__ volatile("1:\n" + "rdrand %0\n" + "jnc 1b\n" + : "=r"(rd)); + return rd; +#else + return rand(); +#endif +} + +u32 rdseed(void) +{ +#ifdef kernel + if (!cpu_has_cfeature(CPUID_FEAT_ECX_RDRND)) + return rand(); + + u32 rd; + __asm__ volatile("1:\n" + "rdseed %0\n" + "jnc 1b\n" + : "=r"(rd)); + return rd; +#else + return rand(); +#endif +} + +u32 rand(void) +{ + g_seed = g_seed * 1103515245 + 12345; + return (g_seed >> 16) & 0x7FFF; +} + +char *randstr(u32 size) +{ + if (!size) + return NULL; + + char *buf = malloc(size + 1); + const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + size--; + for (u32 i = 0; i < size; i++) { + int key = rand() % (sizeof(charset) - 1); + buf[i] = charset[key]; + } + buf[size] = '\0'; + + return buf; +} -- cgit v1.2.3