diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index f1c393f9..27fc6447 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -13,6 +13,7 @@ #define DEV_MAJOR_KEYBOARD 6 #define DEV_MAJOR_BLOCK 7 #define DEV_MAJOR_E9 8 +#define DEV_MAJOR_URANDOM 9 typedef struct { int (*open)(int minor, int flags); diff --git a/kernel-src/io/pseudodevices.c b/kernel-src/io/pseudodevices.c index c96b5132..fb1a179a 100644 --- a/kernel-src/io/pseudodevices.c +++ b/kernel-src/io/pseudodevices.c @@ -2,6 +2,7 @@ #include #include #include +#include static int null_write(int minor, void *buffer, size_t count, uintmax_t offset, int flags, size_t *wcount) { *wcount = count; @@ -23,6 +24,22 @@ static int null_read(int minor, void *buffer, size_t count, uintmax_t offset, in return 0; } +static long current = 0xdeadbeefbadc0ffe; + +static uint8_t getrand8() { + current += timekeeper_timefromboot().ns * timekeeper_timefromboot().s - timekeeper_time().ns * timekeeper_time().s + timekeeper_time().s; + return current & 0xff; +} + +static int urandom_read(int minor, void *_buffer, size_t count, uintmax_t offset, int flags, size_t *rcount) { + uint8_t *buffer = _buffer; + for (int i = 0; i < count; ++i) + buffer[i] = getrand8(); + + *rcount = count; + return 0; +} + static devops_t nullops = { .read = null_read, .write = null_write @@ -38,8 +55,14 @@ static devops_t zeroops = { .write = null_write }; +static devops_t urandomops = { + .read = urandom_read, + .write = null_write +}; + void pseudodevices_init() { __assert(devfs_register(&nullops, "null", V_TYPE_CHDEV, DEV_MAJOR_NULL, 0, 0644) == 0); __assert(devfs_register(&fullops, "full", V_TYPE_CHDEV, DEV_MAJOR_FULL, 0, 0644) == 0); __assert(devfs_register(&zeroops, "zero", V_TYPE_CHDEV, DEV_MAJOR_ZERO, 0, 0644) == 0); + __assert(devfs_register(&urandomops, "urandom", V_TYPE_CHDEV, DEV_MAJOR_URANDOM, 0, 0644) == 0); }