Voxia OS
v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
rand.c
Go to the documentation of this file.
1
#include "
hal/rand/rand.h
"
2
#include "
hal/acpi/hpet.h
"
3
#include "
hal/cpu/cpuid.h
"
4
#include "
init/init.h
"
5
#include "
libk/serial.h
"
6
7
static
boolean_t
random_available
= 0;
8
9
#define RAND_MAX 0xFFFFFFFF
10
11
INIT
(Rand) {
12
uint32_t
ecx, unused;
13
cpuid
(1, 0, &unused, &unused, &ecx, &unused);
14
random_available
= (ecx >> 30) & 1;
15
LOG_INFO
(
"Rand "
,
"random is available %d"
,
random_available
);
16
}
17
18
uint32_t
vxRand
() {
19
if
(
random_available
) {
20
uint32_t
rand = 0;
21
asm
volatile
(
"rdrand %0"
:
"=r"
(rand));
22
return
rand &
RAND_MAX
;
23
}
else
if
(
vxHPETIsAvailable
()) {
24
// fallback using HPET if available
25
uint32_t
rand =
vxHPETGetMainCount
() &
RAND_MAX
;
26
return
rand;
27
}
28
return
0;
29
}
cpuid
void cpuid(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition
cpuid.c:4
cpuid.h
vxHPETIsAvailable
boolean_t vxHPETIsAvailable()
Definition
hpet.c:14
vxHPETGetMainCount
uint64_t vxHPETGetMainCount()
Definition
hpet.c:82
hpet.h
init.h
INIT
#define INIT(fn)
Definition
init.h:26
RAND_MAX
#define RAND_MAX
Definition
rand.c:9
random_available
static boolean_t random_available
Definition
rand.c:7
vxRand
uint32_t vxRand()
Definition
rand.c:18
rand.h
serial.h
LOG_INFO
#define LOG_INFO(mod, fmt,...)
Definition
serial.h:20
uint32_t
unsigned int uint32_t
Definition
type.h:19
boolean_t
uint8_t boolean_t
Definition
type.h:89
kernel
hal
rand
rand.c
Generated on Sat May 30 2026 11:09:57 for Voxia OS by
1.13.2