diff options
author | Mikael Hildenborg <micael@hildenborg.com> | 2025-08-04 21:50:29 +0200 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2025-08-07 13:59:52 -0400 |
commit | cac47030fb003570295582606f158609f626347f (patch) | |
tree | eac54e0117a5394d0739e5da62580c2f8b153fff /libgloss/m68k/atari/atari-getentropy.c | |
parent | 45f9b4841373321fa813625fa5a448b5f26fc34a (diff) | |
download | newlib-cac47030fb003570295582606f158609f626347f.zip newlib-cac47030fb003570295582606f158609f626347f.tar.gz newlib-cac47030fb003570295582606f158609f626347f.tar.bz2 |
Added target m68k-atari-elf supporting Atari 16/32bit TOS systems.
Diffstat (limited to 'libgloss/m68k/atari/atari-getentropy.c')
-rw-r--r-- | libgloss/m68k/atari/atari-getentropy.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libgloss/m68k/atari/atari-getentropy.c b/libgloss/m68k/atari/atari-getentropy.c new file mode 100644 index 0000000..0b5b461 --- /dev/null +++ b/libgloss/m68k/atari/atari-getentropy.c @@ -0,0 +1,52 @@ +/* + Copyright (C) 2025 Mikael Hildenborg + SPDX-License-Identifier: BSD-2-Clause +*/ + +#include <_ansi.h> +#include <_syslist.h> +#include <errno.h> +#include "atari-gem_errno.h" +#include "atari-traps.h" + +/* + Xorshift pseudorandom number generator. + https://en.wikipedia.org/wiki/Xorshift + Inited with random seed. +*/ + +int getentropy(void *buf, size_t buflen) +{ + unsigned int a; + unsigned int state[4]; + + // Init state + a = trap14_11(); // Atari Random func. + for (int i = 0; i < 4; ++i) + { + // xorshift32 + a ^= (a << 13); + a ^= (a >> 17); + a ^= (a << 5); + state[i] = a; + } + + for (size_t i = 0; i < buflen; ++i) + { + // xorshift128 + unsigned int t = state[3]; + unsigned int s = state[0]; + state[3] = state[2]; + state[2] = state[1]; + state[1] = s; + + t ^= t << 11; + t ^= t >> 7; + state[0] = t ^ s ^ (s >> 19); + + // use lowest byte (could be optimized to adapt to buf len and output whole 32 bits when possible.) + ((unsigned char*)buf)[i] = (unsigned char)state[0]; + } + + return 0; +} |