Files
serenity/Kernel/Prekernel/Random.cpp
Liav A. bd474dab14 Prekernel: Move the generate_secure_seed function out of init.cpp
As part of a commit series trying to make the prekernel nicer, we should
move and refactor functions out of the init.cpp file if possible.
2024-06-29 19:56:45 +02:00

40 lines
985 B
C++

/*
* Copyright (c) 2024, Liav A. <liavalb@hotmail.co.il>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Platform.h>
#include <Kernel/Boot/Multiboot.h>
#include <Kernel/Prekernel/Prekernel.h>
#include <Kernel/Prekernel/Random.h>
#if ARCH(X86_64)
# include <Kernel/Arch/x86_64/ASM_wrapper.h>
# include <Kernel/Arch/x86_64/CPUID.h>
#endif
u64 generate_secure_seed()
{
u32 seed = 0xFEEBDAED;
#if ARCH(X86_64)
Kernel::CPUID processor_info(0x1);
if (processor_info.edx() & (1 << 4)) // TSC
seed ^= Kernel::read_tsc();
if (processor_info.ecx() & (1 << 30)) // RDRAND
seed ^= Kernel::read_rdrand();
Kernel::CPUID extended_features(0x7);
if (extended_features.ebx() & (1 << 18)) // RDSEED
seed ^= Kernel::read_rdseed();
#else
# warning No native randomness source available for this architecture
#endif
seed ^= multiboot_info_ptr->mods_addr;
seed ^= multiboot_info_ptr->framebuffer_addr;
return seed;
}