x86_64: generate a seed for the RNG with RDRAND when available
This commit is contained in:
10
arch/x86_64/include/kernel/machine/random.h
Normal file
10
arch/x86_64/include/kernel/machine/random.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef KERNEL_X86_64_RANDOM_H_
|
||||
#define KERNEL_X86_64_RANDOM_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern bool ml_hwrng_available(void);
|
||||
extern uint64_t ml_hwrng_generate(void);
|
||||
|
||||
#endif
|
||||
@@ -10,12 +10,14 @@
|
||||
#include <kernel/init.h>
|
||||
#include <kernel/libc/stdio.h>
|
||||
#include <kernel/machine/cpu.h>
|
||||
#include <kernel/machine/random.h>
|
||||
#include <kernel/memblock.h>
|
||||
#include <kernel/object.h>
|
||||
#include <kernel/percpu.h>
|
||||
#include <kernel/pmap.h>
|
||||
#include <kernel/printk.h>
|
||||
#include <kernel/types.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm.h>
|
||||
|
||||
#define PTR32(x) ((void *)((uintptr_t)(x)))
|
||||
@@ -123,6 +125,18 @@ int ml_init(uintptr_t arg)
|
||||
reserve_end = bsp.mod_base + bsp.mod_size;
|
||||
}
|
||||
|
||||
if (ml_hwrng_available()) {
|
||||
printk("cpu: ardware RNG available");
|
||||
uint64_t seed = ml_hwrng_generate();
|
||||
printk("cpu: RNG seed=%zx", seed);
|
||||
init_random(seed);
|
||||
} else {
|
||||
printk("cpu: hardware RNG unavailable");
|
||||
uint64_t seed = 0xeddc4c8a679dc23f;
|
||||
printk("cpu: RNG seed=%zx", seed);
|
||||
init_random(seed);
|
||||
}
|
||||
|
||||
early_vm_init(reserve_end);
|
||||
|
||||
e820_scan(PTR32(mb->mmap_addr), mb->mmap_length);
|
||||
|
||||
43
arch/x86_64/random.S
Normal file
43
arch/x86_64/random.S
Normal file
@@ -0,0 +1,43 @@
|
||||
.code64
|
||||
|
||||
.global ml_hwrng_available
|
||||
.type ml_hwrng_available, @function
|
||||
|
||||
ml_hwrng_available:
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
push %rbx
|
||||
push %rdx
|
||||
|
||||
mov $1, %eax
|
||||
mov $0, %ecx
|
||||
|
||||
cpuid
|
||||
|
||||
shr $30, %ecx
|
||||
and $1, %ecx
|
||||
mov %ecx, %eax
|
||||
|
||||
pop %rdx
|
||||
pop %rbx
|
||||
pop %rbp
|
||||
ret
|
||||
|
||||
.global ml_hwrng_generate
|
||||
.type ml_hwrng_generate, @function
|
||||
|
||||
ml_hwrng_generate:
|
||||
push %rbp
|
||||
mov %rsp, %rbp
|
||||
|
||||
mov $100, %rcx
|
||||
.retry:
|
||||
rdrand %rax
|
||||
jc .done
|
||||
loop .retry
|
||||
|
||||
.fail:
|
||||
mov $0, %rax
|
||||
.done:
|
||||
pop %rbp
|
||||
ret
|
||||
Reference in New Issue
Block a user