diff options
author | Marvin Borner | 2021-04-04 00:11:00 +0200 |
---|---|---|
committer | Marvin Borner | 2021-04-04 00:11:00 +0200 |
commit | 7a64bdbbcf14023370b90b22de73c2f61a6f84ac (patch) | |
tree | 7f26778ddcd9f7e213f70e60e04c1805c4f2572f /libs/libc/random.c | |
parent | 9127d8e4d09207d5c9d98024ca6610310a7273ad (diff) |
Implemented basic user program ASLR
Diffstat (limited to 'libs/libc/random.c')
-rw-r--r-- | libs/libc/random.c | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/libs/libc/random.c b/libs/libc/random.c index 6296407..983357f 100644 --- a/libs/libc/random.c +++ b/libs/libc/random.c @@ -15,46 +15,36 @@ void srand(u32 seed) g_seed = seed; } -u32 rdrand(void) +static u32 default_rand(void) { -#ifdef KERNEL - if (!(cpu_features.ecx & 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 + g_seed = g_seed * 1103515245 + 12345; + return (g_seed >> 16) & 0x7FFF; } -u32 rdseed(void) +u32 rand(void) { #ifdef KERNEL - if (!(cpu_extended_features.ebx & CPUID_EXT_FEAT_EBX_RDSEED)) - return rand(); - u32 rd; - __asm__ volatile("1:\n" - "rdseed %0\n" - "jnc 1b\n" - : "=r"(rd)); + if (cpu_extended_features.ebx & CPUID_EXT_FEAT_EBX_RDSEED) { + __asm__ volatile("1:\n" + "rdseed %0\n" + "jnc 1b\n" + : "=r"(rd)); + } else if (cpu_features.ecx & CPUID_FEAT_ECX_RDRND) { + __asm__ volatile("1:\n" + "rdrand %0\n" + "jnc 1b\n" + : "=r"(rd)); + } else { + rd = default_rand(); + } + return rd; #else - return rand(); + return default_rand(); #endif } -u32 rand(void) -{ - g_seed = g_seed * 1103515245 + 12345; - return (g_seed >> 16) & 0x7FFF; -} - char *randstr(u32 size) { if (!size) |